From: Linus Torvalds Date: Sat, 4 May 2013 17:13:40 +0000 (-0700) Subject: ipc: move the rcu_read_lock() from sem_lock_and_putref() into callers X-Git-Tag: v3.10-rc1~93^2~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4091fd942e96af5a0b1dfa6aac5f44153ebf7cdb;p=profile%2Fcommon%2Fkernel-common.git 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 Cc: Rik van Riel Cc: Al Viro Signed-off-by: Linus Torvalds --- diff --git a/ipc/sem.c b/ipc/sem.c index 5cf7b4c..8f5aa34 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -322,7 +322,6 @@ static inline struct sem_array *sem_obtain_object_check(struct ipc_namespace *ns static inline void sem_lock_and_putref(struct sem_array *sma) { - rcu_read_lock(); sem_lock(sma, NULL, -1); ipc_rcu_putref(sma); } @@ -1117,6 +1116,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, return -ENOMEM; } + rcu_read_lock(); sem_lock_and_putref(sma); if (sma->sem_perm.deleted) { sem_unlock(sma, -1); @@ -1166,6 +1166,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, goto out_free; } } + rcu_read_lock(); sem_lock_and_putref(sma); if (sma->sem_perm.deleted) { sem_unlock(sma, -1); @@ -1451,7 +1452,7 @@ static struct sem_undo *find_alloc_undo(struct ipc_namespace *ns, int semid) } /* step 3: Acquire the lock on semaphore array */ - /* This also does the rcu_read_lock() */ + rcu_read_lock(); sem_lock_and_putref(sma); if (sma->sem_perm.deleted) { sem_unlock(sma, -1);