Date: Wed, 20 Apr 2011 18:02:42 -0400 From: Ryan Stone <rysto32@gmail.com> To: John Baldwin <jhb@freebsd.org> Cc: freebsd-current@freebsd.org, Ed Maste <emaste@freebsd.org> Subject: Re: sched_4bsd startup crash trying to run a bound thread on an AP that hasn't started Message-ID: <BANLkTin9MgwyZtyiLWJsHbFxv0ihicbiEg@mail.gmail.com> In-Reply-To: <201104061429.50185.jhb@freebsd.org> References: <BANLkTinSyDaY-06N95n8c1NxOSdEnb5FkQ@mail.gmail.com> <201104060836.56542.jhb@freebsd.org> <BANLkTinvisvGiQOs5w-nsxzRVbJUN5%2B5yQ@mail.gmail.com> <201104061429.50185.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Apr 6, 2011 at 2:29 PM, John Baldwin <jhb@freebsd.org> wrote: > I guess one other option would be something like this: > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (smp_started && (td->td_pinned !=3D 0 |= | td->td_flags & TDF_BOUND || > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ts->ts_flags & TSF_AFFINITY)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (td->td_pinned !=3D 0) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu =3D td= ->td_lastcpu; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else if (td->td_flags & TD= F_BOUND) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Find CP= U from bound runq. */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0KASSERT(..= .); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu =3D ts= ->ts_runq - &runq_pcpu[0]; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} else > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Find a = valid CPU for our cpuset. */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu =3D sc= hed_pickcpu(td); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ts->ts_runq =3D &runq_pcpu= [cpu]; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0single_cpu =3D 1; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0CTR3(KTR_RUNQ, ...); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Global runq case. */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > > This also avoids duplicating some common code to all the single_cpu cases= . > > -- > John Baldwin > I went with this option. Does this look right? Index: sys/kern/sched_4bsd.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/kern/sched_4bsd.c (revision 220603) +++ sys/kern/sched_4bsd.c (working copy) @@ -1246,30 +1246,28 @@ } TD_SET_RUNQ(td); - if (td->td_pinned !=3D 0) { - cpu =3D td->td_lastcpu; + /* + * If SMP is not started, don't obey any requested CPU pinning as t= hat + * CPU has either not yet started or it is curcpu. Trying to run a + * thread on a CPU that has not yet started will panic the system. + */ + if (smp_started && (td->td_pinned !=3D 0 || td->td_flags & TDF_BOUN= D || + ts->ts_flags & TSF_AFFINITY)) { + if (td->td_pinned !=3D 0) + cpu =3D td->td_lastcpu; + else if (td->td_flags & TDF_BOUND) { + /* Find CPU from bound runq. */ + KASSERT(SKE_RUNQ_PCPU(ts), + ("sched_add: bound td_sched not on cpu runq")); + cpu =3D ts->ts_runq - &runq_pcpu[0]; + } else + /* Find a valid CPU for our cpuset */ + cpu =3D sched_pickcpu(td); ts->ts_runq =3D &runq_pcpu[cpu]; single_cpu =3D 1; CTR3(KTR_RUNQ, "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, = td, cpu); - } else if (td->td_flags & TDF_BOUND) { - /* Find CPU from bound runq. */ - KASSERT(SKE_RUNQ_PCPU(ts), - ("sched_add: bound td_sched not on cpu runq")); - cpu =3D ts->ts_runq - &runq_pcpu[0]; - single_cpu =3D 1; - CTR3(KTR_RUNQ, - "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, = td, - cpu); - } else if (ts->ts_flags & TSF_AFFINITY) { - /* Find a valid CPU for our cpuset */ - cpu =3D sched_pickcpu(td); - ts->ts_runq =3D &runq_pcpu[cpu]; - single_cpu =3D 1; - CTR3(KTR_RUNQ, - "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, = td, - cpu); } else { CTR2(KTR_RUNQ, "sched_add: adding td_sched:%p (td:%p) to gbl runq", ts= ,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTin9MgwyZtyiLWJsHbFxv0ihicbiEg>