From patchwork Wed Feb 26 12:19:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Roger Pau Monne X-Patchwork-Id: 11406377 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BABED14E3 for ; Wed, 26 Feb 2020 12:21:19 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 973E42467B for ; Wed, 26 Feb 2020 12:21:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="cOCInGHB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 973E42467B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1j6vfc-0007zp-5u; Wed, 26 Feb 2020 12:20:08 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1j6vfb-0007vz-Nl for xen-devel@lists.xenproject.org; Wed, 26 Feb 2020 12:20:07 +0000 X-Inumbo-ID: 50924a6a-5892-11ea-9405-12813bfff9fa Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 50924a6a-5892-11ea-9405-12813bfff9fa; Wed, 26 Feb 2020 12:20:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1582719603; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Kt3IzNk6zIe/5QGWPbC+79ZzpGyafp44OJArdpw2w1I=; b=cOCInGHBQxWtA/UyIVvqBba6ikCw56bCrevXwwd0nzVudJczsRmxwYdW lQB6XZBaGJ68IH2vIEvuNXcooRIoTyyoS1Ybw08Xh+3NOgJcSlZrdz/da n2Bu68yFGf+mP/dNZGi1cE8GCm9uRVh9O5qonEsUQ3seE0SLwaHFLGueS 4=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=roger.pau@citrix.com; spf=Pass smtp.mailfrom=roger.pau@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of roger.pau@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of roger.pau@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: NNiSMpKxrbedS/BuW1+JplYU33nj875M1hKE1pOn5OPOIjfYd7Yuys/3zL/ilUJGrRVZqT8dkU gf7CpWlvHnCje8JcG8IXmdFft6PH1kcHu6PbkjAs0xDiRVMmgQaAmpvscszbOKmh9dB6dVJzjS 2fEiU0s4ggGqqIP5+pY2OPrppV4Uh0Y/GNR+1bY5LPRFeeYo94bK19HACmeXvr8DoCLs5FfvGo D0QfCcKUR3gcR40UQ7kviN5zUaT1fVHxqM30nLdepIJfEOpPHaCuJ36Ab85Dxs5vMdNt82/rUi OhM= X-SBRS: 2.7 X-MesageID: 13014350 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.70,488,1574139600"; d="scan'208";a="13014350" From: Roger Pau Monne To: Date: Wed, 26 Feb 2020 13:19:19 +0100 Message-ID: <20200226121921.28627-3-roger.pau@citrix.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200226121921.28627-1-roger.pau@citrix.com> References: <20200226121921.28627-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v4 2/4] x86: track when in NMI context X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Andrew Cooper , Wei Liu , Jan Beulich , Roger Pau Monne Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Add helpers to track when running in NMI handler context. This is modeled after the in_irq helpers. The SDM states that no NMI can be delivered while handling a NMI until the processor has executed an iret instruction. It's possible however that another fault is received while handling the NMI (a #MC for example), and thus the iret from that fault would allow further NMIs to be injected while still processing the previous one, and hence an integer is needed in order to keep track of in service NMIs. The added macros only track when the execution context is in the NMI handler, but that doesn't mean NMIs are blocked for the reasons listed above. Note that there are no users of in_nmi_handler() introduced by the change, further users will be added by followup changes. Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich --- Changes since v3: - Rename to in_nmi_context. - Drop parentheses around cpu in nmi_count. Changes since v2: - Use an integer instead of a boolean to keep track of in service #NMIs. - Move nmi_count into x86 specific header. - Drop leading underscores from __nmi_count field. --- xen/arch/x86/traps.c | 6 ++++++ xen/include/asm-x86/hardirq.h | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 3dbc66bb64..f4f2c13ae9 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -1692,9 +1692,13 @@ void do_nmi(const struct cpu_user_regs *regs) bool handle_unknown = false; this_cpu(nmi_count)++; + nmi_enter(); if ( nmi_callback(regs, cpu) ) + { + nmi_exit(); return; + } /* * Accessing port 0x61 may trap to SMM which has been actually @@ -1720,6 +1724,8 @@ void do_nmi(const struct cpu_user_regs *regs) if ( !(reason & 0xc0) && handle_unknown ) unknown_nmi_error(regs, reason); } + + nmi_exit(); } nmi_callback_t *set_nmi_callback(nmi_callback_t *callback) diff --git a/xen/include/asm-x86/hardirq.h b/xen/include/asm-x86/hardirq.h index 802f91cfdf..069e48fce9 100644 --- a/xen/include/asm-x86/hardirq.h +++ b/xen/include/asm-x86/hardirq.h @@ -7,6 +7,7 @@ typedef struct { unsigned int __softirq_pending; unsigned int __local_irq_count; + unsigned int nmi_count; bool_t __mwait_wakeup; } __cacheline_aligned irq_cpustat_t; @@ -17,6 +18,11 @@ typedef struct { #define irq_enter() (local_irq_count(smp_processor_id())++) #define irq_exit() (local_irq_count(smp_processor_id())--) +#define nmi_count(cpu) __IRQ_STAT(cpu, nmi_count) +#define in_nmi_handler() (nmi_count(smp_processor_id()) != 0) +#define nmi_enter() (nmi_count(smp_processor_id())++) +#define nmi_exit() (nmi_count(smp_processor_id())--) + void ack_bad_irq(unsigned int irq); extern void apic_intr_init(void);