Thread (92 messages) 92 messages, 17 authors, 2009-01-16

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?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help