on 01/12/2011 22:53 John Baldwin said the following: > On Thursday, December 01, 2011 3:42:24 pm Andriy Gapon wrote: >> Returning to critical_exit, what do you think about the following patch? >> I guess that it could be committed independently of / before the >> SCHEDULER_STOPPED thing. >> >> commit ee3d1a04985e86911a68d854439ae8c5429b7bd5 >> Author: Andriy Gapon <avg_at_icyb.net.ua> >> Date: Thu Dec 1 18:53:36 2011 +0200 >> >> critical_exit: ignore td_owepreempt if kdb_active >> >> calling mi_switch in such a context result in a recursion via >> kdb_switch >> >> diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c >> index 93cbf7b..885dc22 100644 >> --- a/sys/kern/kern_switch.c >> +++ b/sys/kern/kern_switch.c >> _at__at_ -200,7 +200,7 _at__at_ critical_exit(void) >> >> if (td->td_critnest == 1) { >> td->td_critnest = 0; >> - if (td->td_owepreempt) { >> + if (td->td_owepreempt && !kdb_active) { >> td->td_critnest = 1; >> thread_lock(td); >> td->td_critnest--; > > I think this is fine, but I'd probably change this to SCHEDULER_STOPPED() > in the SCHEDULER_STOPPED() patch. I don't understand why... What if kdb is entered for some other reason, not because of panic? In that case SCHEDULER_STOPPED() would be false, but it is still possible to find a way into mi_switch. The SCHEDULER_STOPPED patch adds this: _at__at_ -428,6 +428,8 _at__at_ mi_switch(int flags, struct thread *newtd) */ if (kdb_active) kdb_switch(); + if (SCHEDULER_STOPPED()) + return; if (flags & SW_VOL) { td->td_ru.ru_nvcsw++; td->td_swvoltick = ticks; -- Andriy GaponReceived on Thu Dec 01 2011 - 20:42:36 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:21 UTC