From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 075DAC35280 for ; Wed, 2 Oct 2019 12:35:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CC9F021A4C for ; Wed, 2 Oct 2019 12:35:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570019745; bh=RtvZ/jtXrdXaMZJweoBj5d73QB9VhlxmXyuMM+MoeO0=; h=From:To:Cc:Subject:Date:List-ID:From; b=m07UBi8OaPtkhpSImh/b5/RmA28sPmvDg+QyXC3N67/3YG1QlZhvBEolXRBRgS3/q wgQT+aTLmQDJmSlLvzFjt09cwzVxc5bYSt44CNjpCx/WtflgeZvpQvGe596ukp97+a IpNOUbJJ5z/fV40oxJk5sEagzEqI4Gd0gPTqTP10= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727071AbfJBMfp (ORCPT ); Wed, 2 Oct 2019 08:35:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:34766 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725765AbfJBMfp (ORCPT ); Wed, 2 Oct 2019 08:35:45 -0400 Received: from localhost.localdomain (236.31.169.217.in-addr.arpa [217.169.31.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5F6C72133F; Wed, 2 Oct 2019 12:35:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570019744; bh=RtvZ/jtXrdXaMZJweoBj5d73QB9VhlxmXyuMM+MoeO0=; h=From:To:Cc:Subject:Date:From; b=V8fsWYj0FqgWwPoFt5oiFr9IJ03REQSB1IW38olIu1/Xt3v6zu4bB440fLa2tuqCM VkX7fp/WAXyIx3CMY20+yBaCpLpR3Ku9wxzmNL/VhfC0NSJEeR5a5r+uknazRUkLJm QNDkZC88QphnaVKDyQGv/RopBWjvanfBnpZJ7d6c= From: Will Deacon To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, contact@xogium.me, Will Deacon , Russell King , Greg Kroah-Hartman , Ingo Molnar , Kees Cook , Andrew Morton , stable@vger.kernel.org Subject: [PATCH] panic: Ensure preemption is disabled during panic() Date: Wed, 2 Oct 2019 13:35:38 +0100 Message-Id: <20191002123538.22609-1-will@kernel.org> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Calling 'panic()' on a kernel with CONFIG_PREEMPT=y can leave the calling CPU in an infinite loop, but with interrupts and preemption enabled. From this state, userspace can continue to be scheduled, despite the system being "dead" as far as the kernel is concerned. This is easily reproducible on arm64 when booting with "nosmp" on the command line; a couple of shell scripts print out a periodic "Ping" message whilst another triggers a crash by writing to /proc/sysrq-trigger: | sysrq: Trigger a crash | Kernel panic - not syncing: sysrq triggered crash | CPU: 0 PID: 1 Comm: init Not tainted 5.2.15 #1 | Hardware name: linux,dummy-virt (DT) | Call trace: | dump_backtrace+0x0/0x148 | show_stack+0x14/0x20 | dump_stack+0xa0/0xc4 | panic+0x140/0x32c | sysrq_handle_reboot+0x0/0x20 | __handle_sysrq+0x124/0x190 | write_sysrq_trigger+0x64/0x88 | proc_reg_write+0x60/0xa8 | __vfs_write+0x18/0x40 | vfs_write+0xa4/0x1b8 | ksys_write+0x64/0xf0 | __arm64_sys_write+0x14/0x20 | el0_svc_common.constprop.0+0xb0/0x168 | el0_svc_handler+0x28/0x78 | el0_svc+0x8/0xc | Kernel Offset: disabled | CPU features: 0x0002,24002004 | Memory Limit: none | ---[ end Kernel panic - not syncing: sysrq triggered crash ]--- | Ping 2! | Ping 1! | Ping 1! | Ping 2! The issue can also be triggered on x86 kernels if CONFIG_SMP=n, otherwise local interrupts are disabled in 'smp_send_stop()'. Disable preemption in 'panic()' before re-enabling interrupts. Cc: Russell King Cc: Greg Kroah-Hartman Cc: Ingo Molnar Cc: Kees Cook Cc: Andrew Morton Cc: Link: https://lore.kernel.org/r/BX1W47JXPMR8.58IYW53H6M5N@dragonstone Reported-by: Xogium Signed-off-by: Will Deacon --- kernel/panic.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/panic.c b/kernel/panic.c index 47e8ebccc22b..f470a038b05b 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -180,6 +180,7 @@ void panic(const char *fmt, ...) * after setting panic_cpu) from invoking panic() again. */ local_irq_disable(); + preempt_disable_notrace(); /* * It's possible to come here directly from a panic-assertion and -- 2.23.0.444.g18eeb5a265-goog