Skip to content

Commit

Permalink
ipc: scale msgmni to the number of ipc namespaces
Browse files Browse the repository at this point in the history
Since all the namespaces see the same amount of memory (the total one) this
patch introduces a new variable that counts the ipc namespaces and divides
msg_ctlmni by this counter.

Signed-off-by: Nadia Derbey <[email protected]>
Cc: Yasunori Goto <[email protected]>
Cc: Matt Helsley <[email protected]>
Cc: Mingming Cao <[email protected]>
Cc: Pierre Peiffer <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Nadia Derbey authored and torvalds committed Apr 29, 2008
1 parent f7bf3df commit 4d89dc6
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/linux/ipc_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ struct ipc_namespace {
};

extern struct ipc_namespace init_ipc_ns;
extern atomic_t nr_ipc_ns;

#ifdef CONFIG_SYSVIPC
#define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
Expand Down
10 changes: 7 additions & 3 deletions ipc/msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,24 +81,28 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it);
/*
* Scale msgmni with the available lowmem size: the memory dedicated to msg
* queues should occupy at most 1/MSG_MEM_SCALE of lowmem.
* This should be done staying within the (MSGMNI , IPCMNI) range.
* Also take into account the number of nsproxies created so far.
* This should be done staying within the (MSGMNI , IPCMNI/nr_ipc_ns) range.
*/
static void recompute_msgmni(struct ipc_namespace *ns)
{
struct sysinfo i;
unsigned long allowed;
int nb_ns;

si_meminfo(&i);
allowed = (((i.totalram - i.totalhigh) / MSG_MEM_SCALE) * i.mem_unit)
/ MSGMNB;
nb_ns = atomic_read(&nr_ipc_ns);
allowed /= nb_ns;

if (allowed < MSGMNI) {
ns->msg_ctlmni = MSGMNI;
goto out_callback;
}

if (allowed > IPCMNI) {
ns->msg_ctlmni = IPCMNI;
if (allowed > IPCMNI / nb_ns) {
ns->msg_ctlmni = IPCMNI / nb_ns;
goto out_callback;
}

Expand Down
3 changes: 3 additions & 0 deletions ipc/namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
if (ns == NULL)
return ERR_PTR(-ENOMEM);

atomic_inc(&nr_ipc_ns);

sem_init_ns(ns);
msg_init_ns(ns);
shm_init_ns(ns);
Expand Down Expand Up @@ -83,4 +85,5 @@ void free_ipc_ns(struct kref *kref)
msg_exit_ns(ns);
shm_exit_ns(ns);
kfree(ns);
atomic_dec(&nr_ipc_ns);
}
3 changes: 3 additions & 0 deletions ipc/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ struct ipc_namespace init_ipc_ns = {
},
};

atomic_t nr_ipc_ns = ATOMIC_INIT(1);


/**
* ipc_init - initialise IPC subsystem
*
Expand Down

0 comments on commit 4d89dc6

Please sign in to comment.