aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/irqinit.c3
-rw-r--r--arch/x86/kernel/smp.c18
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 */
154void 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
243extern void hrtimer_pull(void);
244
245void smp_pull_timers_interrupt(struct pt_regs *regs)
246{
247 ack_APIC_irq();
248 TRACE("pull timer interrupt\n");
249}
250
233struct smp_ops smp_ops = { 251struct 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,