aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ipc_namespace.h25
-rw-r--r--ipc/Makefile3
-rw-r--r--ipc/ipcns_notifier.c2
-rw-r--r--ipc/namespace.c12
4 files changed, 17 insertions, 25 deletions
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
index cfb2a08b28f5..c3b1da9e5feb 100644
--- a/include/linux/ipc_namespace.h
+++ b/include/linux/ipc_namespace.h
@@ -4,14 +4,14 @@
4#include <linux/err.h> 4#include <linux/err.h>
5#include <linux/idr.h> 5#include <linux/idr.h>
6#include <linux/rwsem.h> 6#include <linux/rwsem.h>
7#ifdef CONFIG_MEMORY_HOTPLUG
8#include <linux/notifier.h> 7#include <linux/notifier.h>
9#endif /* CONFIG_MEMORY_HOTPLUG */
10 8
11/* 9/*
12 * ipc namespace events 10 * ipc namespace events
13 */ 11 */
14#define IPCNS_MEMCHANGED 0x00000001 /* Notify lowmem size changed */ 12#define IPCNS_MEMCHANGED 0x00000001 /* Notify lowmem size changed */
13#define IPCNS_CREATED 0x00000002 /* Notify new ipc namespace created */
14#define IPCNS_REMOVED 0x00000003 /* Notify ipc namespace removed */
15 15
16#define IPCNS_CALLBACK_PRI 0 16#define IPCNS_CALLBACK_PRI 0
17 17
@@ -42,9 +42,7 @@ struct ipc_namespace {
42 int shm_ctlmni; 42 int shm_ctlmni;
43 int shm_tot; 43 int shm_tot;
44 44
45#ifdef CONFIG_MEMORY_HOTPLUG
46 struct notifier_block ipcns_nb; 45 struct notifier_block ipcns_nb;
47#endif
48}; 46};
49 47
50extern struct ipc_namespace init_ipc_ns; 48extern struct ipc_namespace init_ipc_ns;
@@ -53,29 +51,10 @@ extern atomic_t nr_ipc_ns;
53#ifdef CONFIG_SYSVIPC 51#ifdef CONFIG_SYSVIPC
54#define INIT_IPC_NS(ns) .ns = &init_ipc_ns, 52#define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
55 53
56#ifdef CONFIG_MEMORY_HOTPLUG
57
58extern int register_ipcns_notifier(struct ipc_namespace *); 54extern int register_ipcns_notifier(struct ipc_namespace *);
59extern int unregister_ipcns_notifier(struct ipc_namespace *); 55extern int unregister_ipcns_notifier(struct ipc_namespace *);
60extern int ipcns_notify(unsigned long); 56extern int ipcns_notify(unsigned long);
61 57
62#else /* CONFIG_MEMORY_HOTPLUG */
63
64static inline int register_ipcns_notifier(struct ipc_namespace *ipcns)
65{
66 return 0;
67}
68static inline int unregister_ipcns_notifier(struct ipc_namespace *ipcns)
69{
70 return 0;
71}
72static inline int ipcns_notify(unsigned long ev)
73{
74 return 0;
75}
76
77#endif /* CONFIG_MEMORY_HOTPLUG */
78
79#else /* CONFIG_SYSVIPC */ 58#else /* CONFIG_SYSVIPC */
80#define INIT_IPC_NS(ns) 59#define INIT_IPC_NS(ns)
81#endif /* CONFIG_SYSVIPC */ 60#endif /* CONFIG_SYSVIPC */
diff --git a/ipc/Makefile b/ipc/Makefile
index 388e4d259f02..65c384395801 100644
--- a/ipc/Makefile
+++ b/ipc/Makefile
@@ -3,8 +3,7 @@
3# 3#
4 4
5obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o 5obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o
6obj_mem-$(CONFIG_MEMORY_HOTPLUG) += ipcns_notifier.o 6obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o ipcns_notifier.o
7obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o $(obj_mem-y)
8obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o 7obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o
9obj_mq-$(CONFIG_COMPAT) += compat_mq.o 8obj_mq-$(CONFIG_COMPAT) += compat_mq.o
10obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y) 9obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
diff --git a/ipc/ipcns_notifier.c b/ipc/ipcns_notifier.c
index 0786af6ce3ec..c7974609defc 100644
--- a/ipc/ipcns_notifier.c
+++ b/ipc/ipcns_notifier.c
@@ -29,6 +29,8 @@ static int ipcns_callback(struct notifier_block *self,
29 29
30 switch (action) { 30 switch (action) {
31 case IPCNS_MEMCHANGED: /* amount of lowmem has changed */ 31 case IPCNS_MEMCHANGED: /* amount of lowmem has changed */
32 case IPCNS_CREATED:
33 case IPCNS_REMOVED:
32 /* 34 /*
33 * It's time to recompute msgmni 35 * It's time to recompute msgmni
34 */ 36 */
diff --git a/ipc/namespace.c b/ipc/namespace.c
index f7a35be2e771..9171d948751e 100644
--- a/ipc/namespace.c
+++ b/ipc/namespace.c
@@ -26,6 +26,12 @@ 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 /*
30 * msgmni has already been computed for the new ipc ns.
31 * Thus, do the ipcns creation notification before registering that
32 * new ipcns in the chain.
33 */
34 ipcns_notify(IPCNS_CREATED);
29 register_ipcns_notifier(ns); 35 register_ipcns_notifier(ns);
30 36
31 kref_init(&ns->kref); 37 kref_init(&ns->kref);
@@ -97,4 +103,10 @@ void free_ipc_ns(struct kref *kref)
97 shm_exit_ns(ns); 103 shm_exit_ns(ns);
98 kfree(ns); 104 kfree(ns);
99 atomic_dec(&nr_ipc_ns); 105 atomic_dec(&nr_ipc_ns);
106
107 /*
108 * Do the ipcns removal notification after decrementing nr_ipc_ns in
109 * order to have a correct value when recomputing msgmni.
110 */
111 ipcns_notify(IPCNS_REMOVED);
100} 112}