aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/oprofile/nmi_int.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2007-05-21 08:31:45 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-21 12:56:56 -0400
commit6c977aad03a18019015035958c65b6729cd0574c (patch)
tree9614d07dc9502bcbaf3090d971bd7bd320b0e8a5 /arch/i386/oprofile/nmi_int.c
parent4c87b948b258829f0bdffe51baa72fba5c42d359 (diff)
i386: Fix K8/core2 oprofile on multiple CPUs
Only try to allocate MSRs once instead of for every CPU. This assumes the MSRs are the same on all CPUs which is currently true. P4-HT is a special case for different SMT threads, but the code always saves/restores all MSRs so it works identical. Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/i386/oprofile/nmi_int.c')
-rw-r--r--arch/i386/oprofile/nmi_int.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/i386/oprofile/nmi_int.c b/arch/i386/oprofile/nmi_int.c
index 8e185208dfd4..a7c0783b269a 100644
--- a/arch/i386/oprofile/nmi_int.c
+++ b/arch/i386/oprofile/nmi_int.c
@@ -131,7 +131,6 @@ static void nmi_save_registers(void * dummy)
131{ 131{
132 int cpu = smp_processor_id(); 132 int cpu = smp_processor_id();
133 struct op_msrs * msrs = &cpu_msrs[cpu]; 133 struct op_msrs * msrs = &cpu_msrs[cpu];
134 model->fill_in_addresses(msrs);
135 nmi_cpu_save_registers(msrs); 134 nmi_cpu_save_registers(msrs);
136} 135}
137 136
@@ -195,6 +194,7 @@ static struct notifier_block profile_exceptions_nb = {
195static int nmi_setup(void) 194static int nmi_setup(void)
196{ 195{
197 int err=0; 196 int err=0;
197 int cpu;
198 198
199 if (!allocate_msrs()) 199 if (!allocate_msrs())
200 return -ENOMEM; 200 return -ENOMEM;
@@ -207,6 +207,13 @@ static int nmi_setup(void)
207 /* We need to serialize save and setup for HT because the subset 207 /* We need to serialize save and setup for HT because the subset
208 * of msrs are distinct for save and setup operations 208 * of msrs are distinct for save and setup operations
209 */ 209 */
210
211 /* Assume saved/restored counters are the same on all CPUs */
212 model->fill_in_addresses(&cpu_msrs[0]);
213 for_each_possible_cpu (cpu) {
214 if (cpu != 0)
215 cpu_msrs[cpu] = cpu_msrs[0];
216 }
210 on_each_cpu(nmi_save_registers, NULL, 0, 1); 217 on_each_cpu(nmi_save_registers, NULL, 0, 1);
211 on_each_cpu(nmi_cpu_setup, NULL, 0, 1); 218 on_each_cpu(nmi_cpu_setup, NULL, 0, 1);
212 nmi_enabled = 1; 219 nmi_enabled = 1;