ipc/sem.c: Fix missing wakeups in do_smart_update_queue()
authorManfred Spraul <manfred@colorfullife.com>
Sun, 26 May 2013 09:08:52 +0000 (11:08 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 26 May 2013 22:14:51 +0000 (15:14 -0700)
commitab465df9dda42a997f7537c875127eeb6a88158c
tree28a1ec28c15f1b59c938b7757c8f56eed0de0ecd
parent89ff77837a67994e4a4a20bb648687fbcc3083f2
ipc/sem.c: Fix missing wakeups in do_smart_update_queue()

do_smart_update_queue() is called when an operation (semop,
semctl(SETVAL), semctl(SETALL), ...) modified the array.  It must check
which of the sleeping tasks can proceed.

do_smart_update_queue() missed a few wakeups:
 - if a sleeping complex op was completed, then all per-semaphore queues
   must be scanned - not only those that were modified by *sops
 - if a sleeping simple op proceeded, then the global queue must be
   scanned again

And:
 - the test for "|sops == NULL) before scanning the global queue is not
   required: If the global queue is empty, then it doesn't need to be
   scanned - regardless of the reason for calling do_smart_update_queue()

The patch is not optimized, i.e.  even completing a wait-for-zero
operation causes a rescan.  This is done to keep the patch as simple as
possible.

Signed-off-by: Manfred Spraul <manfred@colorfullife.com>
Acked-by: Davidlohr Bueso <davidlohr.bueso@hp.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
ipc/sem.c