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

Kir Kolyshkin kir at openvz.org
Tue Feb 7 14:41:46 EST 2012


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



More information about the CRIU mailing list