* Matthew Wilcox <matthew@wil.cx> wrote:this needs to check for ret != 0 as well, otherwise we can be woken but a timeout can also trigger => we lose a wakeup. I.e. like the patch below. Hm? Ingo -----------------------------> Subject: semaphore: fix #3 From: Ingo Molnar <mingo@elte.hu> Date: Sun May 11 09:51:07 CEST 2008 Signed-off-by: Ingo Molnar <mingo@elte.hu> --- kernel/semaphore.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) Index: linux/kernel/semaphore.c =================================================================== --- linux.orig/kernel/semaphore.c +++ linux/kernel/semaphore.c @@ -194,6 +194,13 @@ struct semaphore_waiter { struct task_struct *task; }; +static noinline void __sched __up(struct semaphore *sem) +{ + struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, + struct semaphore_waiter, list); + wake_up_process(waiter->task); +} + /* * Because this function is inlined, the 'state' parameter will be * constant, and thus optimised away by the compiler. Likewise the @@ -231,6 +238,10 @@ static inline int __sched __down_common( } list_del(&waiter.list); + if (unlikely(!list_empty(&sem->wait_list)) && + ((sem->count > 1) || ret)) + __up(sem); + return ret; } @@ -254,9 +265,10 @@ static noinline int __sched __down_timeo return __down_common(sem, TASK_UNINTERRUPTIBLE, jiffies); } -static noinline void __sched __up(struct semaphore *sem) -{ - struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, - struct semaphore_waiter, list); - wake_up_process(waiter->task); -} + + /* + * Rotate sleepers - to make sure all of them get woken in case + * of parallel up()s: + */ + list_move_tail(&waiter->list, &sem->wait_list); + --
| Greg Kroah-Hartman | [PATCH 006/196] Chinese: add translation of oops-tracing.txt |
| Andrew Morton | Re: -mm merge plans for 2.6.23 -- sys_fallocate |
| Eric W. Biederman | [PATCH] nfs lockd reclaimer: Convert to kthread API |
| James Bottomley | Re: Integration of SCST in the mainstream Linux kernel |
git: | |
| David Miller | [GIT]: Networking |
| Gerrit Renker | [PATCH 03/37] dccp: List management for new feature negotiation |
| David Miller | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
