[CRIU] [PATCH v3] IPC: collect and dump tunables sequentially

Kinsbursky Stanislav skinsbursky at openvz.org
Wed Feb 8 03:54:49 EST 2012


Kir, thanks. Will clean all that shit pieces.

07.02.2012 23:41, Kir Kolyshkin пишет:
> On 02/07/2012 09:42 PM, Kinsbursky Stanislav wrote:
>> v3: cosmetic changes
>>
>> v2: "TUN/tun" replaces by "VAR/var" respectively.
>>
>> This patch removes collect stage and dumps tunables object right after
>> collect.
>>
>> Signed-off-by: Stanislav Kinsbursky<skinsbursky at parallels.com>
>>
>> ---
>>    cr-show.c         |    4 +-
>>    crtools.c         |    8 ++-
>>    include/crtools.h |    6 +--
>>    include/image.h   |    5 +-
>>    include/ipc_ns.h  |    2 -
>>    ipc_ns.c          |  123 ++++++++++++++++++++++-------------------------------
>>    6 files changed, 64 insertions(+), 84 deletions(-)
>>
>> diff --git a/cr-show.c b/cr-show.c
>> index 6855b50..33e60b8 100644
>> --- a/cr-show.c
>> +++ b/cr-show.c
>> @@ -514,8 +514,8 @@ static int cr_parse_file(struct cr_options *opts)
>>    	case CREDS_MAGIC:
>>    		show_creds(fd);
>>    		break;
>> -	case IPCNS_MAGIC:
>> -		show_ipc_ns(fd);
>> +	case IPCNS_VAR_MAGIC:
>> +		show_ipc_var(fd);
>>    		break;
>>    	default:
>>    		pr_err("Unknown magic %x on %s\n", magic, opts->show_dump_file);
>> diff --git a/crtools.c b/crtools.c
>> index 5431443..e814cdf 100644
>> --- a/crtools.c
>> +++ b/crtools.c
>> @@ -111,10 +111,10 @@ struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = {
>>    		.magic	= UTSNS_MAGIC,
>>    	},
>>
>> -	/* IPC namespace */
>> -	[CR_FD_IPCNS] = {
>> -		.fmt	= FMT_FNAME_IPCNS,
>> -		.magic	= IPCNS_MAGIC,
>> +	/* IPC namespace tunables */
> Perhaps s/tunables/variables/
>> +	[CR_FD_IPCNS_VAR] = {
>> +		.fmt	= FMT_FNAME_IPCNS_VAR,
>> +		.magic	= IPCNS_VAR_MAGIC,
>>    	},
>>    };
>>
>> diff --git a/include/crtools.h b/include/crtools.h
>> index 5a3c570..b30f915 100644
>> --- a/include/crtools.h
>> +++ b/include/crtools.h
>> @@ -37,7 +37,7 @@ enum {
>>
>>    	CR_FD_PSTREE,
>>    	CR_FD_UTSNS,
>> -	CR_FD_IPCNS,
>> +	CR_FD_IPCNS_VAR,
>>
>>    	CR_FD_MAX
>>    };
>> @@ -79,7 +79,7 @@ extern struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX];
>>    #define FMT_FNAME_ITIMERS	"itimers-%d.img"
>>    #define FMT_FNAME_CREDS		"creds-%d.img"
>>    #define FMT_FNAME_UTSNS		"utsns-%d.img"
>> -#define FMT_FNAME_IPCNS		"ipcns-%d.img"
>> +#define FMT_FNAME_IPCNS_VAR	"ipcns-adj-%d.img"
> I guess s/-adj-/-var-/
>>    extern int get_image_path(char *path, int size, const char *fmt, int pid);
>>
>> @@ -111,7 +111,7 @@ struct cr_fdset {
>>    	CR_FD_DESC_USE(CR_FD_CREDS)		)
>>    #define CR_FD_DESC_NS				(\
>>    	CR_FD_DESC_USE(CR_FD_UTSNS)		|\
>> -	CR_FD_DESC_USE(CR_FD_IPCNS)		)
>> +	CR_FD_DESC_USE(CR_FD_IPCNS_VAR)		)
>>    #define CR_FD_DESC_NONE			(0)
>>
>>    int cr_dump_tasks(pid_t pid, struct cr_options *opts);
>> diff --git a/include/image.h b/include/image.h
>> index 58b13fc..ca2a178 100644
>> --- a/include/image.h
>> +++ b/include/image.h
>> @@ -21,7 +21,7 @@
>>    #define ITIMERS_MAGIC	0x57464056 /* Kostroma */
>>    #define UTSNS_MAGIC	0x54473203 /* Smolensk */
>>    #define CREDS_MAGIC	0x54023547 /* Kozelsk */
>> -#define IPCNS_MAGIC	0x53115007 /* Samara */
>> +#define IPCNS_VAR_MAGIC	0x53115007 /* Samara */
>>
>>    #define PIPEFS_MAGIC	0x50495045
>>
>> @@ -105,7 +105,7 @@ struct vma_entry {
>>    	s64	fd;
>>    } __packed;
>>
>> -struct ipc_ns_entry {
>> +struct ipc_var_entry {
>>    	u32	sem_ctls[4];
>>    	u32	msg_ctlmax;
>>    	u32	msg_ctlmnb;
>> @@ -118,7 +118,6 @@ struct ipc_ns_entry {
>>    	u32	mq_queues_max;
>>    	u32	mq_msg_max;
>>    	u32	mq_msgsize_max;
>> -	u32	in_use[3];
>>    } __packed;
>>
>>    #define VMA_AREA_NONE		(0<<    0)
>> diff --git a/include/ipc_ns.h b/include/ipc_ns.h
>> index 138b586..60fc1a2 100644
>> --- a/include/ipc_ns.h
>> +++ b/include/ipc_ns.h
>> @@ -3,7 +3,7 @@
>>
>>    #include "crtools.h"
>>
>> -extern void show_ipc_ns(int fd);
>> +extern void show_ipc_var(int fd);
>>    extern int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset);
>>    extern int prepare_ipc_ns(int pid);
>>
>> diff --git a/ipc_ns.c b/ipc_ns.c
>> index 3336d8c..fe41e58 100644
>> --- a/ipc_ns.c
>> +++ b/ipc_ns.c
>> @@ -13,15 +13,7 @@
>>    #include "namespaces.h"
>>    #include "sysctl.h"
>>
>> -struct ipc_ns_data {
>> -	struct ipc_ns_entry entry;
>> -};
>> -
>> -#define IPC_SEM_IDS		0
>> -#define IPC_MSG_IDS		1
>> -#define IPC_SHM_IDS		2
>> -
>> -static int ipc_sysctl_req(struct ipc_ns_entry *e, int op)
>> +static int ipc_sysctl_req(struct ipc_var_entry *e, int op)
>>    {
>>    	struct sysctl_req req[] = {
>>    		{ "kernel/sem",			e->sem_ctls,		CTL_U32A(4) },
>> @@ -42,7 +34,7 @@ static int ipc_sysctl_req(struct ipc_ns_entry *e, int op)
>>    	return sysctl_op(req, op);
>>    }
>>
>> -static int collect_ipc_msg(void *data)
>> +static int dump_ipc_msg(void *data)
>>    {
>>    	struct msginfo info;
>>    	int ret;
>> @@ -62,7 +54,7 @@ static int collect_ipc_msg(void *data)
>>    	return 0;
>>    }
>>
>> -static int collect_ipc_sem(void *data)
>> +static int dump_ipc_sem(void *data)
>>    {
>>    	int ret;
>>    	struct seminfo info;
>> @@ -79,7 +71,7 @@ static int collect_ipc_sem(void *data)
>>    	return 0;
>>    }
>>
>> -static int collect_ipc_shm(void *data)
>> +static int dump_ipc_shm(void *data)
>>    {
>>    	int fd;
>>    	int ret;
>> @@ -97,60 +89,53 @@ static int collect_ipc_shm(void *data)
>>    	return 0;
>>    }
>>
>> -static int collect_ipc_tun(struct ipc_ns_entry *e)
>> +static int dump_ipc_var(int fd)
>>    {
>> -	return ipc_sysctl_req(e, CTL_READ);
>> +	int ret;
>> +	struct ipc_var_entry var;
>> +
>> +	ret = ipc_sysctl_req(&var, CTL_READ);
>> +	if (ret<   0) {
>> +		pr_err("Failed to read IPC varables\n");
> s/varables/variables/
>> +		return ret;
>> +	}
>> +
>> +	ret = write_img(fd,&var);
>> +	if (ret<   0) {
>> +		pr_err("Failed to write IPC varables\n");
> ditto
>> +		return ret;
>> +	}
>> +	return 0;
>>    }
>>
>> -static int collect_ipc_data(struct ipc_ns_data *ipc)
>> +static int dump_ipc_data(struct cr_fdset *fdset)
>>    {
>> -	int fd, ret;
>> -	struct ipc_ns_entry *entry =&ipc->entry;
>> +	int ret;
>>
>> -	entry->in_use[IPC_MSG_IDS] = ret = collect_ipc_msg(NULL);
>> +	ret = dump_ipc_var(fdset->fds[CR_FD_IPCNS_VAR]);
>>    	if (ret<   0)
>>    		return ret;
>> -	entry->in_use[IPC_SEM_IDS] = ret = collect_ipc_sem(NULL);
>> +	ret = dump_ipc_shm(0);
>>    	if (ret<   0)
>>    		return ret;
>> -	entry->in_use[IPC_SHM_IDS] = ret = collect_ipc_shm(NULL);
>> +	ret = dump_ipc_msg(0);
>>    	if (ret<   0)
>>    		return ret;
>> -	ret = collect_ipc_tun(entry);
>> +	ret = dump_ipc_sem(0);
>>    	if (ret<   0)
>>    		return ret;
>> -
>> -	return 0;
>> -}
>> -
>> -static int dump_ipc_data(int fd, struct ipc_ns_data *ipc)
>> -{
>> -	int err;
>> -
>> -	err = write_img(fd,&ipc->entry);
>> -	if (err<   0) {
>> -		pr_err("Failed to write IPC namespace entry\n");
>> -		return err;
>> -	}
>>    	return 0;
>>    }
>>
>>    int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset)
>>    {
>>    	int fd, ret;
>> -	struct ipc_ns_data ipc;
>>
>>    	ret = switch_ns(ns_pid, CLONE_NEWIPC, "ipc");
>>    	if (ret<   0)
>>    		return ret;
>>
>> -	ret = collect_ipc_data(&ipc);
>> -	if (ret<   0) {
>> -		pr_err("Failed to collect IPC namespace data\n");
>> -		return ret;
>> -	}
>> -
>> -	ret = dump_ipc_data(fdset->fds[CR_FD_IPCNS],&ipc);
>> +	ret = dump_ipc_data(fdset);
>>    	if (ret<   0) {
>>    		pr_err("Failed to write IPC namespace data\n");
>>    		return ret;
>> @@ -158,59 +143,55 @@ int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset)
>>    	return 0;
>>    }
>>
>> -static void show_ipc_entry(struct ipc_ns_entry *entry)
>> +static void show_var_entry(struct ipc_var_entry *entry)
>>    {
>>    	ipc_sysctl_req(entry, CTL_PRINT);
>>    }
>>
>> -static void show_ipc_data(int fd)
>> +static void show_ipc_var_entry(int fd)
>>    {
>>    	int ret;
>> -	struct ipc_ns_entry entry;
>> +	struct ipc_var_entry var;
>>
>> -	ret = read_img_eof(fd,&entry);
>> +	ret = read_img_eof(fd,&var);
>>    	if (ret<= 0)
>>    		return;
>> -	show_ipc_entry(&entry);
>> +	show_var_entry(&var);
>>    }
>>
>> -void show_ipc_ns(int fd)
>> +void show_ipc_var(int fd)
>>    {
>>    	pr_img_head(CR_FD_IPCNS);
>> -	show_ipc_data(fd);
>> +	show_ipc_var_entry(fd);
>>    	pr_img_tail(CR_FD_IPCNS);
>>    }
>>
>> -static int prepare_ipc_tun(struct ipc_ns_entry *e)
>> +static int prepare_ipc_var(int pid)
>>    {
>> -	return ipc_sysctl_req(e, CTL_WRITE);
>> -}
>> +	int fd, ret;
>> +	struct ipc_var_entry var;
>>
>> -static int prepare_ipc_data(int fd)
>> -{
>> -	int ret;
>> -	struct ipc_ns_data ipc;
>> +	pr_info("Restoring IPC variables\n");
>> +	fd = open_image_ro(CR_FD_IPCNS_VAR, pid);
>> +	if (fd<   0)
>> +		return -1;
>>
>> -	ret = read_img(fd,&ipc);
>> +	ret = read_img(fd,&var);
>>    	if (ret<= 0)
>>    		return -EFAULT;
>> -	ret = prepare_ipc_tun(&ipc.entry);
>> -	if (ret<   0)
>> -		return ret;
>> -	return 0;
>> +
>> +	show_var_entry(&var);
>> +
>> +	return ipc_sysctl_req(&var, CTL_WRITE);
>>    }
>>
>>    int prepare_ipc_ns(int pid)
>>    {
>> -	int fd, ret;
>> -
>> -	fd = open_image_ro(CR_FD_IPCNS, pid);
>> -	if (fd<   0)
>> -		return -1;
>> -
>> -	ret = prepare_ipc_data(fd);
>> +	int ret;
>>
>> -	close(fd);
>> -	return ret;
>> +	pr_info("Restoring IPC namespace\n");
>> +	ret = prepare_ipc_var(pid);
>> +	if (ret<   0)
>> +		return ret;
>> +	return 0;
>>    }
>> -
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://openvz.org/mailman/listinfo/criu


-- 
Best regards,
Stanislav Kinsbursky




More information about the CRIU mailing list