unconditionally stop other cpus when entering kdb in smp system

... and thus retire debug.kdb.stop_cpus tunable/sysctl.
The knob was to work around CPU stopping issues, which since have been
either fixed or greatly reduced.  kdb should really operate in a special
environment with scheduler stopped and interrupts disabled to provide
deterministic debugging.

Discussed with:	attilio, rwatson
X-MFC after:	2 months or never
This commit is contained in:
Andriy Gapon 2011-06-25 10:28:16 +00:00
parent 1aac6ac94a
commit 31c5a6e2b8

View File

@ -87,20 +87,6 @@ SYSCTL_PROC(_debug_kdb, OID_AUTO, trap, CTLTYPE_INT | CTLFLAG_RW, NULL, 0,
SYSCTL_PROC(_debug_kdb, OID_AUTO, trap_code, CTLTYPE_INT | CTLFLAG_RW, NULL, 0,
kdb_sysctl_trap_code, "I", "set to cause a page fault via code access");
/*
* Flag indicating whether or not to IPI the other CPUs to stop them on
* entering the debugger. Sometimes, this will result in a deadlock as
* stop_cpus() waits for the other cpus to stop, so we allow it to be
* disabled. In order to maximize the chances of success, use a hard
* stop for that.
*/
#ifdef SMP
static int kdb_stop_cpus = 1;
SYSCTL_INT(_debug_kdb, OID_AUTO, stop_cpus, CTLFLAG_RW | CTLFLAG_TUN,
&kdb_stop_cpus, 0, "stop other CPUs when entering the debugger");
TUNABLE_INT("debug.kdb.stop_cpus", &kdb_stop_cpus);
#endif
/*
* Flag to indicate to debuggers why the debugger was entered.
*/
@ -515,9 +501,6 @@ kdb_trap(int type, int code, struct trapframe *tf)
{
struct kdb_dbbe *be;
register_t intr;
#ifdef SMP
int did_stop_cpus;
#endif
int handled;
be = kdb_dbbe;
@ -531,8 +514,7 @@ kdb_trap(int type, int code, struct trapframe *tf)
intr = intr_disable();
#ifdef SMP
if ((did_stop_cpus = kdb_stop_cpus) != 0)
stop_cpus_hard(PCPU_GET(other_cpus));
stop_cpus_hard(PCPU_GET(other_cpus));
#endif
kdb_active++;
@ -558,8 +540,7 @@ kdb_trap(int type, int code, struct trapframe *tf)
kdb_active--;
#ifdef SMP
if (did_stop_cpus)
restart_cpus(stopped_cpus);
restart_cpus(stopped_cpus);
#endif
intr_restore(intr);