mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mike Travis <mike.travis@hpe.com>
To: Ingo Molnar <mingo@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>, Don Zickus <dzickus@redhat.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>,
	Frank Ramsay <frank.ramsay@hpe.com>,
	Russ Anderson <russ.anderson@hpe.com>,
	Tony Ernst <tony.ernst@hpe.com>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 1/2] x86/platform: Add a low priority low frequency NMI call chain
Date: Mon, 06 Mar 2017 12:17:38 -0600	[thread overview]
Message-ID: <20170306181737.322206440@asylum.americas.sgi.com> (raw)
In-Reply-To: <20170306181737.059578494@asylum.americas.sgi.com>

[-- Attachment #1: x86_add_nmi_remote_call --]
[-- Type: text/plain, Size: 2295 bytes --]

Add a new NMI call chain that is called last after all other NMI handlers
have been checked and did not "handle" the NMI.  This mimics the current
NMI_UNKNOWN call chain except it eliminates the WARNING message about
multiple NMI handlers registering on this call chain.

This call chain dramatically lowers the NMI call frequency when high
frequency NMI tools are in use, notably the perf tools.  It is required
for NMI handlers that cannot sustain a high NMI call rate without
ramifications to the system operability.


Signed-off-by: Mike Travis <mike.travis@hpe.com>
Reviewed-by: Russ Anderson <russ.anderson@hpe.com>
---
 arch/x86/include/asm/nmi.h |    1 +
 arch/x86/kernel/nmi.c      |   21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

--- linux-4.4.orig/arch/x86/include/asm/nmi.h
+++ linux-4.4/arch/x86/include/asm/nmi.h
@@ -28,6 +28,7 @@ enum {
 	NMI_UNKNOWN,
 	NMI_SERR,
 	NMI_IO_CHECK,
+	NMI_LAST,
 	NMI_MAX
 };
 
--- linux-4.4.orig/arch/x86/kernel/nmi.c
+++ linux-4.4/arch/x86/kernel/nmi.c
@@ -57,6 +57,10 @@ static struct nmi_desc nmi_desc[NMI_MAX]
 		.lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[3].lock),
 		.head = LIST_HEAD_INIT(nmi_desc[3].head),
 	},
+	{
+		.lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[4].lock),
+		.head = LIST_HEAD_INIT(nmi_desc[4].head),
+	},
 
 };
 
@@ -65,6 +69,7 @@ struct nmi_stats {
 	unsigned int unknown;
 	unsigned int external;
 	unsigned int swallow;
+	unsigned int last;
 };
 
 static DEFINE_PER_CPU(struct nmi_stats, nmi_stats);
@@ -312,6 +317,20 @@ unknown_nmi_error(unsigned char reason,
 }
 NOKPROBE_SYMBOL(unknown_nmi_error);
 
+static void check_nmi_last(unsigned char reason, struct pt_regs *regs)
+{
+	int handled;
+
+	/* Check low frequency, multiple CPU NMI handlers */
+	handled = nmi_handle(NMI_LAST, regs);
+	__this_cpu_add(nmi_stats.last, handled);
+	if (handled)
+		return;
+
+	unknown_nmi_error(reason, regs);
+}
+NOKPROBE_SYMBOL(check_nmi_last);
+
 static DEFINE_PER_CPU(bool, swallow_nmi);
 static DEFINE_PER_CPU(unsigned long, last_nmi_rip);
 
@@ -423,7 +442,7 @@ static void default_do_nmi(struct pt_reg
 	if (b2b && __this_cpu_read(swallow_nmi))
 		__this_cpu_add(nmi_stats.swallow, 1);
 	else
-		unknown_nmi_error(reason, regs);
+		check_nmi_last(reason, regs);
 }
 NOKPROBE_SYMBOL(default_do_nmi);
 

-- 

  reply	other threads:[~2017-03-06 20:12 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-06 18:17 [PATCH 0/2] Add and Use NMI LAST call chain to eliminate WARNING message Mike Travis
2017-03-06 18:17 ` Mike Travis [this message]
2017-03-07  7:42   ` [PATCH 1/2] x86/platform: Add a low priority low frequency NMI call chain Ingo Molnar
2017-03-07 15:22     ` Don Zickus
2017-03-07 16:00       ` Mike Travis
2017-03-07 16:07         ` Don Zickus
2017-03-07 16:13           ` Mike Travis
2017-03-07 15:38     ` Mike Travis
2017-03-08 10:28       ` Ingo Molnar
2017-03-08 15:17         ` Mike Travis
2017-03-06 18:17 ` [PATCH 2/2] x86/platform/uv: Use " Mike Travis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170306181737.322206440@asylum.americas.sgi.com \
    --to=mike.travis@hpe.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=dimitri.sivanich@hpe.com \
    --cc=dzickus@redhat.com \
    --cc=frank.ramsay@hpe.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=russ.anderson@hpe.com \
    --cc=tglx@linutronix.de \
    --cc=tony.ernst@hpe.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome