x86/mce: eliminate unnecessary NR_CPUS-sized arrays
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 9 Jul 2010 11:23:52 +0000 (12:23 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 9 Jul 2010 11:23:52 +0000 (12:23 +0100)
Replace them with per-CPU data.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/cpu/mcheck/mce_intel.c
xen/arch/x86/cpu/mcheck/mctelem.c

index 83e6193268c072d0fe27a9bb47d01348e8d5c94e..00ee183fce50e41c76b562b02a158aa39f5d5bcf 100644 (file)
@@ -41,13 +41,13 @@ static void intel_thermal_interrupt(struct cpu_user_regs *regs)
 {
     uint64_t msr_content;
     unsigned int cpu = smp_processor_id();
-    static s_time_t next[NR_CPUS];
+    static DEFINE_PER_CPU(s_time_t, next);
 
     ack_APIC_irq();
-    if (NOW() < next[cpu])
+    if (NOW() < per_cpu(next, cpu))
         return;
 
-    next[cpu] = NOW() + MILLISECS(5000);
+    per_cpu(next, cpu) = NOW() + MILLISECS(5000);
     rdmsrl(MSR_IA32_THERM_STATUS, msr_content);
     if (msr_content & 0x1) {
         printk(KERN_EMERG "CPU%d: Temperature above threshold\n", cpu);
index 67ebb9341f1dc59998f908556a1160da9f8cea0a..37d830f3b7f9a8676b42b00b00a0486afc7173d0 100644 (file)
@@ -109,15 +109,19 @@ static struct mc_telem_ctl {
         * Telemetry array
         */
        struct mctelem_ent *mctc_elems;
+} mctctl;
+
+struct mc_telem_cpu_ctl {
        /*
         * Per-CPU processing lists, used for deferred (softirq)
-        * processing of telemetry. mctc_cpu is indexed by the
-        * CPU that the telemetry belongs to. mctc_cpu_processing
-        * is indexed by the CPU that is processing the telemetry.
+        * processing of telemetry. @pending is indexed by the
+        * CPU that the telemetry belongs to. @processing is indexed
+        * by the CPU that is processing the telemetry.
         */
-       struct mctelem_ent *mctc_cpu[NR_CPUS];
-       struct mctelem_ent *mctc_cpu_processing[NR_CPUS];
-} mctctl;
+       struct mctelem_ent *pending;
+       struct mctelem_ent *processing;
+};
+static DEFINE_PER_CPU(struct mc_telem_cpu_ctl, mctctl);
 
 /* Lock protecting all processing lists */
 static DEFINE_SPINLOCK(processing_lock);
@@ -139,8 +143,7 @@ void mctelem_defer(mctelem_cookie_t cookie)
 {
        struct mctelem_ent *tep = COOKIE2MCTE(cookie);
 
-       mctelem_xchg_head(&mctctl.mctc_cpu[smp_processor_id()],
-           &tep->mcte_next, tep);
+       mctelem_xchg_head(&this_cpu(mctctl.pending), &tep->mcte_next, tep);
 }
 
 void mctelem_process_deferred(unsigned int cpu,
@@ -154,10 +157,10 @@ void mctelem_process_deferred(unsigned int cpu,
         * First, unhook the list of telemetry structures, and  
         * hook it up to the processing list head for this CPU.
         */
-       mctelem_xchg_head(&mctctl.mctc_cpu[cpu],
-           &mctctl.mctc_cpu_processing[smp_processor_id()], NULL);
+       mctelem_xchg_head(&per_cpu(mctctl.pending, cpu),
+                         &this_cpu(mctctl.processing), NULL);
 
-       head = mctctl.mctc_cpu_processing[smp_processor_id()];
+       head = this_cpu(mctctl.processing);
 
        /*
         * Then, fix up the list to include prev pointers, to make
@@ -193,7 +196,7 @@ void mctelem_process_deferred(unsigned int cpu,
 
 int mctelem_has_deferred(unsigned int cpu)
 {
-       if (mctctl.mctc_cpu[cpu] != NULL)
+       if (per_cpu(mctctl.pending, cpu) != NULL)
                return 1;
        return 0;
 }