Skip site navigation (1)Skip section navigation (2)
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>