ipc/sem.c: handle spurious wakeups
semtimedop() does not handle spurious wakeups, it returns -EINTR to user space. Most other schedule() users would just loop and not return to user space. The patch adds such a loop to semtimedop() Signed-off-by: Manfred Spraul <manfred@colorfullife.com> Reported-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Mike Galbraith <efault@gmx.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3c24783bb2
commit
0b0577f608
1 changed files with 9 additions and 0 deletions
|
@ -1426,6 +1426,8 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
|
|||
|
||||
queue.status = -EINTR;
|
||||
queue.sleeper = current;
|
||||
|
||||
sleep_again:
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
sem_unlock(sma);
|
||||
|
||||
|
@ -1478,6 +1480,13 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
|
|||
*/
|
||||
if (timeout && jiffies_left == 0)
|
||||
error = -EAGAIN;
|
||||
|
||||
/*
|
||||
* If the wakeup was spurious, just retry
|
||||
*/
|
||||
if (error == -EINTR && !signal_pending(current))
|
||||
goto sleep_again;
|
||||
|
||||
unlink_queue(sma, &queue);
|
||||
|
||||
out_unlock_free:
|
||||
|
|
Loading…
Reference in a new issue