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>
