diff options
author | Pierre Peiffer <pierre.peiffer@bull.net> | 2008-02-08 07:18:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-08 12:22:26 -0500 |
commit | ed2ddbf88c0ddeeae4c78bb306a116dfd867c55c (patch) | |
tree | de6d6828c03f98be6fc41e8acf3b3e52df28be9b /ipc/sem.c | |
parent | 4b9fcb0ec60584d639ad105c42b75a3447071e47 (diff) |
IPC: make struct ipc_ids static in ipc_namespace
Each ipc_namespace contains a table of 3 pointers to struct ipc_ids (3 for
msg, sem and shm, structure used to store all ipcs) These 'struct ipc_ids'
are dynamically allocated for each icp_namespace as the ipc_namespace
itself (for the init namespace, they are initialized with pointers to
static variables instead)
It is so for historical reason: in fact, before the use of idr to store the
ipcs, the ipcs were stored in tables of variable length, depending of the
maximum number of ipc allowed. Now, these 'struct ipc_ids' have a fixed
size. As they are allocated in any cases for each new ipc_namespace, there
is no gain of memory in having them allocated separately of the struct
ipc_namespace.
This patch proposes to make this table static in the struct ipc_namespace.
Thus, we can allocate all in once and get rid of all the code needed to
allocate and free these ipc_ids separately.
Signed-off-by: Pierre Peiffer <pierre.peiffer@bull.net>
Acked-by: Cedric Le Goater <clg@fr.ibm.com>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Nadia Derbey <Nadia.Derbey@bull.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc/sem.c')
-rw-r--r-- | ipc/sem.c | 26 |
1 files changed, 4 insertions, 22 deletions
@@ -87,14 +87,12 @@ | |||
87 | #include <asm/uaccess.h> | 87 | #include <asm/uaccess.h> |
88 | #include "util.h" | 88 | #include "util.h" |
89 | 89 | ||
90 | #define sem_ids(ns) (*((ns)->ids[IPC_SEM_IDS])) | 90 | #define sem_ids(ns) ((ns)->ids[IPC_SEM_IDS]) |
91 | 91 | ||
92 | #define sem_unlock(sma) ipc_unlock(&(sma)->sem_perm) | 92 | #define sem_unlock(sma) ipc_unlock(&(sma)->sem_perm) |
93 | #define sem_checkid(sma, semid) ipc_checkid(&sma->sem_perm, semid) | 93 | #define sem_checkid(sma, semid) ipc_checkid(&sma->sem_perm, semid) |
94 | #define sem_buildid(id, seq) ipc_buildid(id, seq) | 94 | #define sem_buildid(id, seq) ipc_buildid(id, seq) |
95 | 95 | ||
96 | static struct ipc_ids init_sem_ids; | ||
97 | |||
98 | static int newary(struct ipc_namespace *, struct ipc_params *); | 96 | static int newary(struct ipc_namespace *, struct ipc_params *); |
99 | static void freeary(struct ipc_namespace *, struct sem_array *); | 97 | static void freeary(struct ipc_namespace *, struct sem_array *); |
100 | #ifdef CONFIG_PROC_FS | 98 | #ifdef CONFIG_PROC_FS |
@@ -118,30 +116,17 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it); | |||
118 | #define sc_semopm sem_ctls[2] | 116 | #define sc_semopm sem_ctls[2] |
119 | #define sc_semmni sem_ctls[3] | 117 | #define sc_semmni sem_ctls[3] |
120 | 118 | ||
121 | static void __sem_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids) | 119 | void sem_init_ns(struct ipc_namespace *ns) |
122 | { | 120 | { |
123 | ns->ids[IPC_SEM_IDS] = ids; | ||
124 | ns->sc_semmsl = SEMMSL; | 121 | ns->sc_semmsl = SEMMSL; |
125 | ns->sc_semmns = SEMMNS; | 122 | ns->sc_semmns = SEMMNS; |
126 | ns->sc_semopm = SEMOPM; | 123 | ns->sc_semopm = SEMOPM; |
127 | ns->sc_semmni = SEMMNI; | 124 | ns->sc_semmni = SEMMNI; |
128 | ns->used_sems = 0; | 125 | ns->used_sems = 0; |
129 | ipc_init_ids(ids); | 126 | ipc_init_ids(&ns->ids[IPC_SEM_IDS]); |
130 | } | 127 | } |
131 | 128 | ||
132 | #ifdef CONFIG_IPC_NS | 129 | #ifdef CONFIG_IPC_NS |
133 | int sem_init_ns(struct ipc_namespace *ns) | ||
134 | { | ||
135 | struct ipc_ids *ids; | ||
136 | |||
137 | ids = kmalloc(sizeof(struct ipc_ids), GFP_KERNEL); | ||
138 | if (ids == NULL) | ||
139 | return -ENOMEM; | ||
140 | |||
141 | __sem_init_ns(ns, ids); | ||
142 | return 0; | ||
143 | } | ||
144 | |||
145 | void sem_exit_ns(struct ipc_namespace *ns) | 130 | void sem_exit_ns(struct ipc_namespace *ns) |
146 | { | 131 | { |
147 | struct sem_array *sma; | 132 | struct sem_array *sma; |
@@ -163,15 +148,12 @@ void sem_exit_ns(struct ipc_namespace *ns) | |||
163 | total++; | 148 | total++; |
164 | } | 149 | } |
165 | up_write(&sem_ids(ns).rw_mutex); | 150 | up_write(&sem_ids(ns).rw_mutex); |
166 | |||
167 | kfree(ns->ids[IPC_SEM_IDS]); | ||
168 | ns->ids[IPC_SEM_IDS] = NULL; | ||
169 | } | 151 | } |
170 | #endif | 152 | #endif |
171 | 153 | ||
172 | void __init sem_init (void) | 154 | void __init sem_init (void) |
173 | { | 155 | { |
174 | __sem_init_ns(&init_ipc_ns, &init_sem_ids); | 156 | sem_init_ns(&init_ipc_ns); |
175 | ipc_init_proc_interface("sysvipc/sem", | 157 | ipc_init_proc_interface("sysvipc/sem", |
176 | " key semid perms nsems uid gid cuid cgid otime ctime\n", | 158 | " key semid perms nsems uid gid cuid cgid otime ctime\n", |
177 | IPC_SEM_IDS, sysvipc_sem_proc_show); | 159 | IPC_SEM_IDS, sysvipc_sem_proc_show); |