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); |