Subject: Re: Moving scheduler semantics from cpu_switch() to kern_synch.c
To: None <matt@3am-software.com>
From: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
List: tech-kern
Date: 09/21/2006 02:46:04
> I'd rather cpu_idle() do the looping.  Shouldn't cpu_idle() also
> unset curlwp?  If so, I'm not sure I like returning back to the
> scheduler on a idle stack with no curlwp.  Instead cpu_idle() should
> I think we should add a member to cpu_info which indicates cpu_idle
> should continue to loop.  When nonzero, it represents that there may
> be a new lwp to be run.
> 
> void cpu_idle(struct lwp (*getnext)()) __attribute__((__noreturn__));
> 
> cpu_idle would call back its first argument to get the next lwp to
> run.  When it returns new lwp, it will have already been removed
> from the runqueue.
> 
> cpu_switch should die; either we call cpu_switchto or cpu_idle.

what is the getnext callback for?
unlike cpu_switch(), cpu_idle() doesn't need to know the next lwp to run.
checking a member in cpu_info should be enough.
(btw, why noreturn?)

i think what gmcgarry did on his branch is nearly the best, except:
	- cpu_idle shouldn't know about sched_whichqs. (as you say)
	- it's better to make cpu_idle and maybe cpu_switchto be called
	  without sched_lock held.

YAMAMOTO Takashi