diff options
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 | /* |