Date: Tue, 23 Jan 2007 22:12:49 -0800 (PST) From: Jeff Roberson <jroberson@chesapeake.net> To: David Xu <davidxu@FreeBSD.org> Cc: src-committers@FreeBSD.org, jhb@FreeBSD.org, cvs-src@FreeBSD.org, Jeff Roberson <jeff@FreeBSD.org>, cvs-all@FreeBSD.org, Julian Elischer <julian@FreeBSD.org> Subject: Re: cvs commit: src/sys/kern sched_ule.c Message-ID: <20070123220934.H564@10.0.0.1> In-Reply-To: <45B6E2A5.6080404@freebsd.org> References: <200701230850.l0N8oZV2065483@repoman.freebsd.org> <200701241147.17846.davidxu@freebsd.org> <20070123200041.Y564@10.0.0.1> <45B6E2A5.6080404@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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
>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070123220934.H564>
