• Manfred Spraul's avatar
    ipc/sem.c: Fix missing wakeups in do_smart_update_queue() · ab465df9
    Manfred Spraul authored
    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: default avatarManfred Spraul <manfred@colorfullife.com>
    Acked-by: default avatarDavidlohr Bueso <davidlohr.bueso@hp.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ab465df9
sem.c 47.2 KB