diff options
author | Nadia Derbey <Nadia.Derbey@bull.net> | 2008-04-29 04:00:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:12 -0400 |
commit | b6b337ad1c1d6fe11b09b35d75464b84b3e11f07 (patch) | |
tree | df174a23a827cc43db76900d1ddbbef3ac9ddc90 /ipc/namespace.c | |
parent | 0c40ba4fd64f98e7a5cba8ffaedbd68642a85700 (diff) |
ipc: recompute msgmni on memory add / remove
Introduce the registration of a callback routine that recomputes msg_ctlmni
upon memory add / remove.
A single notifier block is registered in the hotplug memory chain for all the
ipc namespaces.
Since the ipc namespaces are not linked together, they have their own
notification chain: one notifier_block is defined per ipc namespace.
Each time an ipc namespace is created (removed) it registers (unregisters) its
notifier block in (from) the ipcns chain. The callback routine registered in
the memory chain invokes the ipcns notifier chain with the IPCNS_LOWMEM event.
Each callback routine registered in the ipcns namespace, in turn, recomputes
msgmni for the owning namespace.
Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Mingming Cao <cmm@us.ibm.com>
Cc: Pierre Peiffer <pierre.peiffer@bull.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc/namespace.c')
-rw-r--r-- | ipc/namespace.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/ipc/namespace.c b/ipc/namespace.c index fe3c97aa99dc..f7a35be2e771 100644 --- a/ipc/namespace.c +++ b/ipc/namespace.c | |||
@@ -26,6 +26,8 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns) | |||
26 | msg_init_ns(ns); | 26 | msg_init_ns(ns); |
27 | shm_init_ns(ns); | 27 | shm_init_ns(ns); |
28 | 28 | ||
29 | register_ipcns_notifier(ns); | ||
30 | |||
29 | kref_init(&ns->kref); | 31 | kref_init(&ns->kref); |
30 | return ns; | 32 | return ns; |
31 | } | 33 | } |
@@ -81,6 +83,15 @@ void free_ipc_ns(struct kref *kref) | |||
81 | struct ipc_namespace *ns; | 83 | struct ipc_namespace *ns; |
82 | 84 | ||
83 | ns = container_of(kref, struct ipc_namespace, kref); | 85 | ns = container_of(kref, struct ipc_namespace, kref); |
86 | /* | ||
87 | * Unregistering the hotplug notifier at the beginning guarantees | ||
88 | * that the ipc namespace won't be freed while we are inside the | ||
89 | * callback routine. Since the blocking_notifier_chain_XXX routines | ||
90 | * hold a rw lock on the notifier list, unregister_ipcns_notifier() | ||
91 | * won't take the rw lock before blocking_notifier_call_chain() has | ||
92 | * released the rd lock. | ||
93 | */ | ||
94 | unregister_ipcns_notifier(ns); | ||
84 | sem_exit_ns(ns); | 95 | sem_exit_ns(ns); |
85 | msg_exit_ns(ns); | 96 | msg_exit_ns(ns); |
86 | shm_exit_ns(ns); | 97 | shm_exit_ns(ns); |