From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
Keir Fraser <keir@xen.org>,
David Vrabel <david.vrabel@citrix.com>,
Jan Beulich <jbeulich@suse.com>
Subject: [PATCHv1] x86: only check for one watchdog NMI
Date: Mon, 22 Jun 2015 17:21:51 +0100 [thread overview]
Message-ID: <1434990111-14360-1-git-send-email-david.vrabel@citrix.com> (raw)
Since the NMI handler can now recognize watchdog NMIs, make
check_nmi_watchdog() only check for at least one watchdog NMI. This
prevents false negatives caused by other processors (which may be
being power managed by the BIOS) running at reduced clock frequencies.
This will also slightly speed up boot times since we only wait the
full 10 ticks if the NMI watchdog on one or more CPUs is not working.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
xen/arch/x86/nmi.c | 26 +++++++++++++++++++-------
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index 2ab97a0..725ea04 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -139,7 +139,18 @@ int nmi_active;
static void __init wait_for_nmis(void *p)
{
- mdelay((10*1000)/nmi_hz); /* wait 10 ticks */
+ unsigned int cpu = smp_processor_id();
+ unsigned int start_count = nmi_count(cpu);
+ unsigned long ticks = 10 * 1000 * cpu_khz / nmi_hz;
+ unsigned long s, e;
+
+ s = rdtsc();
+ do {
+ cpu_relax();
+ if ( nmi_count(cpu) > start_count )
+ break;
+ e = rdtsc();
+ } while( e - s < ticks );
}
int __init check_nmi_watchdog (void)
@@ -156,15 +167,16 @@ int __init check_nmi_watchdog (void)
for_each_online_cpu ( cpu )
prev_nmi_count[cpu] = nmi_count(cpu);
- /* Wait for 10 ticks. Busy-wait on all CPUs: the LAPIC counter that
- * the NMI watchdog uses only runs while the core's not halted */
- if ( nmi_watchdog == NMI_LOCAL_APIC )
- smp_call_function(wait_for_nmis, NULL, 0);
- wait_for_nmis(NULL);
+ /*
+ * Wait at most 10 ticks for a watchdog NMI on each CPU.
+ * Busy-wait on all CPUs: the LAPIC counter that the NMI watchdog
+ * uses only runs while the core's not halted
+ */
+ on_selected_cpus(&cpu_online_map, wait_for_nmis, NULL, 1);
for_each_online_cpu ( cpu )
{
- if ( nmi_count(cpu) - prev_nmi_count[cpu] <= 5 )
+ if ( nmi_count(cpu) - prev_nmi_count[cpu] < 1 )
{
printk(" %d", cpu);
ok = 0;
--
1.7.10.4
next reply other threads:[~2015-06-22 16:22 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-22 16:21 David Vrabel [this message]
2015-06-23 9:09 ` [PATCHv1] x86: only check for one watchdog NMI Jan Beulich
2015-06-23 9:34 ` Andrew Cooper
2015-06-23 9:51 ` Jan Beulich
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=1434990111-14360-1-git-send-email-david.vrabel@citrix.com \
--to=david.vrabel@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=xen-devel@lists.xenproject.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 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.