diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-04 13:13:40 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-04 20:19:39 -0400 |
| commit | 4091fd942e96af5a0b1dfa6aac5f44153ebf7cdb (patch) | |
| tree | 0455a439ad1a9884018286670e49c4e18cfaa359 /ipc | |
| parent | 73b29505c36eeb4751eccad41f6aad78562521f8 (diff) | |
ipc: move the rcu_read_lock() from sem_lock_and_putref() into callers
This is another ipc semaphore locking cleanup, trying to make the
locking more straightforward. We move the rcu read locking into the
callers of sem_lock_and_putref(), which in general means that we now
mostly do the rcu_read_lock() and rcu_read_unlock() in the same
function.
Mostly. We still have the ipc_addid/newary/freeary mess, and things
like ipcctl_pre_down_nolock().
Acked-by: Davidlohr Bueso <davidlohr.bueso@hp.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc')
| -rw-r--r-- | ipc/sem.c | 5 |
1 files changed, 3 insertions, 2 deletions
| @@ -322,7 +322,6 @@ static inline struct sem_array *sem_obtain_object_check(struct ipc_namespace *ns | |||
| 322 | 322 | ||
| 323 | static inline void sem_lock_and_putref(struct sem_array *sma) | 323 | static inline void sem_lock_and_putref(struct sem_array *sma) |
| 324 | { | 324 | { |
| 325 | rcu_read_lock(); | ||
| 326 | sem_lock(sma, NULL, -1); | 325 | sem_lock(sma, NULL, -1); |
| 327 | ipc_rcu_putref(sma); | 326 | ipc_rcu_putref(sma); |
| 328 | } | 327 | } |
| @@ -1117,6 +1116,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, | |||
| 1117 | return -ENOMEM; | 1116 | return -ENOMEM; |
| 1118 | } | 1117 | } |
| 1119 | 1118 | ||
| 1119 | rcu_read_lock(); | ||
| 1120 | sem_lock_and_putref(sma); | 1120 | sem_lock_and_putref(sma); |
| 1121 | if (sma->sem_perm.deleted) { | 1121 | if (sma->sem_perm.deleted) { |
| 1122 | sem_unlock(sma, -1); | 1122 | sem_unlock(sma, -1); |
| @@ -1166,6 +1166,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, | |||
| 1166 | goto out_free; | 1166 | goto out_free; |
| 1167 | } | 1167 | } |
| 1168 | } | 1168 | } |
| 1169 | rcu_read_lock(); | ||
| 1169 | sem_lock_and_putref(sma); | 1170 | sem_lock_and_putref(sma); |
| 1170 | if (sma->sem_perm.deleted) { | 1171 | if (sma->sem_perm.deleted) { |
| 1171 | sem_unlock(sma, -1); | 1172 | sem_unlock(sma, -1); |
| @@ -1451,7 +1452,7 @@ static struct sem_undo *find_alloc_undo(struct ipc_namespace *ns, int semid) | |||
| 1451 | } | 1452 | } |
| 1452 | 1453 | ||
| 1453 | /* step 3: Acquire the lock on semaphore array */ | 1454 | /* step 3: Acquire the lock on semaphore array */ |
| 1454 | /* This also does the rcu_read_lock() */ | 1455 | rcu_read_lock(); |
| 1455 | sem_lock_and_putref(sma); | 1456 | sem_lock_and_putref(sma); |
| 1456 | if (sma->sem_perm.deleted) { | 1457 | if (sma->sem_perm.deleted) { |
| 1457 | sem_unlock(sma, -1); | 1458 | sem_unlock(sma, -1); |
