On 03/05/2013 04:36 AM, Davidlohr Bueso wrote:
@@ -1476,8 +1539,8 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct
sembuf __user *, tsops,
queue.sleeper = current;
sleep_again:
- current->state = TASK_INTERRUPTIBLE;
sem_unlock(sma);
+ current->state = TASK_INTERRUPTIBLE;
if (timeout)
jiffies_left = schedule_timeout(jiffies_left);
After modifying my test case to start with a semaphore value of 1 on
every semaphore, and do down followed by up (to have only one process
take each semaphore at a time), I started seeing lost wakeups and the
test case being stuck.
I believe the change above is the cause of that issue.
By unlocking before setting current->state to TASK_INTERRUPTIBLE,
there is a small window where the next lock holder can grab the
lock and wake us up, before we set ourselves to TASK_INTERRUPTIBLE
and go to sleep.
I have reverted your change in my code and am building a test kernel
now.
If things work, I'll clean up the whole patch series for a re-posting
today.