aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ipc_namespace.h1
-rw-r--r--ipc/msg.c10
-rw-r--r--ipc/namespace.c3
-rw-r--r--ipc/util.c3
4 files changed, 14 insertions, 3 deletions
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
index e4451d1da753..878d7ac286fa 100644
--- a/include/linux/ipc_namespace.h
+++ b/include/linux/ipc_namespace.h
@@ -33,6 +33,7 @@ struct ipc_namespace {
33}; 33};
34 34
35extern struct ipc_namespace init_ipc_ns; 35extern struct ipc_namespace init_ipc_ns;
36extern atomic_t nr_ipc_ns;
36 37
37#ifdef CONFIG_SYSVIPC 38#ifdef CONFIG_SYSVIPC
38#define INIT_IPC_NS(ns) .ns = &init_ipc_ns, 39#define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
diff --git a/ipc/msg.c b/ipc/msg.c
index 9e7211122e27..be8449d48a8e 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -81,24 +81,28 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it);
81/* 81/*
82 * Scale msgmni with the available lowmem size: the memory dedicated to msg 82 * Scale msgmni with the available lowmem size: the memory dedicated to msg
83 * queues should occupy at most 1/MSG_MEM_SCALE of lowmem. 83 * queues should occupy at most 1/MSG_MEM_SCALE of lowmem.
84 * This should be done staying within the (MSGMNI , IPCMNI) range. 84 * Also take into account the number of nsproxies created so far.
85 * This should be done staying within the (MSGMNI , IPCMNI/nr_ipc_ns) range.
85 */ 86 */
86static void recompute_msgmni(struct ipc_namespace *ns) 87static void recompute_msgmni(struct ipc_namespace *ns)
87{ 88{
88 struct sysinfo i; 89 struct sysinfo i;
89 unsigned long allowed; 90 unsigned long allowed;
91 int nb_ns;
90 92
91 si_meminfo(&i); 93 si_meminfo(&i);
92 allowed = (((i.totalram - i.totalhigh) / MSG_MEM_SCALE) * i.mem_unit) 94 allowed = (((i.totalram - i.totalhigh) / MSG_MEM_SCALE) * i.mem_unit)
93 / MSGMNB; 95 / MSGMNB;
96 nb_ns = atomic_read(&nr_ipc_ns);
97 allowed /= nb_ns;
94 98
95 if (allowed < MSGMNI) { 99 if (allowed < MSGMNI) {
96 ns->msg_ctlmni = MSGMNI; 100 ns->msg_ctlmni = MSGMNI;
97 goto out_callback; 101 goto out_callback;
98 } 102 }
99 103
100 if (allowed > IPCMNI) { 104 if (allowed > IPCMNI / nb_ns) {
101 ns->msg_ctlmni = IPCMNI; 105 ns->msg_ctlmni = IPCMNI / nb_ns;
102 goto out_callback; 106 goto out_callback;
103 } 107 }
104 108
diff --git a/ipc/namespace.c b/ipc/namespace.c
index 1b967655eb35..fe3c97aa99dc 100644
--- a/ipc/namespace.c
+++ b/ipc/namespace.c
@@ -20,6 +20,8 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
20 if (ns == NULL) 20 if (ns == NULL)
21 return ERR_PTR(-ENOMEM); 21 return ERR_PTR(-ENOMEM);
22 22
23 atomic_inc(&nr_ipc_ns);
24
23 sem_init_ns(ns); 25 sem_init_ns(ns);
24 msg_init_ns(ns); 26 msg_init_ns(ns);
25 shm_init_ns(ns); 27 shm_init_ns(ns);
@@ -83,4 +85,5 @@ void free_ipc_ns(struct kref *kref)
83 msg_exit_ns(ns); 85 msg_exit_ns(ns);
84 shm_exit_ns(ns); 86 shm_exit_ns(ns);
85 kfree(ns); 87 kfree(ns);
88 atomic_dec(&nr_ipc_ns);
86} 89}
diff --git a/ipc/util.c b/ipc/util.c
index cb017c7b9370..c27f0e92f489 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -52,6 +52,9 @@ struct ipc_namespace init_ipc_ns = {
52 }, 52 },
53}; 53};
54 54
55atomic_t nr_ipc_ns = ATOMIC_INIT(1);
56
57
55/** 58/**
56 * ipc_init - initialise IPC subsystem 59 * ipc_init - initialise IPC subsystem
57 * 60 *