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)
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);
......
......@@ -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 variables */
[CR_FD_IPCNS_VAR] = {
.fmt = FMT_FNAME_IPCNS_VAR,
.magic = IPCNS_VAR_MAGIC,
},
};
......
......@@ -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-var-%d.img"
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);
......
......@@ -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
......@@ -110,7 +110,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;
......@@ -123,7 +123,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)
......
......@@ -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);
......
......@@ -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 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;
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;
}
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