cvs commit: src/sys/kern sched_ule.c
Jeff Roberson
jroberson at chesapeake.net
Wed Jan 24 06:12:35 UTC 2007
On Wed, 24 Jan 2007, David Xu wrote:
> Jeff Roberson wrote:
>
>>> if idlethread is preempted, who will clear its idle bit in idle_cpus_mask
>>> ?
>>
>>
>> idle_cpus_mask was broken before for all schedulers. This commit didn't
>> change that. ULE doesn't use idle_cpus_mask and it's idlethread doesn't
>> set or clear it. The idle thread for the other schedulers remains
>> unchanged.
>>
> I havn't read ULE code, but 4BSD has following code:
>
This is the very same code that was there before. I didn't change it. I
just moved it into the schedulers. It was always broken with preemption.
I tried to use idle_cpus_mask in ULE but found that it always was set for
most CPUs. You will find that IPI_PREEMPT also had no effect but I fixed
that recently.
Jeff
> void
> sched_idletd(void *dummy)
> {
> struct proc *p;
> struct thread *td;
> #ifdef SMP
> cpumask_t mycpu;
> #endif
>
> td = curthread;
> p = td->td_proc;
> #ifdef SMP
> mycpu = PCPU_GET(cpumask);
> mtx_lock_spin(&sched_lock);
> idle_cpus_mask |= mycpu;
> mtx_unlock_spin(&sched_lock);
> #endif
> for (;;) {
> mtx_assert(&Giant, MA_NOTOWNED);
>
>
> how about if the idlethread is preempted here ? mycpu is not cleared.
>
>
> while (sched_runnable() == 0)
> cpu_idle();
>
> mtx_lock_spin(&sched_lock);
> #ifdef SMP
> idle_cpus_mask &= ~mycpu;
> #endif
> mi_switch(SW_VOL, NULL);
> #ifdef SMP
> idle_cpus_mask |= mycpu;
> #endif
> mtx_unlock_spin(&sched_lock);
> }
> }
>
>> Julian wants to set idle_cpus_mask in sched_switch() which would make it
>> accurate no matter how idlethread switched out. that seems much more
>> reasonable to me.
>>
>
> I haven't seen sched_switch clears it, so at least, it should be fixed for
> current 4BSD scheduler.
>
>> Cheers,
>> Jeff
>
> Regards,
> David Xu
>
More information about the cvs-src
mailing list