svn commit: r339917 - head/sys/kern
Eric van Gyzen
vangyzen at FreeBSD.org
Tue Oct 30 14:54:16 UTC 2018
Author: vangyzen
Date: Tue Oct 30 14:54:15 2018
New Revision: 339917
URL: https://svnweb.freebsd.org/changeset/base/339917
Log:
Always stop the scheduler when entering kdb
Set curthread->td_stopsched when entering kdb via any vector.
Previously, it was only set when entering via panic, so when
entering kdb another way, mutexes and such were still "live",
and an attempt to lock an already locked mutex would panic.
Reviewed by: kib, cem
Discussed with: jhb
Tested by: pho
MFC after: 2 months
Sponsored by: Dell EMC Isilon
Differential Revision: https://reviews.freebsd.org/D17687
Modified:
head/sys/kern/subr_kdb.c
Modified: head/sys/kern/subr_kdb.c
==============================================================================
--- head/sys/kern/subr_kdb.c Tue Oct 30 14:44:12 2018 (r339916)
+++ head/sys/kern/subr_kdb.c Tue Oct 30 14:54:15 2018 (r339917)
@@ -652,9 +652,7 @@ kdb_trap(int type, int code, struct trapframe *tf)
struct kdb_dbbe *be;
register_t intr;
int handled;
-#ifdef SMP
int did_stop_cpus;
-#endif
be = kdb_dbbe;
if (be == NULL || be->dbbe_trap == NULL)
@@ -666,16 +664,17 @@ kdb_trap(int type, int code, struct trapframe *tf)
intr = intr_disable();
-#ifdef SMP
if (!SCHEDULER_STOPPED()) {
+#ifdef SMP
other_cpus = all_cpus;
CPU_NAND(&other_cpus, &stopped_cpus);
CPU_CLR(PCPU_GET(cpuid), &other_cpus);
stop_cpus_hard(other_cpus);
+#endif
+ curthread->td_stopsched = 1;
did_stop_cpus = 1;
} else
did_stop_cpus = 0;
-#endif
kdb_active++;
@@ -703,12 +702,13 @@ kdb_trap(int type, int code, struct trapframe *tf)
kdb_active--;
-#ifdef SMP
if (did_stop_cpus) {
+ curthread->td_stopsched = 0;
+#ifdef SMP
CPU_AND(&other_cpus, &stopped_cpus);
restart_cpus(other_cpus);
- }
#endif
+ }
intr_restore(intr);
More information about the svn-src-head
mailing list