aboutsummaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorDavidlohr Bueso <davidlohr.bueso@hp.com>2013-09-11 17:26:24 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 18:59:42 -0400
commitd9a605e40b1376eb02b067d7690580255a0df68f (patch)
treeb21254f7172ae8db6faffd9b7941d579fa421478 /ipc
parentc2c737a0461e61a34676bd0bd1bc1a70a1b4e396 (diff)
ipc: rename ids->rw_mutex
Since in some situations the lock can be shared for readers, we shouldn't be calling it a mutex, rename it to rwsem. Signed-off-by: Davidlohr Bueso <davidlohr.bueso@hp.com> Tested-by: Sedat Dilek <sedat.dilek@gmail.com> Cc: Rik van Riel <riel@redhat.com> Cc: Manfred Spraul <manfred@colorfullife.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/msg.c20
-rw-r--r--ipc/namespace.c4
-rw-r--r--ipc/sem.c24
-rw-r--r--ipc/shm.c56
-rw-r--r--ipc/util.c28
-rw-r--r--ipc/util.h4
6 files changed, 68 insertions, 68 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index b65fdf1a09dd..8203e71bcfbc 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -172,7 +172,7 @@ static inline void msg_rmid(struct ipc_namespace *ns, struct msg_queue *s)
172 * @ns: namespace 172 * @ns: namespace
173 * @params: ptr to the structure that contains the key and msgflg 173 * @params: ptr to the structure that contains the key and msgflg
174 * 174 *
175 * Called with msg_ids.rw_mutex held (writer) 175 * Called with msg_ids.rwsem held (writer)
176 */ 176 */
177static int newque(struct ipc_namespace *ns, struct ipc_params *params) 177static int newque(struct ipc_namespace *ns, struct ipc_params *params)
178{ 178{
@@ -259,8 +259,8 @@ static void expunge_all(struct msg_queue *msq, int res)
259 * removes the message queue from message queue ID IDR, and cleans up all the 259 * removes the message queue from message queue ID IDR, and cleans up all the
260 * messages associated with this queue. 260 * messages associated with this queue.
261 * 261 *
262 * msg_ids.rw_mutex (writer) and the spinlock for this message queue are held 262 * msg_ids.rwsem (writer) and the spinlock for this message queue are held
263 * before freeque() is called. msg_ids.rw_mutex remains locked on exit. 263 * before freeque() is called. msg_ids.rwsem remains locked on exit.
264 */ 264 */
265static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) 265static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
266{ 266{
@@ -282,7 +282,7 @@ static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
282} 282}
283 283
284/* 284/*
285 * Called with msg_ids.rw_mutex and ipcp locked. 285 * Called with msg_ids.rwsem and ipcp locked.
286 */ 286 */
287static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg) 287static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
288{ 288{
@@ -386,9 +386,9 @@ copy_msqid_from_user(struct msqid64_ds *out, void __user *buf, int version)
386} 386}
387 387
388/* 388/*
389 * This function handles some msgctl commands which require the rw_mutex 389 * This function handles some msgctl commands which require the rwsem
390 * to be held in write mode. 390 * to be held in write mode.
391 * NOTE: no locks must be held, the rw_mutex is taken inside this function. 391 * NOTE: no locks must be held, the rwsem is taken inside this function.
392 */ 392 */
393static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, 393static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
394 struct msqid_ds __user *buf, int version) 394 struct msqid_ds __user *buf, int version)
@@ -403,7 +403,7 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
403 return -EFAULT; 403 return -EFAULT;
404 } 404 }
405 405
406 down_write(&msg_ids(ns).rw_mutex); 406 down_write(&msg_ids(ns).rwsem);
407 rcu_read_lock(); 407 rcu_read_lock();
408 408
409 ipcp = ipcctl_pre_down_nolock(ns, &msg_ids(ns), msqid, cmd, 409 ipcp = ipcctl_pre_down_nolock(ns, &msg_ids(ns), msqid, cmd,
@@ -459,7 +459,7 @@ out_unlock0:
459out_unlock1: 459out_unlock1:
460 rcu_read_unlock(); 460 rcu_read_unlock();
461out_up: 461out_up:
462 up_write(&msg_ids(ns).rw_mutex); 462 up_write(&msg_ids(ns).rwsem);
463 return err; 463 return err;
464} 464}
465 465
@@ -494,7 +494,7 @@ static int msgctl_nolock(struct ipc_namespace *ns, int msqid,
494 msginfo.msgmnb = ns->msg_ctlmnb; 494 msginfo.msgmnb = ns->msg_ctlmnb;
495 msginfo.msgssz = MSGSSZ; 495 msginfo.msgssz = MSGSSZ;
496 msginfo.msgseg = MSGSEG; 496 msginfo.msgseg = MSGSEG;
497 down_read(&msg_ids(ns).rw_mutex); 497 down_read(&msg_ids(ns).rwsem);
498 if (cmd == MSG_INFO) { 498 if (cmd == MSG_INFO) {
499 msginfo.msgpool = msg_ids(ns).in_use; 499 msginfo.msgpool = msg_ids(ns).in_use;
500 msginfo.msgmap = atomic_read(&ns->msg_hdrs); 500 msginfo.msgmap = atomic_read(&ns->msg_hdrs);
@@ -505,7 +505,7 @@ static int msgctl_nolock(struct ipc_namespace *ns, int msqid,
505 msginfo.msgtql = MSGTQL; 505 msginfo.msgtql = MSGTQL;
506 } 506 }
507 max_id = ipc_get_maxid(&msg_ids(ns)); 507 max_id = ipc_get_maxid(&msg_ids(ns));
508 up_read(&msg_ids(ns).rw_mutex); 508 up_read(&msg_ids(ns).rwsem);
509 if (copy_to_user(buf, &msginfo, sizeof(struct msginfo))) 509 if (copy_to_user(buf, &msginfo, sizeof(struct msginfo)))
510 return -EFAULT; 510 return -EFAULT;
511 return (max_id < 0) ? 0 : max_id; 511 return (max_id < 0) ? 0 : max_id;
diff --git a/ipc/namespace.c b/ipc/namespace.c
index 4be6581d3b7f..d43d9384bb2d 100644
--- a/ipc/namespace.c
+++ b/ipc/namespace.c
@@ -81,7 +81,7 @@ void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
81 int next_id; 81 int next_id;
82 int total, in_use; 82 int total, in_use;
83 83
84 down_write(&ids->rw_mutex); 84 down_write(&ids->rwsem);
85 85
86 in_use = ids->in_use; 86 in_use = ids->in_use;
87 87
@@ -93,7 +93,7 @@ void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
93 free(ns, perm); 93 free(ns, perm);
94 total++; 94 total++;
95 } 95 }
96 up_write(&ids->rw_mutex); 96 up_write(&ids->rwsem);
97} 97}
98 98
99static void free_ipc_ns(struct ipc_namespace *ns) 99static void free_ipc_ns(struct ipc_namespace *ns)
diff --git a/ipc/sem.c b/ipc/sem.c
index 41088899783d..69b6a21f3844 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -322,7 +322,7 @@ static inline void sem_unlock(struct sem_array *sma, int locknum)
322} 322}
323 323
324/* 324/*
325 * sem_lock_(check_) routines are called in the paths where the rw_mutex 325 * sem_lock_(check_) routines are called in the paths where the rwsem
326 * is not held. 326 * is not held.
327 * 327 *
328 * The caller holds the RCU read lock. 328 * The caller holds the RCU read lock.
@@ -426,7 +426,7 @@ static inline void sem_rmid(struct ipc_namespace *ns, struct sem_array *s)
426 * @ns: namespace 426 * @ns: namespace
427 * @params: ptr to the structure that contains key, semflg and nsems 427 * @params: ptr to the structure that contains key, semflg and nsems
428 * 428 *
429 * Called with sem_ids.rw_mutex held (as a writer) 429 * Called with sem_ids.rwsem held (as a writer)
430 */ 430 */
431 431
432static int newary(struct ipc_namespace *ns, struct ipc_params *params) 432static int newary(struct ipc_namespace *ns, struct ipc_params *params)
@@ -492,7 +492,7 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
492 492
493 493
494/* 494/*
495 * Called with sem_ids.rw_mutex and ipcp locked. 495 * Called with sem_ids.rwsem and ipcp locked.
496 */ 496 */
497static inline int sem_security(struct kern_ipc_perm *ipcp, int semflg) 497static inline int sem_security(struct kern_ipc_perm *ipcp, int semflg)
498{ 498{
@@ -503,7 +503,7 @@ static inline int sem_security(struct kern_ipc_perm *ipcp, int semflg)
503} 503}
504 504
505/* 505/*
506 * Called with sem_ids.rw_mutex and ipcp locked. 506 * Called with sem_ids.rwsem and ipcp locked.
507 */ 507 */
508static inline int sem_more_checks(struct kern_ipc_perm *ipcp, 508static inline int sem_more_checks(struct kern_ipc_perm *ipcp,
509 struct ipc_params *params) 509 struct ipc_params *params)
@@ -994,8 +994,8 @@ static int count_semzcnt (struct sem_array * sma, ushort semnum)
994 return semzcnt; 994 return semzcnt;
995} 995}
996 996
997/* Free a semaphore set. freeary() is called with sem_ids.rw_mutex locked 997/* Free a semaphore set. freeary() is called with sem_ids.rwsem locked
998 * as a writer and the spinlock for this semaphore set hold. sem_ids.rw_mutex 998 * as a writer and the spinlock for this semaphore set hold. sem_ids.rwsem
999 * remains locked on exit. 999 * remains locked on exit.
1000 */ 1000 */
1001static void freeary(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) 1001static void freeary(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
@@ -1116,7 +1116,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
1116 seminfo.semmnu = SEMMNU; 1116 seminfo.semmnu = SEMMNU;
1117 seminfo.semmap = SEMMAP; 1117 seminfo.semmap = SEMMAP;
1118 seminfo.semume = SEMUME; 1118 seminfo.semume = SEMUME;
1119 down_read(&sem_ids(ns).rw_mutex); 1119 down_read(&sem_ids(ns).rwsem);
1120 if (cmd == SEM_INFO) { 1120 if (cmd == SEM_INFO) {
1121 seminfo.semusz = sem_ids(ns).in_use; 1121 seminfo.semusz = sem_ids(ns).in_use;
1122 seminfo.semaem = ns->used_sems; 1122 seminfo.semaem = ns->used_sems;
@@ -1125,7 +1125,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
1125 seminfo.semaem = SEMAEM; 1125 seminfo.semaem = SEMAEM;
1126 } 1126 }
1127 max_id = ipc_get_maxid(&sem_ids(ns)); 1127 max_id = ipc_get_maxid(&sem_ids(ns));
1128 up_read(&sem_ids(ns).rw_mutex); 1128 up_read(&sem_ids(ns).rwsem);
1129 if (copy_to_user(p, &seminfo, sizeof(struct seminfo))) 1129 if (copy_to_user(p, &seminfo, sizeof(struct seminfo)))
1130 return -EFAULT; 1130 return -EFAULT;
1131 return (max_id < 0) ? 0: max_id; 1131 return (max_id < 0) ? 0: max_id;
@@ -1431,9 +1431,9 @@ copy_semid_from_user(struct semid64_ds *out, void __user *buf, int version)
1431} 1431}
1432 1432
1433/* 1433/*
1434 * This function handles some semctl commands which require the rw_mutex 1434 * This function handles some semctl commands which require the rwsem
1435 * to be held in write mode. 1435 * to be held in write mode.
1436 * NOTE: no locks must be held, the rw_mutex is taken inside this function. 1436 * NOTE: no locks must be held, the rwsem is taken inside this function.
1437 */ 1437 */
1438static int semctl_down(struct ipc_namespace *ns, int semid, 1438static int semctl_down(struct ipc_namespace *ns, int semid,
1439 int cmd, int version, void __user *p) 1439 int cmd, int version, void __user *p)
@@ -1448,7 +1448,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
1448 return -EFAULT; 1448 return -EFAULT;
1449 } 1449 }
1450 1450
1451 down_write(&sem_ids(ns).rw_mutex); 1451 down_write(&sem_ids(ns).rwsem);
1452 rcu_read_lock(); 1452 rcu_read_lock();
1453 1453
1454 ipcp = ipcctl_pre_down_nolock(ns, &sem_ids(ns), semid, cmd, 1454 ipcp = ipcctl_pre_down_nolock(ns, &sem_ids(ns), semid, cmd,
@@ -1487,7 +1487,7 @@ out_unlock0:
1487out_unlock1: 1487out_unlock1:
1488 rcu_read_unlock(); 1488 rcu_read_unlock();
1489out_up: 1489out_up:
1490 up_write(&sem_ids(ns).rw_mutex); 1490 up_write(&sem_ids(ns).rwsem);
1491 return err; 1491 return err;
1492} 1492}
1493 1493
diff --git a/ipc/shm.c b/ipc/shm.c
index 28d19f4ece4b..cb2cedaa8808 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -83,8 +83,8 @@ void shm_init_ns(struct ipc_namespace *ns)
83} 83}
84 84
85/* 85/*
86 * Called with shm_ids.rw_mutex (writer) and the shp structure locked. 86 * Called with shm_ids.rwsem (writer) and the shp structure locked.
87 * Only shm_ids.rw_mutex remains locked on exit. 87 * Only shm_ids.rwsem remains locked on exit.
88 */ 88 */
89static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) 89static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
90{ 90{
@@ -148,7 +148,7 @@ static inline struct shmid_kernel *shm_obtain_object_check(struct ipc_namespace
148} 148}
149 149
150/* 150/*
151 * shm_lock_(check_) routines are called in the paths where the rw_mutex 151 * shm_lock_(check_) routines are called in the paths where the rwsem
152 * is not necessarily held. 152 * is not necessarily held.
153 */ 153 */
154static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id) 154static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id)
@@ -205,7 +205,7 @@ static void shm_open(struct vm_area_struct *vma)
205 * @ns: namespace 205 * @ns: namespace
206 * @shp: struct to free 206 * @shp: struct to free
207 * 207 *
208 * It has to be called with shp and shm_ids.rw_mutex (writer) locked, 208 * It has to be called with shp and shm_ids.rwsem (writer) locked,
209 * but returns with shp unlocked and freed. 209 * but returns with shp unlocked and freed.
210 */ 210 */
211static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) 211static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
@@ -253,7 +253,7 @@ static void shm_close(struct vm_area_struct *vma)
253 struct shmid_kernel *shp; 253 struct shmid_kernel *shp;
254 struct ipc_namespace *ns = sfd->ns; 254 struct ipc_namespace *ns = sfd->ns;
255 255
256 down_write(&shm_ids(ns).rw_mutex); 256 down_write(&shm_ids(ns).rwsem);
257 /* remove from the list of attaches of the shm segment */ 257 /* remove from the list of attaches of the shm segment */
258 shp = shm_lock(ns, sfd->id); 258 shp = shm_lock(ns, sfd->id);
259 BUG_ON(IS_ERR(shp)); 259 BUG_ON(IS_ERR(shp));
@@ -264,10 +264,10 @@ static void shm_close(struct vm_area_struct *vma)
264 shm_destroy(ns, shp); 264 shm_destroy(ns, shp);
265 else 265 else
266 shm_unlock(shp); 266 shm_unlock(shp);
267 up_write(&shm_ids(ns).rw_mutex); 267 up_write(&shm_ids(ns).rwsem);
268} 268}
269 269
270/* Called with ns->shm_ids(ns).rw_mutex locked */ 270/* Called with ns->shm_ids(ns).rwsem locked */
271static int shm_try_destroy_current(int id, void *p, void *data) 271static int shm_try_destroy_current(int id, void *p, void *data)
272{ 272{
273 struct ipc_namespace *ns = data; 273 struct ipc_namespace *ns = data;
@@ -298,7 +298,7 @@ static int shm_try_destroy_current(int id, void *p, void *data)
298 return 0; 298 return 0;
299} 299}
300 300
301/* Called with ns->shm_ids(ns).rw_mutex locked */ 301/* Called with ns->shm_ids(ns).rwsem locked */
302static int shm_try_destroy_orphaned(int id, void *p, void *data) 302static int shm_try_destroy_orphaned(int id, void *p, void *data)
303{ 303{
304 struct ipc_namespace *ns = data; 304 struct ipc_namespace *ns = data;
@@ -309,7 +309,7 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data)
309 * We want to destroy segments without users and with already 309 * We want to destroy segments without users and with already
310 * exit'ed originating process. 310 * exit'ed originating process.
311 * 311 *
312 * As shp->* are changed under rw_mutex, it's safe to skip shp locking. 312 * As shp->* are changed under rwsem, it's safe to skip shp locking.
313 */ 313 */
314 if (shp->shm_creator != NULL) 314 if (shp->shm_creator != NULL)
315 return 0; 315 return 0;
@@ -323,10 +323,10 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data)
323 323
324void shm_destroy_orphaned(struct ipc_namespace *ns) 324void shm_destroy_orphaned(struct ipc_namespace *ns)
325{ 325{
326 down_write(&shm_ids(ns).rw_mutex); 326 down_write(&shm_ids(ns).rwsem);
327 if (shm_ids(ns).in_use) 327 if (shm_ids(ns).in_use)
328 idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns); 328 idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns);
329 up_write(&shm_ids(ns).rw_mutex); 329 up_write(&shm_ids(ns).rwsem);
330} 330}
331 331
332 332
@@ -338,10 +338,10 @@ void exit_shm(struct task_struct *task)
338 return; 338 return;
339 339
340 /* Destroy all already created segments, but not mapped yet */ 340 /* Destroy all already created segments, but not mapped yet */
341 down_write(&shm_ids(ns).rw_mutex); 341 down_write(&shm_ids(ns).rwsem);
342 if (shm_ids(ns).in_use) 342 if (shm_ids(ns).in_use)
343 idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_current, ns); 343 idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_current, ns);
344 up_write(&shm_ids(ns).rw_mutex); 344 up_write(&shm_ids(ns).rwsem);
345} 345}
346 346
347static int shm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 347static int shm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
@@ -475,7 +475,7 @@ static const struct vm_operations_struct shm_vm_ops = {
475 * @ns: namespace 475 * @ns: namespace
476 * @params: ptr to the structure that contains key, size and shmflg 476 * @params: ptr to the structure that contains key, size and shmflg
477 * 477 *
478 * Called with shm_ids.rw_mutex held as a writer. 478 * Called with shm_ids.rwsem held as a writer.
479 */ 479 */
480 480
481static int newseg(struct ipc_namespace *ns, struct ipc_params *params) 481static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
@@ -583,7 +583,7 @@ no_file:
583} 583}
584 584
585/* 585/*
586 * Called with shm_ids.rw_mutex and ipcp locked. 586 * Called with shm_ids.rwsem and ipcp locked.
587 */ 587 */
588static inline int shm_security(struct kern_ipc_perm *ipcp, int shmflg) 588static inline int shm_security(struct kern_ipc_perm *ipcp, int shmflg)
589{ 589{
@@ -594,7 +594,7 @@ static inline int shm_security(struct kern_ipc_perm *ipcp, int shmflg)
594} 594}
595 595
596/* 596/*
597 * Called with shm_ids.rw_mutex and ipcp locked. 597 * Called with shm_ids.rwsem and ipcp locked.
598 */ 598 */
599static inline int shm_more_checks(struct kern_ipc_perm *ipcp, 599static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
600 struct ipc_params *params) 600 struct ipc_params *params)
@@ -707,7 +707,7 @@ static inline unsigned long copy_shminfo_to_user(void __user *buf, struct shminf
707 707
708/* 708/*
709 * Calculate and add used RSS and swap pages of a shm. 709 * Calculate and add used RSS and swap pages of a shm.
710 * Called with shm_ids.rw_mutex held as a reader 710 * Called with shm_ids.rwsem held as a reader
711 */ 711 */
712static void shm_add_rss_swap(struct shmid_kernel *shp, 712static void shm_add_rss_swap(struct shmid_kernel *shp,
713 unsigned long *rss_add, unsigned long *swp_add) 713 unsigned long *rss_add, unsigned long *swp_add)
@@ -734,7 +734,7 @@ static void shm_add_rss_swap(struct shmid_kernel *shp,
734} 734}
735 735
736/* 736/*
737 * Called with shm_ids.rw_mutex held as a reader 737 * Called with shm_ids.rwsem held as a reader
738 */ 738 */
739static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss, 739static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
740 unsigned long *swp) 740 unsigned long *swp)
@@ -763,9 +763,9 @@ static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
763} 763}
764 764
765/* 765/*
766 * This function handles some shmctl commands which require the rw_mutex 766 * This function handles some shmctl commands which require the rwsem
767 * to be held in write mode. 767 * to be held in write mode.
768 * NOTE: no locks must be held, the rw_mutex is taken inside this function. 768 * NOTE: no locks must be held, the rwsem is taken inside this function.
769 */ 769 */
770static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd, 770static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd,
771 struct shmid_ds __user *buf, int version) 771 struct shmid_ds __user *buf, int version)
@@ -780,7 +780,7 @@ static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd,
780 return -EFAULT; 780 return -EFAULT;
781 } 781 }
782 782
783 down_write(&shm_ids(ns).rw_mutex); 783 down_write(&shm_ids(ns).rwsem);
784 rcu_read_lock(); 784 rcu_read_lock();
785 785
786 ipcp = ipcctl_pre_down_nolock(ns, &shm_ids(ns), shmid, cmd, 786 ipcp = ipcctl_pre_down_nolock(ns, &shm_ids(ns), shmid, cmd,
@@ -819,7 +819,7 @@ out_unlock0:
819out_unlock1: 819out_unlock1:
820 rcu_read_unlock(); 820 rcu_read_unlock();
821out_up: 821out_up:
822 up_write(&shm_ids(ns).rw_mutex); 822 up_write(&shm_ids(ns).rwsem);
823 return err; 823 return err;
824} 824}
825 825
@@ -850,9 +850,9 @@ static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
850 if(copy_shminfo_to_user (buf, &shminfo, version)) 850 if(copy_shminfo_to_user (buf, &shminfo, version))
851 return -EFAULT; 851 return -EFAULT;
852 852
853 down_read(&shm_ids(ns).rw_mutex); 853 down_read(&shm_ids(ns).rwsem);
854 err = ipc_get_maxid(&shm_ids(ns)); 854 err = ipc_get_maxid(&shm_ids(ns));
855 up_read(&shm_ids(ns).rw_mutex); 855 up_read(&shm_ids(ns).rwsem);
856 856
857 if(err<0) 857 if(err<0)
858 err = 0; 858 err = 0;
@@ -863,14 +863,14 @@ static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
863 struct shm_info shm_info; 863 struct shm_info shm_info;
864 864
865 memset(&shm_info, 0, sizeof(shm_info)); 865 memset(&shm_info, 0, sizeof(shm_info));
866 down_read(&shm_ids(ns).rw_mutex); 866 down_read(&shm_ids(ns).rwsem);
867 shm_info.used_ids = shm_ids(ns).in_use; 867 shm_info.used_ids = shm_ids(ns).in_use;
868 shm_get_stat (ns, &shm_info.shm_rss, &shm_info.shm_swp); 868 shm_get_stat (ns, &shm_info.shm_rss, &shm_info.shm_swp);
869 shm_info.shm_tot = ns->shm_tot; 869 shm_info.shm_tot = ns->shm_tot;
870 shm_info.swap_attempts = 0; 870 shm_info.swap_attempts = 0;
871 shm_info.swap_successes = 0; 871 shm_info.swap_successes = 0;
872 err = ipc_get_maxid(&shm_ids(ns)); 872 err = ipc_get_maxid(&shm_ids(ns));
873 up_read(&shm_ids(ns).rw_mutex); 873 up_read(&shm_ids(ns).rwsem);
874 if (copy_to_user(buf, &shm_info, sizeof(shm_info))) { 874 if (copy_to_user(buf, &shm_info, sizeof(shm_info))) {
875 err = -EFAULT; 875 err = -EFAULT;
876 goto out; 876 goto out;
@@ -1169,7 +1169,7 @@ out_fput:
1169 fput(file); 1169 fput(file);
1170 1170
1171out_nattch: 1171out_nattch:
1172 down_write(&shm_ids(ns).rw_mutex); 1172 down_write(&shm_ids(ns).rwsem);
1173 shp = shm_lock(ns, shmid); 1173 shp = shm_lock(ns, shmid);
1174 BUG_ON(IS_ERR(shp)); 1174 BUG_ON(IS_ERR(shp));
1175 shp->shm_nattch--; 1175 shp->shm_nattch--;
@@ -1177,7 +1177,7 @@ out_nattch:
1177 shm_destroy(ns, shp); 1177 shm_destroy(ns, shp);
1178 else 1178 else
1179 shm_unlock(shp); 1179 shm_unlock(shp);
1180 up_write(&shm_ids(ns).rw_mutex); 1180 up_write(&shm_ids(ns).rwsem);
1181 return err; 1181 return err;
1182 1182
1183out_unlock: 1183out_unlock:
diff --git a/ipc/util.c b/ipc/util.c
index 2c8a93b380ba..9a1d779a20e2 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -119,7 +119,7 @@ __initcall(ipc_init);
119 119
120void ipc_init_ids(struct ipc_ids *ids) 120void ipc_init_ids(struct ipc_ids *ids)
121{ 121{
122 init_rwsem(&ids->rw_mutex); 122 init_rwsem(&ids->rwsem);
123 123
124 ids->in_use = 0; 124 ids->in_use = 0;
125 ids->seq = 0; 125 ids->seq = 0;
@@ -174,7 +174,7 @@ void __init ipc_init_proc_interface(const char *path, const char *header,
174 * @ids: Identifier set 174 * @ids: Identifier set
175 * @key: The key to find 175 * @key: The key to find
176 * 176 *
177 * Requires ipc_ids.rw_mutex locked. 177 * Requires ipc_ids.rwsem locked.
178 * Returns the LOCKED pointer to the ipc structure if found or NULL 178 * Returns the LOCKED pointer to the ipc structure if found or NULL
179 * if not. 179 * if not.
180 * If key is found ipc points to the owning ipc structure 180 * If key is found ipc points to the owning ipc structure
@@ -208,7 +208,7 @@ static struct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key)
208 * ipc_get_maxid - get the last assigned id 208 * ipc_get_maxid - get the last assigned id
209 * @ids: IPC identifier set 209 * @ids: IPC identifier set
210 * 210 *
211 * Called with ipc_ids.rw_mutex held. 211 * Called with ipc_ids.rwsem held.
212 */ 212 */
213 213
214int ipc_get_maxid(struct ipc_ids *ids) 214int ipc_get_maxid(struct ipc_ids *ids)
@@ -246,7 +246,7 @@ int ipc_get_maxid(struct ipc_ids *ids)
246 * is returned. The 'new' entry is returned in a locked state on success. 246 * is returned. The 'new' entry is returned in a locked state on success.
247 * On failure the entry is not locked and a negative err-code is returned. 247 * On failure the entry is not locked and a negative err-code is returned.
248 * 248 *
249 * Called with writer ipc_ids.rw_mutex held. 249 * Called with writer ipc_ids.rwsem held.
250 */ 250 */
251int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) 251int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
252{ 252{
@@ -312,9 +312,9 @@ static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
312{ 312{
313 int err; 313 int err;
314 314
315 down_write(&ids->rw_mutex); 315 down_write(&ids->rwsem);
316 err = ops->getnew(ns, params); 316 err = ops->getnew(ns, params);
317 up_write(&ids->rw_mutex); 317 up_write(&ids->rwsem);
318 return err; 318 return err;
319} 319}
320 320
@@ -331,7 +331,7 @@ static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
331 * 331 *
332 * On success, the IPC id is returned. 332 * On success, the IPC id is returned.
333 * 333 *
334 * It is called with ipc_ids.rw_mutex and ipcp->lock held. 334 * It is called with ipc_ids.rwsem and ipcp->lock held.
335 */ 335 */
336static int ipc_check_perms(struct ipc_namespace *ns, 336static int ipc_check_perms(struct ipc_namespace *ns,
337 struct kern_ipc_perm *ipcp, 337 struct kern_ipc_perm *ipcp,
@@ -376,7 +376,7 @@ static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
376 * Take the lock as a writer since we are potentially going to add 376 * Take the lock as a writer since we are potentially going to add
377 * a new entry + read locks are not "upgradable" 377 * a new entry + read locks are not "upgradable"
378 */ 378 */
379 down_write(&ids->rw_mutex); 379 down_write(&ids->rwsem);
380 ipcp = ipc_findkey(ids, params->key); 380 ipcp = ipc_findkey(ids, params->key);
381 if (ipcp == NULL) { 381 if (ipcp == NULL) {
382 /* key not used */ 382 /* key not used */
@@ -402,7 +402,7 @@ static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
402 } 402 }
403 ipc_unlock(ipcp); 403 ipc_unlock(ipcp);
404 } 404 }
405 up_write(&ids->rw_mutex); 405 up_write(&ids->rwsem);
406 406
407 return err; 407 return err;
408} 408}
@@ -413,7 +413,7 @@ static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
413 * @ids: IPC identifier set 413 * @ids: IPC identifier set
414 * @ipcp: ipc perm structure containing the identifier to remove 414 * @ipcp: ipc perm structure containing the identifier to remove
415 * 415 *
416 * ipc_ids.rw_mutex (as a writer) and the spinlock for this ID are held 416 * ipc_ids.rwsem (as a writer) and the spinlock for this ID are held
417 * before this function is called, and remain locked on the exit. 417 * before this function is called, and remain locked on the exit.
418 */ 418 */
419 419
@@ -621,7 +621,7 @@ struct kern_ipc_perm *ipc_obtain_object(struct ipc_ids *ids, int id)
621} 621}
622 622
623/** 623/**
624 * ipc_lock - Lock an ipc structure without rw_mutex held 624 * ipc_lock - Lock an ipc structure without rwsem held
625 * @ids: IPC identifier set 625 * @ids: IPC identifier set
626 * @id: ipc id to look for 626 * @id: ipc id to look for
627 * 627 *
@@ -748,7 +748,7 @@ int ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out)
748 * - performs some audit and permission check, depending on the given cmd 748 * - performs some audit and permission check, depending on the given cmd
749 * - returns a pointer to the ipc object or otherwise, the corresponding error. 749 * - returns a pointer to the ipc object or otherwise, the corresponding error.
750 * 750 *
751 * Call holding the both the rw_mutex and the rcu read lock. 751 * Call holding the both the rwsem and the rcu read lock.
752 */ 752 */
753struct kern_ipc_perm *ipcctl_pre_down_nolock(struct ipc_namespace *ns, 753struct kern_ipc_perm *ipcctl_pre_down_nolock(struct ipc_namespace *ns,
754 struct ipc_ids *ids, int id, int cmd, 754 struct ipc_ids *ids, int id, int cmd,
@@ -868,7 +868,7 @@ static void *sysvipc_proc_start(struct seq_file *s, loff_t *pos)
868 * Take the lock - this will be released by the corresponding 868 * Take the lock - this will be released by the corresponding
869 * call to stop(). 869 * call to stop().
870 */ 870 */
871 down_read(&ids->rw_mutex); 871 down_read(&ids->rwsem);
872 872
873 /* pos < 0 is invalid */ 873 /* pos < 0 is invalid */
874 if (*pos < 0) 874 if (*pos < 0)
@@ -895,7 +895,7 @@ static void sysvipc_proc_stop(struct seq_file *s, void *it)
895 895
896 ids = &iter->ns->ids[iface->ids]; 896 ids = &iter->ns->ids[iface->ids];
897 /* Release the lock we took in start() */ 897 /* Release the lock we took in start() */
898 up_read(&ids->rw_mutex); 898 up_read(&ids->rwsem);
899} 899}
900 900
901static int sysvipc_proc_show(struct seq_file *s, void *it) 901static int sysvipc_proc_show(struct seq_file *s, void *it)
diff --git a/ipc/util.h b/ipc/util.h
index 41a6c4d26399..0a362ffca972 100644
--- a/ipc/util.h
+++ b/ipc/util.h
@@ -94,10 +94,10 @@ void __init ipc_init_proc_interface(const char *path, const char *header,
94#define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER) 94#define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
95#define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER) 95#define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER)
96 96
97/* must be called with ids->rw_mutex acquired for writing */ 97/* must be called with ids->rwsem acquired for writing */
98int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int); 98int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
99 99
100/* must be called with ids->rw_mutex acquired for reading */ 100/* must be called with ids->rwsem acquired for reading */
101int ipc_get_maxid(struct ipc_ids *); 101int ipc_get_maxid(struct ipc_ids *);
102 102
103/* must be called with both locks acquired. */ 103/* must be called with both locks acquired. */