From 9d7041eec59fd2059033c58e9e5427468f4446e8 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 3 Nov 2005 13:54:33 -0800 Subject: 4873353 panic: mp_cpu_quiesce: cpu_thread != cpu_idle_thread --- usr/src/uts/sun4/os/mp_startup.c | 1 + usr/src/uts/sun4/os/mp_states.c | 10 ++++++---- usr/src/uts/sun4u/starfire/io/drmach.c | 3 ++- usr/src/uts/sun4u/sys/machcpuvar.h | 3 +++ usr/src/uts/sun4v/sys/machcpuvar.h | 3 +++ 5 files changed, 15 insertions(+), 5 deletions(-) (limited to 'usr/src') 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. */ -- cgit v1.2.3