Commit 530f9d90 authored by Kinsbursky Stanislav's avatar Kinsbursky Stanislav Committed by Cyrill Gorcunov

IPC: collect and dump tunables sequentially

This patch removes collect stage and dumps tunables object right after
collect.
Signed-off-by: 's avatarStanislav Kinsbursky <skinsbursky@parallels.com>
Acked-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 0998335d
...@@ -514,8 +514,8 @@ static int cr_parse_file(struct cr_options *opts) ...@@ -514,8 +514,8 @@ static int cr_parse_file(struct cr_options *opts)
case CREDS_MAGIC: case CREDS_MAGIC:
show_creds(fd); show_creds(fd);
break; break;
case IPCNS_MAGIC: case IPCNS_VAR_MAGIC:
show_ipc_ns(fd); show_ipc_var(fd);
break; break;
default: default:
pr_err("Unknown magic %x on %s\n", magic, opts->show_dump_file); pr_err("Unknown magic %x on %s\n", magic, opts->show_dump_file);
......
...@@ -111,10 +111,10 @@ struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = { ...@@ -111,10 +111,10 @@ struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = {
.magic = UTSNS_MAGIC, .magic = UTSNS_MAGIC,
}, },
/* IPC namespace */ /* IPC namespace variables */
[CR_FD_IPCNS] = { [CR_FD_IPCNS_VAR] = {
.fmt = FMT_FNAME_IPCNS, .fmt = FMT_FNAME_IPCNS_VAR,
.magic = IPCNS_MAGIC, .magic = IPCNS_VAR_MAGIC,
}, },
}; };
......
...@@ -37,7 +37,7 @@ enum { ...@@ -37,7 +37,7 @@ enum {
CR_FD_PSTREE, CR_FD_PSTREE,
CR_FD_UTSNS, CR_FD_UTSNS,
CR_FD_IPCNS, CR_FD_IPCNS_VAR,
CR_FD_MAX CR_FD_MAX
}; };
...@@ -79,7 +79,7 @@ extern struct cr_fd_desc_tmpl fdset_template[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_ITIMERS "itimers-%d.img"
#define FMT_FNAME_CREDS "creds-%d.img" #define FMT_FNAME_CREDS "creds-%d.img"
#define FMT_FNAME_UTSNS "utsns-%d.img" #define FMT_FNAME_UTSNS "utsns-%d.img"
#define FMT_FNAME_IPCNS "ipcns-%d.img" #define FMT_FNAME_IPCNS_VAR "ipcns-var-%d.img"
extern int get_image_path(char *path, int size, const char *fmt, int pid); extern int get_image_path(char *path, int size, const char *fmt, int pid);
...@@ -111,7 +111,7 @@ struct cr_fdset { ...@@ -111,7 +111,7 @@ struct cr_fdset {
CR_FD_DESC_USE(CR_FD_CREDS) ) CR_FD_DESC_USE(CR_FD_CREDS) )
#define CR_FD_DESC_NS (\ #define CR_FD_DESC_NS (\
CR_FD_DESC_USE(CR_FD_UTSNS) |\ 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) #define CR_FD_DESC_NONE (0)
int cr_dump_tasks(pid_t pid, struct cr_options *opts); int cr_dump_tasks(pid_t pid, struct cr_options *opts);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#define ITIMERS_MAGIC 0x57464056 /* Kostroma */ #define ITIMERS_MAGIC 0x57464056 /* Kostroma */
#define UTSNS_MAGIC 0x54473203 /* Smolensk */ #define UTSNS_MAGIC 0x54473203 /* Smolensk */
#define CREDS_MAGIC 0x54023547 /* Kozelsk */ #define CREDS_MAGIC 0x54023547 /* Kozelsk */
#define IPCNS_MAGIC 0x53115007 /* Samara */ #define IPCNS_VAR_MAGIC 0x53115007 /* Samara */
#define PIPEFS_MAGIC 0x50495045 #define PIPEFS_MAGIC 0x50495045
...@@ -110,7 +110,7 @@ struct vma_entry { ...@@ -110,7 +110,7 @@ struct vma_entry {
s64 fd; s64 fd;
} __packed; } __packed;
struct ipc_ns_entry { struct ipc_var_entry {
u32 sem_ctls[4]; u32 sem_ctls[4];
u32 msg_ctlmax; u32 msg_ctlmax;
u32 msg_ctlmnb; u32 msg_ctlmnb;
...@@ -123,7 +123,6 @@ struct ipc_ns_entry { ...@@ -123,7 +123,6 @@ struct ipc_ns_entry {
u32 mq_queues_max; u32 mq_queues_max;
u32 mq_msg_max; u32 mq_msg_max;
u32 mq_msgsize_max; u32 mq_msgsize_max;
u32 in_use[3];
} __packed; } __packed;
#define VMA_AREA_NONE (0 << 0) #define VMA_AREA_NONE (0 << 0)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include "crtools.h" #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 dump_ipc_ns(int ns_pid, struct cr_fdset *fdset);
extern int prepare_ipc_ns(int pid); extern int prepare_ipc_ns(int pid);
......
...@@ -13,15 +13,7 @@ ...@@ -13,15 +13,7 @@
#include "namespaces.h" #include "namespaces.h"
#include "sysctl.h" #include "sysctl.h"
struct ipc_ns_data { static int ipc_sysctl_req(struct ipc_var_entry *e, int op)
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)
{ {
struct sysctl_req req[] = { struct sysctl_req req[] = {
{ "kernel/sem", e->sem_ctls, CTL_U32A(4) }, { "kernel/sem", e->sem_ctls, CTL_U32A(4) },
...@@ -42,7 +34,7 @@ static int ipc_sysctl_req(struct ipc_ns_entry *e, int op) ...@@ -42,7 +34,7 @@ static int ipc_sysctl_req(struct ipc_ns_entry *e, int op)
return sysctl_op(req, op); return sysctl_op(req, op);
} }
static int collect_ipc_msg(void *data) static int dump_ipc_msg(void *data)
{ {
struct msginfo info; struct msginfo info;
int ret; int ret;
...@@ -62,7 +54,7 @@ static int collect_ipc_msg(void *data) ...@@ -62,7 +54,7 @@ static int collect_ipc_msg(void *data)
return 0; return 0;
} }
static int collect_ipc_sem(void *data) static int dump_ipc_sem(void *data)
{ {
int ret; int ret;
struct seminfo info; struct seminfo info;
...@@ -79,7 +71,7 @@ static int collect_ipc_sem(void *data) ...@@ -79,7 +71,7 @@ static int collect_ipc_sem(void *data)
return 0; return 0;
} }
static int collect_ipc_shm(void *data) static int dump_ipc_shm(void *data)
{ {
int fd; int fd;
int ret; int ret;
...@@ -97,60 +89,53 @@ static int collect_ipc_shm(void *data) ...@@ -97,60 +89,53 @@ static int collect_ipc_shm(void *data)
return 0; 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 variables\n");
return ret;
}
ret = write_img(fd, &var);
if (ret < 0) {
pr_err("Failed to write IPC variables\n");
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; int ret;
struct ipc_ns_entry *entry = &ipc->entry;
entry->in_use[IPC_MSG_IDS] = ret = collect_ipc_msg(NULL); ret = dump_ipc_var(fdset->fds[CR_FD_IPCNS_VAR]);
if (ret < 0) if (ret < 0)
return ret; return ret;
entry->in_use[IPC_SEM_IDS] = ret = collect_ipc_sem(NULL); ret = dump_ipc_shm(0);
if (ret < 0) if (ret < 0)
return ret; return ret;
entry->in_use[IPC_SHM_IDS] = ret = collect_ipc_shm(NULL); ret = dump_ipc_msg(0);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = collect_ipc_tun(entry); ret = dump_ipc_sem(0);
if (ret < 0) if (ret < 0)
return ret; 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; return 0;
} }
int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset) int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset)
{ {
int fd, ret; int fd, ret;
struct ipc_ns_data ipc;
ret = switch_ns(ns_pid, CLONE_NEWIPC, "ipc"); ret = switch_ns(ns_pid, CLONE_NEWIPC, "ipc");
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = collect_ipc_data(&ipc); ret = dump_ipc_data(fdset);
if (ret < 0) {
pr_err("Failed to collect IPC namespace data\n");
return ret;
}
ret = dump_ipc_data(fdset->fds[CR_FD_IPCNS], &ipc);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to write IPC namespace data\n"); pr_err("Failed to write IPC namespace data\n");
return ret; return ret;
...@@ -158,59 +143,55 @@ int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset) ...@@ -158,59 +143,55 @@ int dump_ipc_ns(int ns_pid, struct cr_fdset *fdset)
return 0; 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); ipc_sysctl_req(entry, CTL_PRINT);
} }
static void show_ipc_data(int fd) static void show_ipc_var_entry(int fd)
{ {
int ret; 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) if (ret <= 0)
return; 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); pr_img_head(CR_FD_IPCNS);
show_ipc_data(fd); show_ipc_var_entry(fd);
pr_img_tail(CR_FD_IPCNS); 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) pr_info("Restoring IPC variables\n");
{ fd = open_image_ro(CR_FD_IPCNS_VAR, pid);
int ret; if (fd < 0)
struct ipc_ns_data ipc; return -1;
ret = read_img(fd, &ipc); ret = read_img(fd, &var);
if (ret <= 0) if (ret <= 0)
return -EFAULT; return -EFAULT;
ret = prepare_ipc_tun(&ipc.entry);
if (ret < 0) show_var_entry(&var);
return ret;
return 0; return ipc_sysctl_req(&var, CTL_WRITE);
} }
int prepare_ipc_ns(int pid) int prepare_ipc_ns(int pid)
{ {
int fd, ret; int ret;
fd = open_image_ro(CR_FD_IPCNS, pid);
if (fd < 0)
return -1;
ret = prepare_ipc_data(fd);
close(fd); pr_info("Restoring IPC namespace\n");
ret = prepare_ipc_var(pid);
if (ret < 0)
return ret; return ret;
return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment