diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-05 19:32:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-05 19:32:01 -0400 |
commit | 44aefd2706bb6f5b65ba2c38cd89e7609e2b43d3 (patch) | |
tree | 93824f573767da634fbc82c388b6d33cc454212b /arch/i386/kernel/smp.c | |
parent | c1a26e7d40fb814716950122353a1a556844286b (diff) | |
parent | 7d12e780e003f93433d49ce78cfedf4b4c52adc5 (diff) |
Merge git://git.infradead.org/~dhowells/irq-2.6
* git://git.infradead.org/~dhowells/irq-2.6:
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
IRQ: Typedef the IRQ handler function type
IRQ: Typedef the IRQ flow handler function type
Diffstat (limited to 'arch/i386/kernel/smp.c')
-rw-r--r-- | arch/i386/kernel/smp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index 1b080ab8a49f..31e5c6573aae 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c | |||
@@ -321,6 +321,7 @@ static inline void leave_mm (unsigned long cpu) | |||
321 | 321 | ||
322 | fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | 322 | fastcall void smp_invalidate_interrupt(struct pt_regs *regs) |
323 | { | 323 | { |
324 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
324 | unsigned long cpu; | 325 | unsigned long cpu; |
325 | 326 | ||
326 | cpu = get_cpu(); | 327 | cpu = get_cpu(); |
@@ -351,6 +352,7 @@ fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | |||
351 | smp_mb__after_clear_bit(); | 352 | smp_mb__after_clear_bit(); |
352 | out: | 353 | out: |
353 | put_cpu_no_resched(); | 354 | put_cpu_no_resched(); |
355 | set_irq_regs(old_regs); | ||
354 | } | 356 | } |
355 | 357 | ||
356 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 358 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, |
@@ -605,11 +607,14 @@ void smp_send_stop(void) | |||
605 | */ | 607 | */ |
606 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) | 608 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) |
607 | { | 609 | { |
610 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
608 | ack_APIC_irq(); | 611 | ack_APIC_irq(); |
612 | set_irq_regs(old_regs); | ||
609 | } | 613 | } |
610 | 614 | ||
611 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) | 615 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) |
612 | { | 616 | { |
617 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
613 | void (*func) (void *info) = call_data->func; | 618 | void (*func) (void *info) = call_data->func; |
614 | void *info = call_data->info; | 619 | void *info = call_data->info; |
615 | int wait = call_data->wait; | 620 | int wait = call_data->wait; |
@@ -632,6 +637,7 @@ fastcall void smp_call_function_interrupt(struct pt_regs *regs) | |||
632 | mb(); | 637 | mb(); |
633 | atomic_inc(&call_data->finished); | 638 | atomic_inc(&call_data->finished); |
634 | } | 639 | } |
640 | set_irq_regs(old_regs); | ||
635 | } | 641 | } |
636 | 642 | ||
637 | /* | 643 | /* |