aboutsummaryrefslogtreecommitdiffstats
path: root/ipc/sem.c
diff options
context:
space:
mode:
authorPierre Peiffer <pierre.peiffer@bull.net>2008-02-08 07:18:57 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-08 12:22:26 -0500
commit01b8b07a5d77d22e609267dcae74d15e3e9c5f13 (patch)
treedd53c51f75de9511da7fdf283c73080d6c2552a8 /ipc/sem.c
parented2ddbf88c0ddeeae4c78bb306a116dfd867c55c (diff)
IPC: consolidate sem_exit_ns(), msg_exit_ns() and shm_exit_ns()
sem_exit_ns(), msg_exit_ns() and shm_exit_ns() are all called when an ipc_namespace is released to free all ipcs of each type. But in fact, they do the same thing: they loop around all ipcs to free them individually by calling a specific routine. This patch proposes to consolidate this by introducing a common function, free_ipcs(), that do the job. The specific routine to call on each individual ipcs is passed as parameter. For this, these ipc-specific 'free' routines are reworked to take a generic 'struct ipc_perm' as parameter. Signed-off-by: Pierre Peiffer <pierre.peiffer@bull.net> Cc: 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.c27
1 files changed, 5 insertions, 22 deletions
diff --git a/ipc/sem.c b/ipc/sem.c
index 1f7e28d1d25d..0b45a4d383c6 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -94,7 +94,7 @@
94#define sem_buildid(id, seq) ipc_buildid(id, seq) 94#define sem_buildid(id, seq) ipc_buildid(id, seq)
95 95
96static int newary(struct ipc_namespace *, struct ipc_params *); 96static int newary(struct ipc_namespace *, struct ipc_params *);
97static void freeary(struct ipc_namespace *, struct sem_array *); 97static void freeary(struct ipc_namespace *, struct kern_ipc_perm *);
98#ifdef CONFIG_PROC_FS 98#ifdef CONFIG_PROC_FS
99static int sysvipc_sem_proc_show(struct seq_file *s, void *it); 99static int sysvipc_sem_proc_show(struct seq_file *s, void *it);
100#endif 100#endif
@@ -129,25 +129,7 @@ void sem_init_ns(struct ipc_namespace *ns)
129#ifdef CONFIG_IPC_NS 129#ifdef CONFIG_IPC_NS
130void sem_exit_ns(struct ipc_namespace *ns) 130void sem_exit_ns(struct ipc_namespace *ns)
131{ 131{
132 struct sem_array *sma; 132 free_ipcs(ns, &sem_ids(ns), freeary);
133 struct kern_ipc_perm *perm;
134 int next_id;
135 int total, in_use;
136
137 down_write(&sem_ids(ns).rw_mutex);
138
139 in_use = sem_ids(ns).in_use;
140
141 for (total = 0, next_id = 0; total < in_use; next_id++) {
142 perm = idr_find(&sem_ids(ns).ipcs_idr, next_id);
143 if (perm == NULL)
144 continue;
145 ipc_lock_by_ptr(perm);
146 sma = container_of(perm, struct sem_array, sem_perm);
147 freeary(ns, sma);
148 total++;
149 }
150 up_write(&sem_ids(ns).rw_mutex);
151} 133}
152#endif 134#endif
153 135
@@ -542,10 +524,11 @@ static int count_semzcnt (struct sem_array * sma, ushort semnum)
542 * as a writer and the spinlock for this semaphore set hold. sem_ids.rw_mutex 524 * as a writer and the spinlock for this semaphore set hold. sem_ids.rw_mutex
543 * remains locked on exit. 525 * remains locked on exit.
544 */ 526 */
545static void freeary(struct ipc_namespace *ns, struct sem_array *sma) 527static void freeary(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
546{ 528{
547 struct sem_undo *un; 529 struct sem_undo *un;
548 struct sem_queue *q; 530 struct sem_queue *q;
531 struct sem_array *sma = container_of(ipcp, struct sem_array, sem_perm);
549 532
550 /* Invalidate the existing undo structures for this semaphore set. 533 /* Invalidate the existing undo structures for this semaphore set.
551 * (They will be freed without any further action in exit_sem() 534 * (They will be freed without any further action in exit_sem()
@@ -926,7 +909,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid, int semnum,
926 909
927 switch(cmd){ 910 switch(cmd){
928 case IPC_RMID: 911 case IPC_RMID:
929 freeary(ns, sma); 912 freeary(ns, ipcp);
930 err = 0; 913 err = 0;
931 break; 914 break;
932 case IPC_SET: 915 case IPC_SET: