[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