All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation
@ 2020-08-20  2:56 Libing Zhou
  2020-08-31  7:02 ` Zhou, Libing (NSB - CN/Hangzhou)
  2020-10-01 12:46 ` [tip: x86/misc] x86/nmi: Fix nmi_handle() " tip-bot2 for Libing Zhou
  0 siblings, 2 replies; 3+ messages in thread
From: Libing Zhou @ 2020-08-20  2:56 UTC (permalink / raw)
  To: peterz, tglx, mingo, bp, bp, x86; +Cc: linux-kernel, libing.zhou, hpa

In nmi_check_duration(), the 'whole_msecs' value get from
'action->max_duration' is wrong.

Fixes: 248ed51048c4 ("x86/nmi: Remove irq_work from the long duration NMI handler")
Signed-off-by: Libing Zhou <libing.zhou@nokia-sbell.com>
---
v2:
Change solution as peterz@infradead.org suggested.

 arch/x86/kernel/nmi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c
index 4fc9954a9560..47381666d6a5 100644
--- a/arch/x86/kernel/nmi.c
+++ b/arch/x86/kernel/nmi.c
@@ -102,7 +102,6 @@ fs_initcall(nmi_warning_debugfs);
 
 static void nmi_check_duration(struct nmiaction *action, u64 duration)
 {
-	u64 whole_msecs = READ_ONCE(action->max_duration);
 	int remainder_ns, decimal_msecs;
 
 	if (duration < nmi_longest_ns || duration < action->max_duration)
@@ -110,12 +109,12 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration)
 
 	action->max_duration = duration;
 
