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);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to