Messages in this thread | | | From | Ani Sinha <> | Date | Fri, 11 Dec 2015 10:50:59 -0800 | Subject | Re: new warning on sysrq kernel crash trigger |
| |
Well I can certainly send a patch but I wonder if simply using SRCU for this one instance in Rik's original patch will not break anything else. Rik, please provide your thoughts.
On Thu, Dec 10, 2015 at 9:26 PM, Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote: > On Thu, Dec 10, 2015 at 03:57:09PM -0800, Ani Sinha wrote: >> Hi guys >> >> I am noticing a new warning in linux 3.18 which we did not see before >> in linux 3.4 : >> >> bash-4.1# echo c > /proc/sysrq-trigger >> [ 978.807185] BUG: sleeping function called from invalid context at >> ../arch/x86/mm/fault.c:1187 >> [ 978.909816] in_atomic(): 0, irqs_disabled(): 0, pid: 4706, name: bash >> [ 978.987358] Preemption disabled at:[<ffffffff81484339>] printk+0x48/0x4a >> >> >> I have bisected this to the following change : >> >> commit 984d74a72076a12b400339973e8c98fd2fcd90e5 >> Author: Rik van Riel <riel@redhat.com> >> Date: Fri Jun 6 14:38:13 2014 -0700 >> >> sysrq: rcu-ify __handle_sysrq >> >> >> the rcu_read_lock() in handle_sysrq() bumps up >> current->rcu_read_lock_nesting. Hence, in __do_page_fault() when it >> calls might_sleep() in x86/mm/fault.c line 1191, >> preempt_count_equals(0) returns false and hence the warning is >> printed. >> >> One way to handle this would be to do something like this: >> >> diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c >> index eef44d9..d4dbe22 100644 >> --- a/arch/x86/mm/fault.c >> +++ b/arch/x86/mm/fault.c >> @@ -1132,7 +1132,7 @@ __do_page_fault(struct pt_regs *regs, unsigned >> long error_code, >> * If we're in an interrupt, have no user context or are running >> * in a region with pagefaults disabled then we must not take the fault >> */ >> - if (unlikely(faulthandler_disabled() || !mm)) { >> + if (unlikely(faulthandler_disabled() || rcu_preempt_depth() || !mm)) { > > This works if CONFIG_PREEMPT=y, but if CONFIG_PREEMPT=n, then > rcu_preempt_depth() unconditionally returns zero. And if > CONFIG_PREEMPT_COUNT=y && CONFIG_PREEMPT=n, you would still see > the might_sleep() splat. > > Maybe use SRCU instead of RCU for this purpose? > > Thanx, Paul > >> bad_area_nosemaphore(regs, error_code, address); >> return; >> } >> >> I am wondering if this would be the right approach. I have tested that >> this patch does indeed suppress the warning. If you guys agree, I will >> send a patch. It's true that this is a trivial issue since we are >> intentionally crashing the kernel but in our case, this additional >> complaint from the kernel is confusing our test scripts and they are >> generating false positives. >> >
| |