forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[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
Showing
8 changed files
with
162 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* | ||
* linux/ipc/ipcns_notifier.c | ||
* Copyright (C) 2007 BULL SA. Nadia Derbey | ||
* | ||
* Notification mechanism for ipc namespaces: | ||
* The callback routine registered in the memory chain invokes the ipcns | ||
* notifier chain with the IPCNS_MEMCHANGED event. | ||
* Each callback routine registered in the ipcns namespace recomputes msgmni | ||
* for the owning namespace. | ||
*/ | ||
|
||
#include <linux/msg.h> | ||
#include <linux/rcupdate.h> | ||
#include <linux/notifier.h> | ||
#include <linux/nsproxy.h> | ||
#include <linux/ipc_namespace.h> | ||
|
||
#include "util.h" | ||
|
||
|
||
|
||
static BLOCKING_NOTIFIER_HEAD(ipcns_chain); | ||
|
||
|
||
static int ipcns_callback(struct notifier_block *self, | ||
unsigned long action, void *arg) | ||
{ | ||
struct ipc_namespace *ns; | ||
|
||
switch (action) { | ||
case IPCNS_MEMCHANGED: /* amount of lowmem has changed */ | ||
/* | ||
* It's time to recompute msgmni | ||
*/ | ||
ns = container_of(self, struct ipc_namespace, ipcns_nb); | ||
/* | ||
* No need to get a reference on the ns: the 1st job of | ||
* free_ipc_ns() is to unregister the callback routine. | ||
* blocking_notifier_chain_unregister takes the wr lock to do | ||
* it. | ||
* When this callback routine is called the rd lock is held by | ||
* blocking_notifier_call_chain. | ||
* So the ipc ns cannot be freed while we are here. | ||
*/ | ||
recompute_msgmni(ns); | ||
break; | ||
default: | ||
break; | ||
} | ||
|
||
return NOTIFY_OK; | ||
} | ||
|
||
int register_ipcns_notifier(struct ipc_namespace *ns) | ||
{ | ||
memset(&ns->ipcns_nb, 0, sizeof(ns->ipcns_nb)); | ||
ns->ipcns_nb.notifier_call = ipcns_callback; | ||
ns->ipcns_nb.priority = IPCNS_CALLBACK_PRI; | ||
return blocking_notifier_chain_register(&ipcns_chain, &ns->ipcns_nb); | ||
} | ||
|
||
int unregister_ipcns_notifier(struct ipc_namespace *ns) | ||
{ | ||
return blocking_notifier_chain_unregister(&ipcns_chain, | ||
&ns->ipcns_nb); | ||
} | ||
|
||
int ipcns_notify(unsigned long val) | ||
{ | ||
return blocking_notifier_call_chain(&ipcns_chain, val, NULL); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters