x86/oprofile: Fix initialization of switch_index
authorRobert Richter <robert.richter@amd.com>
Thu, 9 Jul 2009 17:23:50 +0000 (19:23 +0200)
committerRobert Richter <robert.richter@amd.com>
Mon, 20 Jul 2009 14:43:18 +0000 (16:43 +0200)
Variable switch_index must be initialized for each cpu. This patch
fixes the initialization by moving it to the per-cpu init function
nmi_cpu_setup().

Signed-off-by: Robert Richter <robert.richter@amd.com>
arch/x86/oprofile/nmi_int.c

index 8cd4658..b211d33 100644 (file)
@@ -160,7 +160,7 @@ static int allocate_msrs(void)
 
 #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
 
-static void nmi_setup_cpu_mux(struct op_msrs const * const msrs)
+static void nmi_cpu_setup_mux(int cpu, struct op_msrs const * const msrs)
 {
        int i;
        struct op_msr *multiplex = msrs->multiplex;
@@ -173,8 +173,15 @@ static void nmi_setup_cpu_mux(struct op_msrs const * const msrs)
                        multiplex[i].saved = 0;
                }
        }
+
+       per_cpu(switch_index, cpu) = 0;
 }
 
+#else
+
+static inline void
+nmi_cpu_setup_mux(int cpu, struct op_msrs const * const msrs) { }
+
 #endif
 
 static void nmi_cpu_setup(void *dummy)
@@ -184,9 +191,7 @@ static void nmi_cpu_setup(void *dummy)
        nmi_cpu_save_registers(msrs);
        spin_lock(&oprofilefs_lock);
        model->setup_ctrs(model, msrs);
-#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
-       nmi_setup_cpu_mux(msrs);
-#endif
+       nmi_cpu_setup_mux(cpu, msrs);
        spin_unlock(&oprofilefs_lock);
        per_cpu(saved_lvtpc, cpu) = apic_read(APIC_LVTPC);
        apic_write(APIC_LVTPC, APIC_DM_NMI);
@@ -662,9 +667,6 @@ int __init op_nmi_init(struct oprofile_operations *ops)
        register_cpu_notifier(&oprofile_cpu_nb);
 #endif
        /* default values, can be overwritten by model */
-#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
-       __raw_get_cpu_var(switch_index) = 0;
-#endif
        ops->create_files       = nmi_create_files;
        ops->setup              = nmi_setup;
        ops->shutdown           = nmi_shutdown;