Re: [PATCH -v11][RFC] mutex: implement adaptive spinning
From: Peter Zijlstra <peterz@infradead.org>
Date: 2009-01-14 17:23:01
Also in:
linux-fsdevel, lkml
On Wed, 2009-01-14 at 18:18 +0100, Nick Piggin wrote:
quoted
@@ -173,21 +237,21 @@ __mutex_lock_common(struct mutex *lock, spin_unlock_mutex(&lock->wait_lock, flags); debug_mutex_free_waiter(&waiter); + preempt_enable(); return -EINTR; } __set_task_state(task, state); /* didnt get the lock, go to sleep: */ spin_unlock_mutex(&lock->wait_lock, flags); - schedule(); + __schedule();Why does this need to do a preempt-disabled schedule? After we schedule away, the next task can do arbitrary things or reschedule itself, so if we have not anticipated such a condition here, then I can't see what __schedule protects. At least a comment is in order?
From: http://programming.kicks-ass.net/kernel-patches/mutex-adaptive-spin/mutex-preempt.patch Subject: mutex: preemption fixes From: Peter Zijlstra <redacted> Date: Wed Jan 14 15:36:26 CET 2009 The problem is that dropping the spinlock right before schedule is a voluntary preemption point and can cause a schedule, right after which we schedule again. Fix this inefficiency by keeping preemption disabled until we schedule, do this by explicitly disabling preemption and providing a schedule() variant that assumes preemption is already disabled. Signed-off-by: Peter Zijlstra <redacted>
Pity to add the call overhead to schedule just for this case.
Good point, seeing any way around that?
BTW. __schedule shouldn't need to be asmlinkage?
TBH I've no clue, probably not, Ingo?