diff options
author | Pierre Peiffer <pierre.peiffer@bull.net> | 2008-02-08 04:18:57 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-08 09:22:26 -0800 |
commit | ed2ddbf88c0ddeeae4c78bb306a116dfd867c55c (patch) | |
tree | de6d6828c03f98be6fc41e8acf3b3e52df28be9b /ipc/msg.c | |
parent | 4b9fcb0ec60584d639ad105c42b75a3447071e47 (diff) | |
download | lwn-ed2ddbf88c0ddeeae4c78bb306a116dfd867c55c.tar.gz lwn-ed2ddbf88c0ddeeae4c78bb306a116dfd867c55c.zip |
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/msg.c')
-rw-r--r-- | ipc/msg.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/ipc/msg.c b/ipc/msg.c index 5879bfeb79ca..ab0c38b29533 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -67,9 +67,7 @@ struct msg_sender { #define SEARCH_NOTEQUAL 3 #define SEARCH_LESSEQUAL 4 -static struct ipc_ids init_msg_ids; - -#define msg_ids(ns) (*((ns)->ids[IPC_MSG_IDS])) +#define msg_ids(ns) ((ns)->ids[IPC_MSG_IDS]) #define msg_unlock(msq) ipc_unlock(&(msq)->q_perm) #define msg_buildid(id, seq) ipc_buildid(id, seq) @@ -80,30 +78,17 @@ static int newque(struct ipc_namespace *, struct ipc_params *); static int sysvipc_msg_proc_show(struct seq_file *s, void *it); #endif -static void __msg_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids) +void msg_init_ns(struct ipc_namespace *ns) { - ns->ids[IPC_MSG_IDS] = ids; ns->msg_ctlmax = MSGMAX; ns->msg_ctlmnb = MSGMNB; ns->msg_ctlmni = MSGMNI; atomic_set(&ns->msg_bytes, 0); atomic_set(&ns->msg_hdrs, 0); - ipc_init_ids(ids); + ipc_init_ids(&ns->ids[IPC_MSG_IDS]); } #ifdef CONFIG_IPC_NS -int msg_init_ns(struct ipc_namespace *ns) -{ - struct ipc_ids *ids; - - ids = kmalloc(sizeof(struct ipc_ids), GFP_KERNEL); - if (ids == NULL) - return -ENOMEM; - - __msg_init_ns(ns, ids); - return 0; -} - void msg_exit_ns(struct ipc_namespace *ns) { struct msg_queue *msq; @@ -126,15 +111,12 @@ void msg_exit_ns(struct ipc_namespace *ns) } up_write(&msg_ids(ns).rw_mutex); - - kfree(ns->ids[IPC_MSG_IDS]); - ns->ids[IPC_MSG_IDS] = NULL; } #endif void __init msg_init(void) { - __msg_init_ns(&init_ipc_ns, &init_msg_ids); + msg_init_ns(&init_ipc_ns); ipc_init_proc_interface("sysvipc/msg", " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", IPC_MSG_IDS, sysvipc_msg_proc_show); |