Received: by 10.223.185.116 with SMTP id b49csp1015093wrg; Wed, 14 Feb 2018 10:15:26 -0800 (PST) X-Google-Smtp-Source: AH8x226plx+Gu95sMUAnxh0y2p7bv+5UvfGdwkYt0FN7j3sWRwWExRAj3qkyCq5+iS+xrzso4/lZ X-Received: by 10.99.111.8 with SMTP id k8mr70919pgc.262.1518632126562; Wed, 14 Feb 2018 10:15:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518632126; cv=none; d=google.com; s=arc-20160816; b=miVmlRIi42W6808e3S2C+aU8aOgVCz2gio0yWwp1CT5WVEozRzviFMkmx6o8Bk/tJJ wPaGpTcAmTDk4SJUyKWAt93hiJ0he+orWfjdEIAfGa+/GIqbEpYcZ6E9rn4jOCQp0Q6o ipuE3wcP/2hy9HvOHD2jIAEWePOelERLdpDNHva0tAwcz5J8dQuGmHr8fY9Akt6qCGYK m0e7BKbJDdtFPyxUb6ca+5LuFIWA3XTldUsyQsKxjiu2RaBoemLBW9hexb6IqoU4exbH c7LQaMh0B1m0Xv3MVgLaxuWSvE8w/ZFYY6YTC+MUERDVHnvTliMgdM6+mxf12mJ1B+h7 OoZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:reply-to:message-id :subject:cc:to:from:date:arc-authentication-results; bh=lDj5nc/hOniEAMGO1NG9fk0dhcZ30cFIvUzUp9Xjlmc=; b=KKl1Gl344T8hmJTT33nSaYEbItgdLRxwxqbXc58yUDwywLFKsJVRBIYjcx/xRQLnNE jWIOytwjim4MH9AI0W6MoSIPM75wqwAnQkV9aSK1h627FGJQnTKEgLMa/jCcMcliaVJT vFy+1jFRyKqYhiDDbz3+b1pBo2TYVjejSAUqk/nnkqn6i03VeGdKD4dGhyo+YE0sImYu JMhSjJlG3Cpyox3kNBnZHm9qAAhfQTgBeFz/pkgrnSuzqbq9R6yMHSudIpr6J6/8v7WQ lIT38C1E0MAwPk/VfnE1GDzXXryse3qkJ9pbsja652rRwziPtbYaQSfX5XqPvtAqMER1 NSPQ== ARC-Authentication-Results: i=1; mx.google.com; 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 x11si8287073pgo.812.2018.02.14.10.15.11; Wed, 14 Feb 2018 10:15:26 -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; 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 S1161780AbeBNSNr (ORCPT + 99 others); Wed, 14 Feb 2018 13:13:47 -0500 Received: from g4t3426.houston.hpe.com ([15.241.140.75]:56990 "EHLO g4t3426.houston.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161695AbeBNSNp (ORCPT ); Wed, 14 Feb 2018 13:13:45 -0500 Received: from g4t3433.houston.hpecorp.net (g4t3433.houston.hpecorp.net [16.208.49.245]) by g4t3426.houston.hpe.com (Postfix) with ESMTP id BFDC754; Wed, 14 Feb 2018 18:13:44 +0000 (UTC) Received: from anatevka.americas.hpqcorp.net (anatevka.americas.hpqcorp.net [10.34.81.6]) by g4t3433.houston.hpecorp.net (Postfix) with ESMTP id 4183348; Wed, 14 Feb 2018 18:13:43 +0000 (UTC) Date: Wed, 14 Feb 2018 11:13:42 -0700 From: Jerry Hoemann To: Ingo Molnar Cc: Borislav Petkov , Tim Chen , Peter Zijlstra , Dave Hansen , hpa@zytor.com, tglx@linutronix.de, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, dwmw@amazon.co.uk, linux-tip-commits@vger.kernel.org, Arjan van de Ven , linux-watchdog@vger.kernel.org Subject: Re: [PATCH] watchdog: hpwdt: Remove spinlock acquire and BIOS calls from NMI context Message-ID: <20180214181342.GA27600@anatevka.americas.hpqcorp.net> Reply-To: Jerry.Hoemann@hpe.com References: <1518362359-1005-1-git-send-email-dwmw@amazon.co.uk> <20180212102211.cdrrqqd4hdw7xu5y@gmail.com> <20180212165835.GO25181@hirez.programming.kicks-ass.net> <20180213075540.3lkikkpgjoe6ocjk@gmail.com> <5c3ba123-abbe-f153-7b75-a89d31d25c72@linux.intel.com> <20180214093159.mdzfupne547bi5qx@gmail.com> <20180214094404.GA18349@pd.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180214094404.GA18349@pd.tnic> User-Agent: Mutt/1.9.1 (2017-09-22) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ingo, I have a patch set under review that brings hpwdt into compliance with the watchdog core. One of the changes removes the callback into firmware in hpwdt_pretimeout and its associated spinlock. https://lkml.org/lkml/2018/2/12/30 I will add you to the CC list of the next version of the set. Jerry On Wed, Feb 14, 2018 at 10:44:05AM +0100, Borislav Petkov wrote: > + Jerry > > On Wed, Feb 14, 2018 at 10:31:59AM +0100, Ingo Molnar wrote: > > > > * Tim Chen wrote: > > > > > Dave Hansen and I had some discussions on how to handle the nested NMI and > > > firmware calls. We thought of using a per cpu counter to record the nesting > > > call depth and toggle IBRS appropriately for the depth 0->1 and 1->0 transition. > > > Will this change be sufficient? > > > > Yeah, so I think the first question should be: does the firmware call from NMI > > context make sense to begin with? > > > > Because in this particular case it does not appear to be so: the reason for the > > BIOS/firmware call appears to be to determine how we nmi_panic() after receiving > > an NMI that no other NMI handler handled: with a passive-aggressive "I don't know" > > panic message or with a slightly more informative panic message. > > > > That's not a real value-add to users - so we can avoid all these complications by > > applying the patch below: > > > > drivers/watchdog/hpwdt.c | 30 ++++-------------------------- > > 1 file changed, 4 insertions(+), 26 deletions(-) > > > > As a bonus the spinlock use can be removed as well. > > > > Thanks, > > > > Ingo > > > > ====================> > > From b038428a739a3fcf0b9678305c131f60af7422ca Mon Sep 17 00:00:00 2001 > > From: Ingo Molnar > > Date: Wed, 14 Feb 2018 10:24:41 +0100 > > Subject: [PATCH] watchdog: hpwdt: Remove spinlock acquire and BIOS calls from > > NMI context > > > > Taking a spinlock and calling into the firmware are problematic things to > > do from NMI callbacks. > > > > It also seems completely pointless in this particular case: > > > > - cmn_regs is updated by the firmware call in the hpwdt_pretimeout() NMI > > callback, but there's almost no use for it: we use it only to determine > > whether to panic with an 'unknown NMI' or a slightly more descriptive > > message. > > > > - cmn_regs and rom_lock is not used anywhere else, other than early detection > > of the firmware capability. > > > > So remove rom_lock, make the cmn_regs call from the detection routine only, > > and thus make the NMI callback a lot more robust. > > > > Signed-off-by: Ingo Molnar > > --- > > drivers/watchdog/hpwdt.c | 30 ++++-------------------------- > > 1 file changed, 4 insertions(+), 26 deletions(-) > > > > diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c > > index f1f00dfc0e68..2544fe482fe3 100644 > > --- a/drivers/watchdog/hpwdt.c > > +++ b/drivers/watchdog/hpwdt.c > > @@ -150,9 +150,7 @@ static unsigned int hpwdt_nmi_decoding; > > static unsigned int allow_kdump = 1; > > static unsigned int is_icru; > > static unsigned int is_uefi; > > -static DEFINE_SPINLOCK(rom_lock); > > static void *cru_rom_addr; > > -static struct cmn_registers cmn_regs; > > > > extern asmlinkage void asminline_call(struct cmn_registers *pi86Regs, > > unsigned long *pRomEntry); > > @@ -225,6 +223,7 @@ static int cru_detect(unsigned long map_entry, > > unsigned long physical_bios_base = 0; > > unsigned long physical_bios_offset = 0; > > int retval = -ENODEV; > > + struct cmn_registers cmn_regs = { }; > > > > bios32_map = ioremap(map_entry, (2 * PAGE_SIZE)); > > > > @@ -486,32 +485,18 @@ static int hpwdt_my_nmi(void) > > */ > > static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs) > > { > > - unsigned long rom_pl; > > - static int die_nmi_called; > > - > > if (!hpwdt_nmi_decoding) > > return NMI_DONE; > > > > if ((ulReason == NMI_UNKNOWN) && !hpwdt_my_nmi()) > > return NMI_DONE; > > > > - spin_lock_irqsave(&rom_lock, rom_pl); > > - if (!die_nmi_called && !is_icru && !is_uefi) > > - asminline_call(&cmn_regs, cru_rom_addr); > > - die_nmi_called = 1; > > - spin_unlock_irqrestore(&rom_lock, rom_pl); > > - > > if (allow_kdump) > > hpwdt_stop(); > > > > - if (!is_icru && !is_uefi) { > > - if (cmn_regs.u1.ral == 0) { > > - nmi_panic(regs, "An NMI occurred, but unable to determine source.\n"); > > - return NMI_HANDLED; > > - } > > - } > > - nmi_panic(regs, "An NMI occurred. Depending on your system the reason " > > - "for the NMI is logged in any one of the following " > > + nmi_panic(regs, > > + "An NMI occurred. Depending on your system the reason " > > + "for the NMI might be logged in any one of the following " > > "resources:\n" > > "1. Integrated Management Log (IML)\n" > > "2. OA Syslog\n" > > @@ -744,13 +729,6 @@ static int hpwdt_init_nmi_decoding(struct pci_dev *dev) > > HPWDT_ARCH); > > return retval; > > } > > - > > - /* > > - * We know this is the only CRU call we need to make so lets keep as > > - * few instructions as possible once the NMI comes in. > > - */ > > - cmn_regs.u1.rah = 0x0D; > > - cmn_regs.u1.ral = 0x02; > > } > > > > /* > > -- > Regards/Gruss, > Boris. > > Good mailing practices for 400: avoid top-posting and trim the reply. -- ----------------------------------------------------------------------------- Jerry Hoemann Software Engineer Hewlett Packard Enterprise -----------------------------------------------------------------------------