Make the prof_counter and prof_old_counter arrays use per-cpu data, and give them static scope. Also fix a signedness bug in the voyager implementation (from James) i386/kernel/apic.c | 16 +++++++++------- i386/mach-voyager/voyager_smp.c | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff -puN arch/i386/kernel/apic.c~profiler-make-static arch/i386/kernel/apic.c --- 25/arch/i386/kernel/apic.c~profiler-make-static 2003-02-17 16:51:39.000000000 -0800 +++ 25-akpm/arch/i386/kernel/apic.c 2003-02-17 16:51:39.000000000 -0800 @@ -50,9 +50,9 @@ void __init apic_intr_init(void) /* Using APIC to generate smp_local_timer_interrupt? */ int using_apic_timer = 0; -int prof_multiplier[NR_CPUS] = { 1, }; -int prof_old_multiplier[NR_CPUS] = { 1, }; -DEFINE_PER_CPU(int, prof_counter) = 1; +static DEFINE_PER_CPU(int, prof_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_old_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_counter) = 1; void enable_NMI_through_LVT0 (void * dummy) { @@ -986,7 +986,7 @@ int setup_profiling_timer(unsigned int m * accordingly. */ for (i = 0; i < NR_CPUS; ++i) - prof_multiplier[i] = multiplier; + per_cpu(prof_multiplier, i) = multiplier; return 0; } @@ -1018,12 +1018,14 @@ inline void smp_local_timer_interrupt(st * * Interrupts are already masked off at this point. */ - per_cpu(prof_counter, cpu) = prof_multiplier[cpu]; - if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) { + per_cpu(prof_counter, cpu) = per_cpu(prof_multiplier, cpu); + if (per_cpu(prof_counter, cpu) != + per_cpu(prof_old_multiplier, cpu)) { __setup_APIC_LVTT( calibration_result/ per_cpu(prof_counter, cpu)); - prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu); + per_cpu(prof_old_multiplier, cpu) = + per_cpu(prof_counter, cpu); } #ifdef CONFIG_SMP diff -puN arch/i386/mach-voyager/voyager_smp.c~profiler-make-static arch/i386/mach-voyager/voyager_smp.c --- 25/arch/i386/mach-voyager/voyager_smp.c~profiler-make-static 2003-02-17 16:51:39.000000000 -0800 +++ 25-akpm/arch/i386/mach-voyager/voyager_smp.c 2003-02-17 16:52:08.000000000 -0800 @@ -234,9 +234,9 @@ static int cpucount = 0; static __u32 trampoline_base; /* The per cpu profile stuff - used in smp_local_timer_interrupt */ -static unsigned int prof_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; -static unsigned int prof_old_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; -static DEFINE_PER_CPU(unsigned int, prof_counter) = 1; +static DEFINE_PER_CPU(int, prof_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_old_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_counter) = 1; /* the map used to check if a CPU has booted */ static __u32 cpu_booted_map; @@ -1318,10 +1318,12 @@ smp_local_timer_interrupt(struct pt_regs * * Interrupts are already masked off at this point. */ - per_cpu(prof_counter,cpu) = prof_multiplier[cpu]; - if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) { + per_cpu(prof_counter,cpu) = per_cpu(prof_multiplier, cpu); + if (per_cpu(prof_counter, cpu) != + per_cpu(prof_old_multiplier, cpu)) { /* FIXME: need to update the vic timer tick here */ - prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu); + per_cpu(prof_old_multiplier, cpu) = + per_cpu(prof_counter, cpu); } update_process_times(user_mode(regs)); @@ -1406,7 +1408,7 @@ setup_profiling_timer(unsigned int multi * accounting. */ for (i = 0; i < NR_CPUS; ++i) - prof_multiplier[i] = multiplier; + per_cpu(prof_multiplier, i) = multiplier; return 0; } _