Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1617345ybv; Fri, 21 Feb 2020 00:22:22 -0800 (PST) X-Google-Smtp-Source: APXvYqwlq1e/G43MwwnlmEZrF0uIziaANVBsjq1t7ym0jwuQp2GAVXWHBcaLWNhbG3tyxRHeXmed X-Received: by 2002:a9d:7ac9:: with SMTP id m9mr26115322otn.80.1582273342056; Fri, 21 Feb 2020 00:22:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582273342; cv=none; d=google.com; s=arc-20160816; b=V8Zm18k5G+2/eUiX03FtZhZQpGsfMLzrfzGXzWrfzUix9vGC19FNOrW5QdGd8XcQ3Q Lmdw3TTxismmkuG10je0YDVOjtY8hUYRm2n5u2vOqN0lO7cFTAH4PjnS+uxspSCA83Y0 Soi8rnsZ1h9z31NRS5x3jHZUYxtFzUuQBtRdEUJqR0uyCO7+sBWSLtQN8TpsI5WV1ERA HYUpSO+zSXIxNb4yi5COBe17fWfrcNaEdNybU9bOV1Bhu1YH/jEs38gOyepML582vy10 5skTdsU9cldjDhPGo+urqa9LEUhQujzFUS8okH3Vyo4TNM2LKUTitwANcpv+BTZrkkcR LCXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=r0c1zfXAIYuQDb/oupPMx683E+OPlh0Z9oynLrdm0YE=; b=gO58gxqWB9p5IsDB//qIMnVDKcRt69Xg/M9V0WA9yzq5RhgEzLhnF7zDljPvbvnmi6 Tedywc/SK9oH/NL5AqZj5u2wzHQfOuQeWqg0u8wAQfx2QW/6sY5GJN0+qrNsHQwbD0Wr QjJM/SeiuWH3o3tpt+j7k/7MAsMSxEzjwdYAPtBYJI4/Zuw4lxP5qo5glJfVdoWsDIpW r8Rg4aGrCyIly9OFo3irtP7CJNSelsYhqaZE1eAU0GGRN1DEEc9lpN7UuT6T3T2H6mfM CcmRlBKcoQNMdl+LScqeJDBMuiAbpUmv36yHfT4pHn/HPRX7hYb7qEOSZ//keNW6R3ac srGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=JaID2hRE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 77si431744oie.10.2020.02.21.00.22.09; Fri, 21 Feb 2020 00:22:22 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=JaID2hRE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388048AbgBUIV1 (ORCPT + 99 others); Fri, 21 Feb 2020 03:21:27 -0500 Received: from mail.kernel.org ([198.145.29.99]:60796 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730612AbgBUIVV (ORCPT ); Fri, 21 Feb 2020 03:21:21 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 894BC20578; Fri, 21 Feb 2020 08:21:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582273281; bh=c6WsqgM0toEDjDTqgMLb6H87/t1l/eCisEHAE0NR3Ok=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JaID2hRELOJZwv6NHo3VdvY9poPr8hh5y5n9RaNELl77OsDhPI31U7PX1cqS+z1nU Sq9POQ31xcoKPRJEX03jV6aa0jyC2erhkzCwA2Mf+c7s3ms+qWNGWYfN+AhVQITd7A eL93Z84e+8X0uhCWmZUGwkNytELR9Sk0xbl06EH0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Changbin Du , Borislav Petkov , Thomas Gleixner , Sasha Levin Subject: [PATCH 4.19 112/191] x86/nmi: Remove irq_work from the long duration NMI handler Date: Fri, 21 Feb 2020 08:41:25 +0100 Message-Id: <20200221072304.373890261@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200221072250.732482588@linuxfoundation.org> References: <20200221072250.732482588@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Changbin Du [ Upstream commit 248ed51048c40d36728e70914e38bffd7821da57 ] First, printk() is NMI-context safe now since the safe printk() has been implemented and it already has an irq_work to make NMI-context safe. Second, this NMI irq_work actually does not work if a NMI handler causes panic by watchdog timeout. It has no chance to run in such case, while the safe printk() will flush its per-cpu buffers before panicking. While at it, repurpose the irq_work callback into a function which concentrates the NMI duration checking and makes the code easier to follow. [ bp: Massage. ] Signed-off-by: Changbin Du Signed-off-by: Borislav Petkov Acked-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20200111125427.15662-1-changbin.du@gmail.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/nmi.h | 1 - arch/x86/kernel/nmi.c | 20 +++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index 75ded1d13d98d..9d5d949e662e1 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h @@ -41,7 +41,6 @@ struct nmiaction { struct list_head list; nmi_handler_t handler; u64 max_duration; - struct irq_work irq_work; unsigned long flags; const char *name; }; diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 086cf1d1d71d8..0f8b9b900b0e7 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -102,18 +102,22 @@ static int __init nmi_warning_debugfs(void) } fs_initcall(nmi_warning_debugfs); -static void nmi_max_handler(struct irq_work *w) +static void nmi_check_duration(struct nmiaction *action, u64 duration) { - struct nmiaction *a = container_of(w, struct nmiaction, irq_work); + u64 whole_msecs = READ_ONCE(action->max_duration); int remainder_ns, decimal_msecs; - u64 whole_msecs = READ_ONCE(a->max_duration); + + if (duration < nmi_longest_ns || duration < action->max_duration) + return; + + action->max_duration = duration; remainder_ns = do_div(whole_msecs, (1000 * 1000)); decimal_msecs = remainder_ns / 1000; printk_ratelimited(KERN_INFO "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n", - a->handler, whole_msecs, decimal_msecs); + action->handler, whole_msecs, decimal_msecs); } static int nmi_handle(unsigned int type, struct pt_regs *regs) @@ -140,11 +144,7 @@ static int nmi_handle(unsigned int type, struct pt_regs *regs) delta = sched_clock() - delta; trace_nmi_handler(a->handler, (int)delta, thishandled); - if (delta < nmi_longest_ns || delta < a->max_duration) - continue; - - a->max_duration = delta; - irq_work_queue(&a->irq_work); + nmi_check_duration(a, delta); } rcu_read_unlock(); @@ -162,8 +162,6 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action) if (!action->handler) return -EINVAL; - init_irq_work(&action->irq_work, nmi_max_handler); - raw_spin_lock_irqsave(&desc->lock, flags); /* -- 2.20.1