summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorandrei <none@none>2005-11-03 13:54:33 -0800
committerandrei <none@none>2005-11-03 13:54:33 -0800
commit9d7041eec59fd2059033c58e9e5427468f4446e8 (patch)
tree47234d37fcfa7a7a41081277d3da2340f303f4e0 /usr/src
parent754564661a990e58301b3840826dab55b72c2963 (diff)
downloadillumos-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.c1
-rw-r--r--usr/src/uts/sun4/os/mp_states.c10
-rw-r--r--usr/src/uts/sun4u/starfire/io/drmach.c3
-rw-r--r--usr/src/uts/sun4u/sys/machcpuvar.h3
-rw-r--r--usr/src/uts/sun4v/sys/machcpuvar.h3
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.
*/