Page MenuHomeFreeBSD

D32797.id97877.diff
No OneTemporary

D32797.id97877.diff

Index: sys/arm/arm/mp_machdep.c
===================================================================
--- sys/arm/arm/mp_machdep.c
+++ sys/arm/arm/mp_machdep.c
@@ -182,6 +182,7 @@
pc->pc_curthread = pc->pc_idlethread;
pc->pc_curpcb = pc->pc_idlethread->td_pcb;
set_curthread(pc->pc_idlethread);
+ schedinit_ap();
#ifdef VFP
vfp_init();
#endif
Index: sys/arm64/arm64/mp_machdep.c
===================================================================
--- sys/arm64/arm64/mp_machdep.c
+++ sys/arm64/arm64/mp_machdep.c
@@ -255,6 +255,7 @@
/* Initialize curthread */
KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
pcpup->pc_curthread = pcpup->pc_idlethread;
+ schedinit_ap();
/* Initialize curpmap to match TTBR0's current setting. */
pmap0 = vmspace_pmap(&vmspace0);
Index: sys/kern/sched_4bsd.c
===================================================================
--- sys/kern/sched_4bsd.c
+++ sys/kern/sched_4bsd.c
@@ -678,6 +678,13 @@
mtx_init(&sched_lock, "sched lock", NULL, MTX_SPIN);
}
+void
+schedinit_ap(void)
+{
+
+ /* Nothing needed. */
+}
+
int
sched_runnable(void)
{
Index: sys/kern/sched_ule.c
===================================================================
--- sys/kern/sched_ule.c
+++ sys/kern/sched_ule.c
@@ -1743,6 +1743,16 @@
ts0->ts_cpu = curcpu; /* set valid CPU number */
}
+void
+schedinit_ap(void)
+{
+
+#ifdef SMP
+ PCPU_SET(sched, DPCPU_PTR(tdq));
+#endif
+ PCPU_GET(idlethread)->td_lock = TDQ_LOCKPTR(TDQ_SELF());
+}
+
/*
* This is only somewhat accurate since given many processes of the same
* priority they will switch when their slices run out, which will be
@@ -2973,19 +2983,15 @@
struct thread *newtd;
struct tdq *tdq;
+ /* TDQ_SELF() not ok until after schedinit_ap(). */
+ tdq = TDQ_SELF();
if (__predict_false(td == NULL)) {
-#ifdef SMP
- PCPU_SET(sched, DPCPU_PTR(tdq));
-#endif
/* Correct spinlock nesting and acquire the correct lock. */
- tdq = TDQ_SELF();
TDQ_LOCK(tdq);
spinlock_exit();
PCPU_SET(switchtime, cpu_ticks());
PCPU_SET(switchticks, ticks);
- PCPU_GET(idlethread)->td_lock = TDQ_LOCKPTR(tdq);
} else {
- tdq = TDQ_SELF();
THREAD_LOCK_ASSERT(td, MA_OWNED);
THREAD_LOCKPTR_ASSERT(td, TDQ_LOCKPTR(tdq));
tdq_load_rem(tdq, td);
Index: sys/mips/mips/mp_machdep.c
===================================================================
--- sys/mips/mips/mp_machdep.c
+++ sys/mips/mips/mp_machdep.c
@@ -311,6 +311,7 @@
/* Initialize curthread. */
KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
PCPU_SET(curthread, PCPU_GET(idlethread));
+ schedinit_ap();
mtx_lock_spin(&ap_boot_mtx);
Index: sys/powerpc/aim/mp_cpudep.c
===================================================================
--- sys/powerpc/aim/mp_cpudep.c
+++ sys/powerpc/aim/mp_cpudep.c
@@ -134,6 +134,7 @@
#endif
pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
sp = pcpup->pc_curpcb->pcb_sp;
+ initsched_ap();
return (sp);
}
Index: sys/powerpc/booke/mp_cpudep.c
===================================================================
--- sys/powerpc/booke/mp_cpudep.c
+++ sys/powerpc/booke/mp_cpudep.c
@@ -85,6 +85,7 @@
#endif
pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
sp = pcpup->pc_curpcb->pcb_sp;
+ initsched_ap();
/* XXX shouldn't the pcb_sp be checked/forced for alignment here?? */
Index: sys/riscv/riscv/mp_machdep.c
===================================================================
--- sys/riscv/riscv/mp_machdep.c
+++ sys/riscv/riscv/mp_machdep.c
@@ -248,6 +248,7 @@
/* Initialize curthread */
KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
pcpup->pc_curthread = pcpup->pc_idlethread;
+ schedinit_ap();
/*
* Identify current CPU. This is necessary to setup
Index: sys/sys/sched.h
===================================================================
--- sys/sys/sched.h
+++ sys/sys/sched.h
@@ -226,6 +226,11 @@
* Fixup scheduler state for proc0 and thread0
*/
void schedinit(void);
+
+/*
+ * Fixup scheduler state for secondary APs
+ */
+void schedinit_ap(void);
#endif /* _KERNEL */
/* POSIX 1003.1b Process Scheduling */
Index: sys/x86/x86/mp_x86.c
===================================================================
--- sys/x86/x86/mp_x86.c
+++ sys/x86/x86/mp_x86.c
@@ -1040,6 +1040,7 @@
/* Initialize curthread. */
KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
PCPU_SET(curthread, PCPU_GET(idlethread));
+ schedinit_ap();
mtx_lock_spin(&ap_boot_mtx);

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 12, 5:37 PM (12 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23633291
Default Alt Text
D32797.id97877.diff (4 KB)

Event Timeline