Subject: Context switch revamp
To: None <tech-kern@netbsd.org>
From: Gregory McGarry <g.mcgarry@ieee.org>
List: tech-kern
Date: 09/13/2002 08:33:39
I'm keen to separate the scheduler and the context switching
functionality.  This is useful for the following reasons:

	- simplifies the possibility of replacing the scheduler;
	- aligns better with the scheduler activations changes;
	- allows microtime optimisations if switching to self; and
	- cleans up the horrendous cpu_switch() code.

To achieve this, I propose changing the following function:

	/*
	 * void cpu_switch(struct proc *curp, struct proc *newp)
	 *
	 * Switch from process curp to process newp.  Scheduler
	 * lock must be held and interrupts disabled.
	 */

and the addition of the following functions:

	/*
	 * struct proc *chooseproc(void)
	 *
	 * Find a runnable process.  Wait if necessary.  Scheduler
	 * lock must be held.
	 */

	/*
	 * void cpu_idle(void)
	 *
	 * Idle.  Scheduler lock must be held and interrupts
	 * disabled.
	 */

With these changes I have been able to make chooseproc() largely
machine independent and push it up into mi_switch().  The ultimate
goal would be to push it even higher out of mi_switch().  I have
kept chooseproc() as an assembler routine ATM.

These changes are easy to do piecemeal.  So I suggest introducing
something like __HAVE_CHOOSEPROC to simplify a changeover for
each architecture.

I have done this successfully on i386 and mips.  A first-go
proof-of-concept for i386 is available at:

	ftp://ftp.netbsd.org/pub/NetBSD/misc/gmcgarry/switch.diff

Shouldn't take much to get the patch going.  The i386 stuff still
needs a cleanup.  In fact, I think the i386 code is overly aggressive
with interrupt blocking, but its not clear what the run queue
requirements are with respect to interrupt protection.

I'm looking for a "Let's do it, clean it up", or a "I don't think so".

	-- Gregory McGarry <g.mcgarry@ieee.org>