diff options
-rw-r--r-- | include/linux/ipc_namespace.h | 25 | ||||
-rw-r--r-- | ipc/Makefile | 3 | ||||
-rw-r--r-- | ipc/ipcns_notifier.c | 2 | ||||
-rw-r--r-- | ipc/namespace.c | 12 |
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 | ||
50 | extern struct ipc_namespace init_ipc_ns; | 48 | extern 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 | |||
58 | extern int register_ipcns_notifier(struct ipc_namespace *); | 54 | extern int register_ipcns_notifier(struct ipc_namespace *); |
59 | extern int unregister_ipcns_notifier(struct ipc_namespace *); | 55 | extern int unregister_ipcns_notifier(struct ipc_namespace *); |
60 | extern int ipcns_notify(unsigned long); | 56 | extern int ipcns_notify(unsigned long); |
61 | 57 | ||
62 | #else /* CONFIG_MEMORY_HOTPLUG */ | ||
63 | |||
64 | static inline int register_ipcns_notifier(struct ipc_namespace *ipcns) | ||
65 | { | ||
66 | return 0; | ||
67 | } | ||
68 | static inline int unregister_ipcns_notifier(struct ipc_namespace *ipcns) | ||
69 | { | ||
70 | return 0; | ||
71 | } | ||
72 | static 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 | ||
5 | obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o | 5 | obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o |
6 | obj_mem-$(CONFIG_MEMORY_HOTPLUG) += ipcns_notifier.o | 6 | obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o ipcns_notifier.o |
7 | obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o $(obj_mem-y) | ||
8 | obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o | 7 | obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o |
9 | obj_mq-$(CONFIG_COMPAT) += compat_mq.o | 8 | obj_mq-$(CONFIG_COMPAT) += compat_mq.o |
10 | obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y) | 9 | obj-$(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 | } |