-	remainder_ns = do_div(whole_msecs, (1000 * 1000));
+	remainder_ns = do_div(duration, (1000 * 1000));
 	decimal_msecs = remainder_ns / 1000;
 
 	printk_ratelimited(KERN_INFO
 		"INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
-		action->handler, whole_msecs, decimal_msecs);
+		action->handler, duration, decimal_msecs);
 }
 
 static int nmi_handle(unsigned int type, struct pt_regs *regs)
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* RE: [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation
  2020-08-20  2:56 [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation Libing Zhou
@ 2020-08-31  7:02 ` Zhou, Libing (NSB - CN/Hangzhou)
  2020-10-01 12:46 ` [tip: x86/misc] x86/nmi: Fix nmi_handle() " tip-bot2 for Libing Zhou
  1 sibling, 0 replies; 3+ messages in thread
From: Zhou, Libing (NSB - CN/Hangzhou) @ 2020-08-31  7:02 UTC (permalink / raw)
  To: peterz, tglx, mingo, bp, bp, x86; +Cc: linux-kernel, hpa

Hi,

Any comment on this?

-----Original Message-----
From: Libing Zhou <libing.zhou@nokia-sbell.com> 
Sent: 2020年8月20日 10:57
To: peterz@infradead.org; tglx@linutronix.de; mingo@redhat.com; bp@alien8.de; bp@suse.de; x86@kernel.org
Cc: linux-kernel@vger.kernel.org; Zhou, Libing (NSB - CN/Hangzhou) <libing.zhou@nokia-sbell.com>; hpa@zytor.com
Subject: [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation

In nmi_check_duration(), the 'whole_msecs' value get from 'action->max_duration' is wrong.

Fixes: 248ed51048c4 ("x86/nmi: Remove irq_work from the long duration NMI handler")
Signed-off-by: Libing Zhou <libing.zhou@nokia-sbell.com>
---
v2:
Change solution as peterz@infradead.org suggested.

 arch/x86/kernel/nmi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index 4fc9954a9560..47381666d6a5 100644
--- a/arch/x86/kernel/nmi.c
+++ b/arch/x86/kernel/nmi.c
@@ -102,7 +102,6 @@ fs_initcall(nmi_warning_debugfs);
 
 static void nmi_check_duration(struct nmiaction *action, u64 duration)  {
-	u64 whole_msecs = READ_ONCE(action->max_duration);
 	int remainder_ns, decimal_msecs;
 
 	if (duration < nmi_longest_ns || duration < action->max_duration) @@ -110,12 +109,12 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration)
 
 	action->max_duration = duration;
 
-	remainder_ns = do_div(whole_msecs, (1000 * 1000));
+	remainder_ns = do_div(duration, (1000 * 1000));
 	decimal_msecs = remainder_ns / 1000;
 
 	printk_ratelimited(KERN_INFO
 		"INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
-		action->handler, whole_msecs, decimal_msecs);
+		action->handler, duration, decimal_msecs);
 }
 
 static int nmi_handle(unsigned int type, struct pt_regs *regs)
--
2.22.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [tip: x86/misc] x86/nmi: Fix nmi_handle() duration miscalculation
  2020-08-20  2:56 [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation Libing Zhou
  2020-08-31  7:02 ` Zhou, Libing (NSB - CN/Hangzhou)
@ 2020-10-01 12:46 ` tip-bot2 for Libing Zhou
  1 sibling, 0 replies; 3+ messages in thread
From: tip-bot2 for Libing Zhou @ 2020-10-01 12:46 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Peter Zijlstra (Intel),
	Libing Zhou, Borislav Petkov, Changbin Du, x86, LKML

The following commit has been merged into the x86/misc branch of tip:

Commit-ID:     f94c91f7ba3ba7de2bc8aa31be28e1abb22f849e
Gitweb:        https://git.kernel.org/tip/f94c91f7ba3ba7de2bc8aa31be28e1abb22f849e
Author:        Libing Zhou <libing.zhou@nokia-sbell.com>
AuthorDate:    Thu, 20 Aug 2020 10:56:41 +08:00
Committer:     Borislav Petkov <bp@suse.de>
CommitterDate: Thu, 01 Oct 2020 14:42:08 +02:00

x86/nmi: Fix nmi_handle() duration miscalculation

When nmi_check_duration() is checking the time an NMI handler took to
execute, the whole_msecs value used should be read from the @duration
argument, not from the ->max_duration, the latter being used to store
the current maximal duration.

 [ bp: Rewrite commit message. ]

Fixes: 248ed51048c4 ("x86/nmi: Remove irq_work from the long duration NMI handler")
Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Libing Zhou <libing.zhou@nokia-sbell.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Changbin Du <changbin.du@gmail.com>
Link: https://lkml.kernel.org/r/20200820025641.44075-1-libing.zhou@nokia-sbell.com
---
 arch/x86/kernel/nmi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c
index 4fc9954..4738166 100644
--- a/arch/x86/kernel/nmi.c
+++ b/arch/x86/kernel/nmi.c
@@ -102,7 +102,6 @@ fs_initcall(nmi_warning_debugfs);
 
 static void nmi_check_duration(struct nmiaction *action, u64 duration)
 {
-	u64 whole_msecs = READ_ONCE(action->max_duration);
 	int remainder_ns, decimal_msecs;
 
 	if (duration < nmi_longest_ns || duration < action->max_duration)
@@ -110,12 +109,12 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration)
 
 	action->max_duration = duration;
 
-	remainder_ns = do_div(whole_msecs, (1000 * 1000));
+	remainder_ns = do_div(duration, (1000 * 1000));
 	decimal_msecs = remainder_ns / 1000;
 
 	printk_ratelimited(KERN_INFO
 		"INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
-		action->handler, whole_msecs, decimal_msecs);
+		action->handler, duration, decimal_msecs);
 }
 
 static int nmi_handle(unsigned int type, struct pt_regs *regs)

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-01 12:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-20  2:56 [PATCH v2] x86/nmi: Fix nmi_handle duration miscalculation Libing Zhou
2020-08-31  7:02 ` Zhou, Libing (NSB - CN/Hangzhou)
2020-10-01 12:46 ` [tip: x86/misc] x86/nmi: Fix nmi_handle() " tip-bot2 for Libing Zhou

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.