diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-04-22 23:04:09 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-04-22 23:04:09 -0400 |
commit | 042043c14a2fe0d3f78682d8f149e038926d5869 (patch) | |
tree | e00999c6d52ea9ed1e034beb8cf2f4fe5a9515f6 /arch/x86 | |
parent | b5c4ababa76ce94cfa276f620b81d7d0f1d8ebf1 (diff) |
x86-32: add support for smp_send_pull_timers()
This establishes the architectures dependent bits for hrtimer_start_on()
on x86-32.
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/smp_32.c | 17 | ||||
-rw-r--r-- | arch/x86/kernel/smpboot_32.c | 2 |
2 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/kernel/smp_32.c b/arch/x86/kernel/smp_32.c index 1063dfc498..e1c5aa316f 100644 --- a/arch/x86/kernel/smp_32.c +++ b/arch/x86/kernel/smp_32.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <asm/mmu_context.h> | 25 | #include <asm/mmu_context.h> |
26 | #include <mach_apic.h> | 26 | #include <mach_apic.h> |
27 | 27 | ||
28 | #include <litmus/litmus.h> | ||
29 | |||
28 | /* | 30 | /* |
29 | * Some notes on x86 processor bugs affecting SMP operation: | 31 | * Some notes on x86 processor bugs affecting SMP operation: |
30 | * | 32 | * |
@@ -475,6 +477,12 @@ static void native_smp_send_reschedule(int cpu) | |||
475 | send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR); | 477 | send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR); |
476 | } | 478 | } |
477 | 479 | ||
480 | void smp_send_pull_timers(int cpu) | ||
481 | { | ||
482 | WARN_ON(cpu_is_offline(cpu)); | ||
483 | send_IPI_mask(cpumask_of_cpu(cpu), PULL_TIMERS_VECTOR); | ||
484 | } | ||
485 | |||
478 | /* | 486 | /* |
479 | * Structure and data for smp_call_function(). This is designed to minimise | 487 | * Structure and data for smp_call_function(). This is designed to minimise |
480 | * static memory requirements. It also looks cleaner. | 488 | * static memory requirements. It also looks cleaner. |
@@ -645,6 +653,15 @@ fastcall void smp_reschedule_interrupt(struct pt_regs *regs) | |||
645 | __get_cpu_var(irq_stat).irq_resched_count++; | 653 | __get_cpu_var(irq_stat).irq_resched_count++; |
646 | } | 654 | } |
647 | 655 | ||
656 | extern void hrtimer_pull(void); | ||
657 | |||
658 | fastcall void smp_pull_timers_interrupt(struct pt_regs *regs) | ||
659 | { | ||
660 | ack_APIC_irq(); | ||
661 | TRACE("pull timers interrupt\n"); | ||
662 | hrtimer_pull(); | ||
663 | } | ||
664 | |||
648 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) | 665 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) |
649 | { | 666 | { |
650 | void (*func) (void *info) = call_data->func; | 667 | void (*func) (void *info) = call_data->func; |
diff --git a/arch/x86/kernel/smpboot_32.c b/arch/x86/kernel/smpboot_32.c index 4ea80cbe52..133cbb6118 100644 --- a/arch/x86/kernel/smpboot_32.c +++ b/arch/x86/kernel/smpboot_32.c | |||
@@ -1323,6 +1323,8 @@ void __init smp_intr_init(void) | |||
1323 | 1323 | ||
1324 | /* IPI for generic function call */ | 1324 | /* IPI for generic function call */ |
1325 | set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | 1325 | set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); |
1326 | |||
1327 | set_intr_gate(PULL_TIMERS_VECTOR, pull_timers_interrupt); | ||
1326 | } | 1328 | } |
1327 | 1329 | ||
1328 | /* | 1330 | /* |