Fix scheduler deadlock on some platforms.
authorDavid S. Miller <davem@nuts.ninka.net>
Sun, 10 Mar 2002 23:04:58 +0000 (15:04 -0800)
committerDavid S. Miller <davem@nuts.ninka.net>
Sun, 10 Mar 2002 23:04:58 +0000 (15:04 -0800)
commite9a1648bba11852b701a7efc5da2a61abd9b7115
tree4256970bd6dd0b5cf9062a0ffe49a8bb54e4c72f
parent50b1b006812d8642e02df5c661bf53d8752b4403
Fix scheduler deadlock on some platforms.

Some platforms need to grab mm->page_table_lock during switch_mm().
On the other hand code like swap_out() in mm/vmscan.c needs to hold
mm->page_table_lock during wakeups which needs to grab the runqueue
lock.  This creates a conflict and the resolution chosen here is to
not hold the runqueue lock during context_switch().

The implementation is specifically a "frozen" state implemented as a
spinlock, which is held around the context_switch() call.  This allows
the runqueue lock to be dropped during this time yet prevent another cpu
from running the "not switched away from yet" task.
kernel/sched.c