[lkml]   [2013]   [Mar]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: [PATCH v2 4/4] ipc: sem: do not hold ipc lock more than necessary
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

If things work, I'll clean up the whole patch series for a re-posting

All rights reversed

 \ /
  Last update: 2013-03-20 16:01    [W:0.050 / U:0.148 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site