diff options
author | andrei <none@none> | 2005-11-03 13:54:33 -0800 |
---|---|---|
committer | andrei <none@none> | 2005-11-03 13:54:33 -0800 |
commit | 9d7041eec59fd2059033c58e9e5427468f4446e8 (patch) | |
tree | 47234d37fcfa7a7a41081277d3da2340f303f4e0 /usr/src | |
parent | 754564661a990e58301b3840826dab55b72c2963 (diff) | |
download | illumos-joyent-9d7041eec59fd2059033c58e9e5427468f4446e8.tar.gz |
4873353 panic: mp_cpu_quiesce: cpu_thread != cpu_idle_thread
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/sun4/os/mp_startup.c | 1 | ||||
-rw-r--r-- | usr/src/uts/sun4/os/mp_states.c | 10 | ||||
-rw-r--r-- | usr/src/uts/sun4u/starfire/io/drmach.c | 3 | ||||
-rw-r--r-- | usr/src/uts/sun4u/sys/machcpuvar.h | 3 | ||||
-rw-r--r-- | usr/src/uts/sun4v/sys/machcpuvar.h | 3 |
5 files changed, 15 insertions, 5 deletions
diff --git a/usr/src/uts/sun4/os/mp_startup.c b/usr/src/uts/sun4/os/mp_startup.c index 1124e2f3fe..682815cd91 100644 --- a/usr/src/uts/sun4/os/mp_startup.c +++ b/usr/src/uts/sun4/os/mp_startup.c @@ -167,6 +167,7 @@ common_startup_init(cpu_t *cp, int cpuid) cp->cpu_lwp = NULL; cp->cpu_dispthread = tp; cp->cpu_dispatch_pri = DISP_PRIO(tp); + cp->cpu_startup_thread = tp; } /* diff --git a/usr/src/uts/sun4/os/mp_states.c b/usr/src/uts/sun4/os/mp_states.c index a764379ac6..c50f595bf1 100644 --- a/usr/src/uts/sun4/os/mp_states.c +++ b/usr/src/uts/sun4/os/mp_states.c @@ -237,7 +237,8 @@ mp_cpu_quiesce(cpu_t *cp0) for (i = 0; i < sanity_limit; i++) { if (cp->cpu_intr_actv == 0 && - cp->cpu_thread == cp->cpu_idle_thread) { + (cp->cpu_thread == cp->cpu_idle_thread || + cp->cpu_thread == cp->cpu_startup_thread)) { found_intr = 0; break; } @@ -248,9 +249,10 @@ mp_cpu_quiesce(cpu_t *cp0) if (cp->cpu_intr_actv) { cmn_err(CE_PANIC, "%s: cpu_intr_actv != 0", f); - } else if (cp->cpu_thread != cp->cpu_idle_thread) { - cmn_err(CE_PANIC, "%s: cpu_thread != cpu_idle_thread", - f); + } else if (cp->cpu_thread != cp->cpu_idle_thread && + cp->cpu_thread != cp->cpu_startup_thread) { + cmn_err(CE_PANIC, "%s: CPU %d is not quiesced", + f, cpuid); } } diff --git a/usr/src/uts/sun4u/starfire/io/drmach.c b/usr/src/uts/sun4u/starfire/io/drmach.c index 7d7ba4346a..fef4ff008f 100644 --- a/usr/src/uts/sun4u/starfire/io/drmach.c +++ b/usr/src/uts/sun4u/starfire/io/drmach.c @@ -2610,7 +2610,8 @@ drmach_cpu_shutdown_self(void) (void) spl8(); ASSERT(cp->cpu_intr_actv == 0); - ASSERT(cp->cpu_thread == cp->cpu_idle_thread); + ASSERT(cp->cpu_thread == cp->cpu_idle_thread || + cp->cpu_thread == cp->cpu_startup_thread); cp->cpu_flags = CPU_OFFLINE | CPU_QUIESCED | CPU_POWEROFF; diff --git a/usr/src/uts/sun4u/sys/machcpuvar.h b/usr/src/uts/sun4u/sys/machcpuvar.h index ef0d98e8b5..7351430049 100644 --- a/usr/src/uts/sun4u/sys/machcpuvar.h +++ b/usr/src/uts/sun4u/sys/machcpuvar.h @@ -129,10 +129,13 @@ struct machcpu { */ uint64_t intrstat[PIL_MAX+1][2]; + kthread_t *startup_thread; }; typedef struct machcpu machcpu_t; +#define cpu_startup_thread cpu_m.startup_thread + /* * Macro to access the "cpu private" data structure. */ diff --git a/usr/src/uts/sun4v/sys/machcpuvar.h b/usr/src/uts/sun4v/sys/machcpuvar.h index 2ed0b9dddc..a49e693e17 100644 --- a/usr/src/uts/sun4v/sys/machcpuvar.h +++ b/usr/src/uts/sun4v/sys/machcpuvar.h @@ -158,10 +158,13 @@ struct machcpu { uint16_t *cpu_list; /* uint16_t [NCPU] */ uint64_t cpu_list_ra; /* cpu list ra */ id_t cpu_ipipe; /* cpu exec unit id */ + kthread_t *startup_thread; }; typedef struct machcpu machcpu_t; +#define cpu_startup_thread cpu_m.startup_thread + /* * Macro to access the "cpu private" data structure. */ |