diff options
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/irqinit.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/smp.c | 18 |
2 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index 40f30773fb29..f5fa64c0b37e 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
@@ -172,6 +172,9 @@ static void __init smp_intr_init(void) | |||
172 | alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR, | 172 | alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR, |
173 | call_function_single_interrupt); | 173 | call_function_single_interrupt); |
174 | 174 | ||
175 | /* IPI for hrtimer pulling on remote cpus */ | ||
176 | alloc_intr_gate(PULL_TIMERS_VECTOR, pull_timers_interrupt); | ||
177 | |||
175 | /* Low priority IPI to cleanup after moving an irq */ | 178 | /* Low priority IPI to cleanup after moving an irq */ |
176 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); | 179 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); |
177 | set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors); | 180 | set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors); |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index 337ce0c44f92..e83f79de863c 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
@@ -150,6 +150,16 @@ void native_send_call_func_ipi(const struct cpumask *mask) | |||
150 | free_cpumask_var(allbutself); | 150 | free_cpumask_var(allbutself); |
151 | } | 151 | } |
152 | 152 | ||
153 | /* trigger timers on remote cpu */ | ||
154 | void smp_send_pull_timers(int cpu) | ||
155 | { | ||
156 | if (unlikely(cpu_is_offline(cpu))) { | ||
157 | WARN_ON(1); | ||
158 | return; | ||
159 | } | ||
160 | apic->send_IPI_mask(cpumask_of(cpu), PULL_TIMERS_VECTOR); | ||
161 | } | ||
162 | |||
153 | /* | 163 | /* |
154 | * this function calls the 'stop' function on all other CPUs in the system. | 164 | * this function calls the 'stop' function on all other CPUs in the system. |
155 | */ | 165 | */ |
@@ -230,6 +240,14 @@ void smp_call_function_single_interrupt(struct pt_regs *regs) | |||
230 | irq_exit(); | 240 | irq_exit(); |
231 | } | 241 | } |
232 | 242 | ||
243 | extern void hrtimer_pull(void); | ||
244 | |||
245 | void smp_pull_timers_interrupt(struct pt_regs *regs) | ||
246 | { | ||
247 | ack_APIC_irq(); | ||
248 | TRACE("pull timer interrupt\n"); | ||
249 | } | ||
250 | |||
233 | struct smp_ops smp_ops = { | 251 | struct smp_ops smp_ops = { |
234 | .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, | 252 | .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, |
235 | .smp_prepare_cpus = native_smp_prepare_cpus, | 253 | .smp_prepare_cpus = native_smp_prepare_cpus, |