Skip to content

Commit

Permalink
ipc: move sem_obtain_lock() rcu locking into the only caller
Browse files Browse the repository at this point in the history
sem_obtain_lock() was another of those functions that returned with the
RCU lock held for reading in the success case.  Move the RCU locking to
the caller (semtimedop()), making it more obvious.  We already did RCU
locking elsewhere in that function.

Side note: why does semtimedop() re-do the semphore lookup after the
sleep, rather than just getting a reference to the semaphore it already
looked up originally?

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>
  • Loading branch information
torvalds committed May 5, 2013
1 parent fbfd1d2 commit 321310c
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions ipc/sem.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,19 +269,18 @@ static inline void sem_unlock(struct sem_array *sma, int locknum)
/*
* sem_lock_(check_) routines are called in the paths where the rw_mutex
* is not held.
*
* The caller holds the RCU read lock.
*/
static inline struct sem_array *sem_obtain_lock(struct ipc_namespace *ns,
int id, struct sembuf *sops, int nsops, int *locknum)
{
struct kern_ipc_perm *ipcp;
struct sem_array *sma;

rcu_read_lock();
ipcp = ipc_obtain_object(&sem_ids(ns), id);
if (IS_ERR(ipcp)) {
sma = ERR_CAST(ipcp);
goto err;
}
if (IS_ERR(ipcp))
return ERR_CAST(ipcp);

sma = container_of(ipcp, struct sem_array, sem_perm);
*locknum = sem_lock(sma, sops, nsops);
Expand All @@ -293,10 +292,7 @@ static inline struct sem_array *sem_obtain_lock(struct ipc_namespace *ns,
return container_of(ipcp, struct sem_array, sem_perm);

sem_unlock(sma, *locknum);
sma = ERR_PTR(-EINVAL);
err:
rcu_read_unlock();
return sma;
return ERR_PTR(-EINVAL);
}

static inline struct sem_array *sem_obtain_object(struct ipc_namespace *ns, int id)
Expand Down Expand Up @@ -1680,6 +1676,7 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
goto out_free;
}

rcu_read_lock();
sma = sem_obtain_lock(ns, semid, sops, nsops, &locknum);

/*
Expand All @@ -1691,6 +1688,7 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
* Array removed? If yes, leave without sem_unlock().
*/
if (IS_ERR(sma)) {
rcu_read_unlock();
goto out_free;
}

Expand Down

0 comments on commit 321310c

Please sign in to comment.