Commit f960e432 authored by Pavel Tikhomirov's avatar Pavel Tikhomirov Committed by Pavel Emelyanov

ipc/sysctl: c/r kernel.{msg_next_id,sem_next_id,shm_next_id}

These are only three left in ipc_kern_table which we haven't
checkpointed yet, I'm not sure if somebody really uses them
except criu, but to be consistent, beter not to change them
while c/r.

v3: do one sysctl_op for all xxx_next_id(as sysctl_op is quiet slow)
v4: do only one sysctl_op in ipc_sysctl_req
v5: do msg*_default only if have /proc/sys/fs/mqueue same as other
ones from fs/mqueue
Signed-off-by: 's avatarPavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent df81b884
...@@ -291,6 +291,8 @@ static void pr_info_ipc_shm(const IpcShmEntry *shm) ...@@ -291,6 +291,8 @@ static void pr_info_ipc_shm(const IpcShmEntry *shm)
print_on_level(LOG_INFO, "size: %-10"PRIu64"\n", shm->size); print_on_level(LOG_INFO, "size: %-10"PRIu64"\n", shm->size);
} }
#define NR_MANDATORY_IPC_SYSCTLS 9
static int ipc_sysctl_req(IpcVarEntry *e, int op) static int ipc_sysctl_req(IpcVarEntry *e, int op)
{ {
struct sysctl_req req[] = { struct sysctl_req req[] = {
...@@ -303,29 +305,37 @@ static int ipc_sysctl_req(IpcVarEntry *e, int op) ...@@ -303,29 +305,37 @@ static int ipc_sysctl_req(IpcVarEntry *e, int op)
{ "kernel/shmall", &e->shm_ctlall, CTL_U64 }, { "kernel/shmall", &e->shm_ctlall, CTL_U64 },
{ "kernel/shmmni", &e->shm_ctlmni, CTL_U32 }, { "kernel/shmmni", &e->shm_ctlmni, CTL_U32 },
{ "kernel/shm_rmid_forced", &e->shm_rmid_forced, CTL_U32 }, { "kernel/shm_rmid_forced", &e->shm_rmid_forced, CTL_U32 },
}; /* We have 9 mandatory sysctls above and 8 optional below */
struct sysctl_req req_mq[] = {
{ "fs/mqueue/queues_max", &e->mq_queues_max, CTL_U32 }, { "fs/mqueue/queues_max", &e->mq_queues_max, CTL_U32 },
{ "fs/mqueue/msg_max", &e->mq_msg_max, CTL_U32 }, { "fs/mqueue/msg_max", &e->mq_msg_max, CTL_U32 },
{ "fs/mqueue/msgsize_max", &e->mq_msgsize_max, CTL_U32 }, { "fs/mqueue/msgsize_max", &e->mq_msgsize_max, CTL_U32 },
{ "fs/mqueue/msg_default", &e->mq_msg_default, CTL_U32 }, { "fs/mqueue/msg_default", &e->mq_msg_default, CTL_U32 },
{ "fs/mqueue/msgsize_default", &e->mq_msgsize_default, CTL_U32 }, { "fs/mqueue/msgsize_default", &e->mq_msgsize_default, CTL_U32 },
{ "kernel/msg_next_id", &e->msg_next_id, CTL_U32 },
{ "kernel/sem_next_id", &e->sem_next_id, CTL_U32 },
{ "kernel/shm_next_id", &e->shm_next_id, CTL_U32 },
}; };
int ret; int nr = NR_MANDATORY_IPC_SYSCTLS;
ret = sysctl_op(req, ARRAY_SIZE(req), op, CLONE_NEWIPC);
if (ret)
return ret;
if (access("/proc/sys/fs/mqueue", X_OK)) { /* Skip sysctls which can't be set or haven't existed on dump */
if (access("/proc/sys/fs/mqueue", X_OK))
pr_info("Mqueue sysctls are missing\n"); pr_info("Mqueue sysctls are missing\n");
return 0; else {
nr += 3;
if (e->has_mq_msg_default) {
req[nr++] = req[12];
req[nr++] = req[13];
}
} }
if (e->has_msg_next_id)
req[nr++] = req[14];
if (e->has_sem_next_id)
req[nr++] = req[15];
if (e->has_shm_next_id)
req[nr++] = req[16];
return sysctl_op(req_mq, ARRAY_SIZE(req_mq) - (e->has_mq_msg_default ? 0 : 2), return sysctl_op(req, nr, op, CLONE_NEWIPC);
op, CLONE_NEWIPC);
} }
/* /*
...@@ -421,6 +431,9 @@ static int dump_ipc_var(struct cr_img *img) ...@@ -421,6 +431,9 @@ static int dump_ipc_var(struct cr_img *img)
goto err; goto err;
var.has_mq_msg_default = true; var.has_mq_msg_default = true;
var.has_mq_msgsize_default = true; var.has_mq_msgsize_default = true;
var.has_msg_next_id = true;
var.has_sem_next_id = true;
var.has_shm_next_id = true;
ret = ipc_sysctl_req(&var, CTL_READ); ret = ipc_sysctl_req(&var, CTL_READ);
if (ret < 0) { if (ret < 0) {
...@@ -428,6 +441,17 @@ static int dump_ipc_var(struct cr_img *img) ...@@ -428,6 +441,17 @@ static int dump_ipc_var(struct cr_img *img)
goto err; goto err;
} }
/*
* One can not write to msg_next_xxx sysctls -1,
* which is their initial value
*/
if (var.msg_next_id == -1)
var.has_msg_next_id = false;
if (var.sem_next_id == -1)
var.has_sem_next_id = false;
if (var.shm_next_id == -1)
var.has_shm_next_id = false;
ret = pb_write_one(img, &var, PB_IPC_VAR); ret = pb_write_one(img, &var, PB_IPC_VAR);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to write IPC variables\n"); pr_err("Failed to write IPC variables\n");
......
...@@ -15,4 +15,7 @@ message ipc_var_entry { ...@@ -15,4 +15,7 @@ message ipc_var_entry {
required uint32 mq_msgsize_max = 12; required uint32 mq_msgsize_max = 12;
optional uint32 mq_msg_default = 13; optional uint32 mq_msg_default = 13;
optional uint32 mq_msgsize_default = 14; optional uint32 mq_msgsize_default = 14;
optional uint32 msg_next_id = 15;
optional uint32 sem_next_id = 16;
optional uint32 shm_next_id = 17;
} }
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