mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
kern_reboot(): don't clear kdb_active
It is possible to reach this function from ddb via the "reset" command. When this happens, we don't actually exit kdb, meaning we never execute the latter steps of kdb_break() to restore the system state (e.g. re-enable scheduler). Therefore, we should not clear the kdb_active flag in this function, as the debugger is still active. Put differently, kern_reboot() is not an authority on kdb state, and should not touch it. The original motivation for this assignment is not clear; I have checked thoroughly and I am convinced it is not required by any reset code. This fixes an edge case where a panic can be triggered during reset from ddb: 1. Enter ddb via keyboard break sequence (KERNEL_PANICKED() == false && td->td_critnest > 0) 2. Execute the "reset" command 3. kern_reboot() sets kdb_active = false 4. A witness_checkorder() call via shutdown handler sees !kdb_active and panics Reviewed by: imp, markj MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D42684
This commit is contained in:
parent
960612a19f
commit
4e78a766f6
|
@ -96,13 +96,6 @@ variable to
|
|||
.Dv 1 ,
|
||||
indicating that the reboot process has begun and cannot be stopped.
|
||||
.It
|
||||
Set the
|
||||
.Va kdb_active
|
||||
variable to
|
||||
.Dv 0 ,
|
||||
indicating that execution has left the kernel debugger, if it was previously
|
||||
active.
|
||||
.It
|
||||
Unless the
|
||||
.Dv RB_NOSYNC
|
||||
flag is set in
|
||||
|
|
|
@ -492,9 +492,6 @@ kern_reboot(int howto)
|
|||
rebooting = 1;
|
||||
reboottrace(howto);
|
||||
|
||||
/* We are out of the debugger now. */
|
||||
kdb_active = 0;
|
||||
|
||||
/*
|
||||
* Do any callouts that should be done BEFORE syncing the filesystems.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue