diff options
Diffstat (limited to 'arch/i386/kernel/apic.c')
-rw-r--r-- | arch/i386/kernel/apic.c | 61 |
1 files changed, 6 insertions, 55 deletions
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index d8f94e78de8a..2d8c6ce1ecda 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c | |||
@@ -92,10 +92,6 @@ void __init apic_intr_init(void) | |||
92 | /* Using APIC to generate smp_local_timer_interrupt? */ | 92 | /* Using APIC to generate smp_local_timer_interrupt? */ |
93 | int using_apic_timer = 0; | 93 | int using_apic_timer = 0; |
94 | 94 | ||
95 | static DEFINE_PER_CPU(int, prof_multiplier) = 1; | ||
96 | static DEFINE_PER_CPU(int, prof_old_multiplier) = 1; | ||
97 | static DEFINE_PER_CPU(int, prof_counter) = 1; | ||
98 | |||
99 | static int enabled_via_apicbase; | 95 | static int enabled_via_apicbase; |
100 | 96 | ||
101 | void enable_NMI_through_LVT0 (void * dummy) | 97 | void enable_NMI_through_LVT0 (void * dummy) |
@@ -1092,34 +1088,6 @@ void enable_APIC_timer(void) | |||
1092 | } | 1088 | } |
1093 | } | 1089 | } |
1094 | 1090 | ||
1095 | /* | ||
1096 | * the frequency of the profiling timer can be changed | ||
1097 | * by writing a multiplier value into /proc/profile. | ||
1098 | */ | ||
1099 | int setup_profiling_timer(unsigned int multiplier) | ||
1100 | { | ||
1101 | int i; | ||
1102 | |||
1103 | /* | ||
1104 | * Sanity check. [at least 500 APIC cycles should be | ||
1105 | * between APIC interrupts as a rule of thumb, to avoid | ||
1106 | * irqs flooding us] | ||
1107 | */ | ||
1108 | if ( (!multiplier) || (calibration_result/multiplier < 500)) | ||
1109 | return -EINVAL; | ||
1110 | |||
1111 | /* | ||
1112 | * Set the new multiplier for each CPU. CPUs don't start using the | ||
1113 | * new values until the next timer interrupt in which they do process | ||
1114 | * accounting. At that time they also adjust their APIC timers | ||
1115 | * accordingly. | ||
1116 | */ | ||
1117 | for (i = 0; i < NR_CPUS; ++i) | ||
1118 | per_cpu(prof_multiplier, i) = multiplier; | ||
1119 | |||
1120 | return 0; | ||
1121 | } | ||
1122 | |||
1123 | #undef APIC_DIVISOR | 1091 | #undef APIC_DIVISOR |
1124 | 1092 | ||
1125 | /* | 1093 | /* |
@@ -1134,32 +1102,10 @@ int setup_profiling_timer(unsigned int multiplier) | |||
1134 | 1102 | ||
1135 | inline void smp_local_timer_interrupt(struct pt_regs * regs) | 1103 | inline void smp_local_timer_interrupt(struct pt_regs * regs) |
1136 | { | 1104 | { |
1137 | int cpu = smp_processor_id(); | ||
1138 | |||
1139 | profile_tick(CPU_PROFILING, regs); | 1105 | profile_tick(CPU_PROFILING, regs); |
1140 | if (--per_cpu(prof_counter, cpu) <= 0) { | ||
1141 | /* | ||
1142 | * The multiplier may have changed since the last time we got | ||
1143 | * to this point as a result of the user writing to | ||
1144 | * /proc/profile. In this case we need to adjust the APIC | ||
1145 | * timer accordingly. | ||
1146 | * | ||
1147 | * Interrupts are already masked off at this point. | ||
1148 | */ | ||
1149 | per_cpu(prof_counter, cpu) = per_cpu(prof_multiplier, cpu); | ||
1150 | if (per_cpu(prof_counter, cpu) != | ||
1151 | per_cpu(prof_old_multiplier, cpu)) { | ||
1152 | __setup_APIC_LVTT( | ||
1153 | calibration_result/ | ||
1154 | per_cpu(prof_counter, cpu)); | ||
1155 | per_cpu(prof_old_multiplier, cpu) = | ||
1156 | per_cpu(prof_counter, cpu); | ||
1157 | } | ||
1158 | |||
1159 | #ifdef CONFIG_SMP | 1106 | #ifdef CONFIG_SMP |
1160 | update_process_times(user_mode_vm(regs)); | 1107 | update_process_times(user_mode_vm(regs)); |
1161 | #endif | 1108 | #endif |
1162 | } | ||
1163 | 1109 | ||
1164 | /* | 1110 | /* |
1165 | * We take the 'long' return path, and there every subsystem | 1111 | * We take the 'long' return path, and there every subsystem |
@@ -1206,6 +1152,11 @@ fastcall void smp_apic_timer_interrupt(struct pt_regs *regs) | |||
1206 | irq_exit(); | 1152 | irq_exit(); |
1207 | } | 1153 | } |
1208 | 1154 | ||
1155 | int setup_profiling_timer(unsigned int multiplier) | ||
1156 | { | ||
1157 | return -EINVAL; | ||
1158 | } | ||
1159 | |||
1209 | /* | 1160 | /* |
1210 | * This interrupt should _never_ happen with our APIC/SMP architecture | 1161 | * This interrupt should _never_ happen with our APIC/SMP architecture |
1211 | */ | 1162 | */ |