diff options
Diffstat (limited to 'ipc/msg.c')
-rw-r--r-- | ipc/msg.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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 | */ |
86 | static void recompute_msgmni(struct ipc_namespace *ns) | 87 | static 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 | ||