From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754013AbbLRPdx (ORCPT ); Fri, 18 Dec 2015 10:33:53 -0500 Received: from mail-io0-f176.google.com ([209.85.223.176]:33815 "EHLO mail-io0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753558AbbLRPdv (ORCPT ); Fri, 18 Dec 2015 10:33:51 -0500 MIME-Version: 1.0 In-Reply-To: <20151218130125.GO4054@linux.vnet.ibm.com> References: <1450401310-29117-1-git-send-email-ani@arista.com> <20151218130125.GO4054@linux.vnet.ibm.com> From: Ani Sinha Date: Fri, 18 Dec 2015 07:33:36 -0800 Message-ID: Subject: Re: [PATCH 1/1] Fix 'sleeping function called from invalid context' warning in sysrq generated crash. To: Paul McKenney Cc: Ani Sinha , Greg Kroah-Hartman , Jiri Slaby , "linux-kernel@vger.kernel.org" , Rik van Riel , Ivan Delalande , Francesco Ruggeri Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 18, 2015 at 5:01 AM, Paul E. McKenney wrote: > On Thu, Dec 17, 2015 at 05:15:10PM -0800, Ani Sinha wrote: >> Commit 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") >> replaced spin_lock_irqsave() calls with >> rcu_read_lock() calls in sysrq. Since rcu_read_lock() does not >> disable preemption, faulthandler_disabled() in >> __do_page_fault() in x86/fault.c returns false. When the code >> later calls might_sleep() in the pagefault handler, we get the >> following warning: >> >> BUG: sleeping function called from invalid context at ../arch/x86/mm/fault.c:1187 >> in_atomic(): 0, irqs_disabled(): 0, pid: 4706, name: bash >> Preemption disabled at:[] printk+0x48/0x4a >> >> To fix this, we release the RCU read lock before we crash. >> >> Tested this patch on linux 3.18 by booting off one of our boards. >> >> Fixes: 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") >> >> Signed-off-by: Ani Sinha > > I queued this with Rik's Signed-off-by, and fixed some checkpatch.pl > errors. Please run scripts/checkpatch.pl on your patches in the future. > > Please see below for the result. Yes, sorry. I forgot to run the script before sending Thanks for fixing my comment and the trailing whitespace. > > Rik, did you test this as well? If so, may I also have your Tested-by? > > Thanx, Paul > > ------------------------------------------------------------------------ > > commit c95a158356397844a5a6deb0bd58758084f891df > Author: Ani Sinha > Date: Thu Dec 17 17:15:10 2015 -0800 > > sysrq: Fix warning in sysrq generated crash. > > Commit 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") replaced > spin_lock_irqsave() calls with rcu_read_lock() calls in sysrq. Since > rcu_read_lock() does not disable preemption, faulthandler_disabled() in > __do_page_fault() in x86/fault.c returns false. When the code later calls > might_sleep() in the pagefault handler, we get the following warning: > > BUG: sleeping function called from invalid context at ../arch/x86/mm/fault.c:1187 > in_atomic(): 0, irqs_disabled(): 0, pid: 4706, name: bash > Preemption disabled at:[] printk+0x48/0x4a > > To fix this, we release the RCU read lock before we crash. > > Tested this patch on linux 3.18 by booting off one of our boards. > > Fixes: 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") > > Signed-off-by: Ani Sinha > Reviewed-by: Rik van Riel > Signed-off-by: Paul E. McKenney > > diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c > index 5381a728d23e..e5139402e7f8 100644 > --- a/drivers/tty/sysrq.c > +++ b/drivers/tty/sysrq.c > @@ -133,6 +133,12 @@ static void sysrq_handle_crash(int key) > { > char *killer = NULL; > > + /* we need to release the RCU read lock here, > + * otherwise we get an annoying > + * 'BUG: sleeping function called from invalid context' > + * complaint from the kernel before the panic. > + */ > + rcu_read_unlock(); > panic_on_oops = 1; /* force panic */ > wmb(); > *killer = 1; >