Patch from Ravikiran G Thirumalai Converts the ia32 kernel profiler to use use the percpu area infrastructure. arch/i386/kernel/apic.c | 14 ++++++++------ arch/i386/kernel/smpboot.c | 15 --------------- arch/i386/mach-voyager/voyager_smp.c | 13 +++++-------- 3 files changed, 13 insertions(+), 29 deletions(-) diff -puN arch/i386/kernel/apic.c~profiler-per-cpu arch/i386/kernel/apic.c --- 25/arch/i386/kernel/apic.c~profiler-per-cpu Thu Jan 16 12:04:17 2003 +++ 25-akpm/arch/i386/kernel/apic.c Thu Jan 16 12:04:17 2003 @@ -52,7 +52,7 @@ int using_apic_timer = 0; int prof_multiplier[NR_CPUS] = { 1, }; int prof_old_multiplier[NR_CPUS] = { 1, }; -int prof_counter[NR_CPUS] = { 1, }; +DEFINE_PER_CPU(int, prof_counter) = 1; int get_maxlvt(void) { @@ -997,7 +997,7 @@ inline void smp_local_timer_interrupt(st x86_do_profile(regs); - if (--prof_counter[cpu] <= 0) { + if (--per_cpu(prof_counter, cpu) <= 0) { /* * The multiplier may have changed since the last time we got * to this point as a result of the user writing to @@ -1006,10 +1006,12 @@ inline void smp_local_timer_interrupt(st * * Interrupts are already masked off at this point. */ - prof_counter[cpu] = prof_multiplier[cpu]; - if (prof_counter[cpu] != prof_old_multiplier[cpu]) { - __setup_APIC_LVTT(calibration_result/prof_counter[cpu]); - prof_old_multiplier[cpu] = prof_counter[cpu]; + per_cpu(prof_counter, cpu) = prof_multiplier[cpu]; + if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) { + __setup_APIC_LVTT( + calibration_result/ + per_cpu(prof_counter, cpu)); + prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu); } #ifdef CONFIG_SMP diff -puN arch/i386/kernel/smpboot.c~profiler-per-cpu arch/i386/kernel/smpboot.c --- 25/arch/i386/kernel/smpboot.c~profiler-per-cpu Thu Jan 16 12:04:17 2003 +++ 25-akpm/arch/i386/kernel/smpboot.c Thu Jan 16 12:04:17 2003 @@ -935,10 +935,6 @@ static void smp_tune_scheduling (void) * Cycle through the processors sending APIC IPIs to boot each. */ -extern int prof_multiplier[NR_CPUS]; -extern int prof_old_multiplier[NR_CPUS]; -extern int prof_counter[NR_CPUS]; - static int boot_cpu_logical_apicid; /* Where the IO area was mapped on multiquad, always 0 otherwise */ void *xquad_portio; @@ -950,17 +946,6 @@ static void __init smp_boot_cpus(unsigne int apicid, cpu, bit; /* - * Initialize the logical to physical CPU number mapping - * and the per-CPU profiling counter/multiplier - */ - - for (cpu = 0; cpu < NR_CPUS; cpu++) { - prof_counter[cpu] = 1; - prof_old_multiplier[cpu] = 1; - prof_multiplier[cpu] = 1; - } - - /* * Setup boot CPU information */ smp_store_cpu_info(0); /* Final full version of the data */ diff -puN arch/i386/mach-voyager/voyager_smp.c~profiler-per-cpu arch/i386/mach-voyager/voyager_smp.c --- 25/arch/i386/mach-voyager/voyager_smp.c~profiler-per-cpu Thu Jan 16 12:04:17 2003 +++ 25-akpm/arch/i386/mach-voyager/voyager_smp.c Thu Jan 16 12:04:17 2003 @@ -236,7 +236,7 @@ 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 unsigned int prof_counter[NR_CPUS] __cacheline_aligned = { 1, }; +static DEFINE_PER_CPU(unsigned int, prof_counter) = 1; /* the map used to check if a CPU has booted */ static __u32 cpu_booted_map; @@ -393,9 +393,6 @@ find_smp_config(void) /* initialize the CPU structures (moved from smp_boot_cpus) */ for(i=0; i