]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
x86: introduce a nmi_count tracking variable
authorRoger Pau Monné <roger.pau@citrix.com>
Wed, 26 Feb 2020 16:36:30 +0000 (17:36 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 26 Feb 2020 16:36:30 +0000 (17:36 +0100)
This is modeled after the irq_count variable, and is used to account
for all the NMIs handled by the system.

This will allow to repurpose the nmi_count() helper so it can be used
in a similar manner as local_irq_count(): account for the NMIs
currently in service.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/nmi.c
xen/arch/x86/traps.c
xen/include/asm-x86/hardirq.h
xen/include/asm-x86/nmi.h
xen/include/xen/irq_cpustat.h

index a69b91a924025dec8c946e6617b9402b8bf15f11..c3f92ed231562e40b36acf3096b17d879681b3ea 100644 (file)
@@ -151,15 +151,14 @@ int nmi_active;
 
 static void __init wait_for_nmis(void *p)
 {
-    unsigned int cpu = smp_processor_id();
-    unsigned int start_count = nmi_count(cpu);
+    unsigned int start_count = this_cpu(nmi_count);
     unsigned long ticks = 10 * 1000 * cpu_khz / nmi_hz;
     unsigned long s, e;
 
     s = rdtsc();
     do {
         cpu_relax();
-        if ( nmi_count(cpu) >= start_count + 2 )
+        if ( this_cpu(nmi_count) >= start_count + 2 )
             break;
         e = rdtsc();
     } while( e - s < ticks );
@@ -177,7 +176,7 @@ void __init check_nmi_watchdog(void)
     printk("Testing NMI watchdog on all CPUs:");
 
     for_each_online_cpu ( cpu )
-        prev_nmi_count[cpu] = nmi_count(cpu);
+        prev_nmi_count[cpu] = per_cpu(nmi_count, cpu);
 
     /*
      * Wait at most 10 ticks for 2 watchdog NMIs on each CPU.
@@ -188,7 +187,7 @@ void __init check_nmi_watchdog(void)
 
     for_each_online_cpu ( cpu )
     {
-        if ( nmi_count(cpu) - prev_nmi_count[cpu] < 2 )
+        if ( per_cpu(nmi_count, cpu) - prev_nmi_count[cpu] < 2 )
         {
             printk(" %d", cpu);
             ok = false;
@@ -593,7 +592,7 @@ static void do_nmi_stats(unsigned char key)
 
     printk("CPU\tNMI\n");
     for_each_online_cpu ( cpu )
-        printk("%3u\t%3u\n", cpu, nmi_count(cpu));
+        printk("%3u\t%3u\n", cpu, per_cpu(nmi_count, cpu));
 
     if ( !hardware_domain || !(v = domain_vcpu(hardware_domain, 0)) )
         return;
index 56067f85d1b6d2243343afd6b08a9977ad2b6e48..3dbc66bb64d15602da26be75059fd582b0099846 100644 (file)
@@ -1683,13 +1683,15 @@ static int dummy_nmi_callback(const struct cpu_user_regs *regs, int cpu)
 
 static nmi_callback_t *nmi_callback = dummy_nmi_callback;
 
+DEFINE_PER_CPU(unsigned int, nmi_count);
+
 void do_nmi(const struct cpu_user_regs *regs)
 {
     unsigned int cpu = smp_processor_id();
     unsigned char reason = 0;
     bool handle_unknown = false;
 
-    ++nmi_count(cpu);
+    this_cpu(nmi_count)++;
 
     if ( nmi_callback(regs, cpu) )
         return;
index 34e1b492609ea22468e16659d64a27b302d80c68..802f91cfdf6c590db6453305310e2ca2d7e2c13b 100644 (file)
@@ -7,7 +7,6 @@
 typedef struct {
        unsigned int __softirq_pending;
        unsigned int __local_irq_count;
-       unsigned int __nmi_count;
        bool_t __mwait_wakeup;
 } __cacheline_aligned irq_cpustat_t;
 
index f9dfca6afbe3ba54724d611a7c173495ffcc0247..a288f02a50247c3ecfb34e36611a46a85af51255 100644 (file)
@@ -31,5 +31,7 @@ nmi_callback_t *set_nmi_callback(nmi_callback_t *callback);
  * Remove the handler previously set.
  */
 void unset_nmi_callback(void);
+
+DECLARE_PER_CPU(unsigned int, nmi_count);
  
 #endif /* ASM_NMI_H */
index 73629f6ec80e6d3272a2e26fac93bec7aa2bcc9c..b9629f25c266488c8db2ca06b59953b745f15e8b 100644 (file)
@@ -24,7 +24,6 @@ extern irq_cpustat_t irq_stat[];
   /* arch independent irq_stat fields */
 #define softirq_pending(cpu)   __IRQ_STAT((cpu), __softirq_pending)
 #define local_irq_count(cpu)   __IRQ_STAT((cpu), __local_irq_count)
-#define nmi_count(cpu)         __IRQ_STAT((cpu), __nmi_count)
 #define mwait_wakeup(cpu)      __IRQ_STAT((cpu), __mwait_wakeup)
 
 #endif /* __irq_cpustat_h */