diff options
Diffstat (limited to 'arch/i386/kernel/smp.c')
-rw-r--r-- | arch/i386/kernel/smp.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index 31e5c6573aae..5285aff8367f 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c | |||
@@ -321,7 +321,6 @@ 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); | ||
325 | unsigned long cpu; | 324 | unsigned long cpu; |
326 | 325 | ||
327 | cpu = get_cpu(); | 326 | cpu = get_cpu(); |
@@ -352,7 +351,6 @@ fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | |||
352 | smp_mb__after_clear_bit(); | 351 | smp_mb__after_clear_bit(); |
353 | out: | 352 | out: |
354 | put_cpu_no_resched(); | 353 | put_cpu_no_resched(); |
355 | set_irq_regs(old_regs); | ||
356 | } | 354 | } |
357 | 355 | ||
358 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 356 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, |
@@ -607,14 +605,11 @@ void smp_send_stop(void) | |||
607 | */ | 605 | */ |
608 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) | 606 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) |
609 | { | 607 | { |
610 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
611 | ack_APIC_irq(); | 608 | ack_APIC_irq(); |
612 | set_irq_regs(old_regs); | ||
613 | } | 609 | } |
614 | 610 | ||
615 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) | 611 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) |
616 | { | 612 | { |
617 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
618 | void (*func) (void *info) = call_data->func; | 613 | void (*func) (void *info) = call_data->func; |
619 | void *info = call_data->info; | 614 | void *info = call_data->info; |
620 | int wait = call_data->wait; | 615 | int wait = call_data->wait; |
@@ -637,7 +632,6 @@ fastcall void smp_call_function_interrupt(struct pt_regs *regs) | |||
637 | mb(); | 632 | mb(); |
638 | atomic_inc(&call_data->finished); | 633 | atomic_inc(&call_data->finished); |
639 | } | 634 | } |
640 | set_irq_regs(old_regs); | ||
641 | } | 635 | } |
642 | 636 | ||
643 | /* | 637 | /* |
@@ -699,6 +693,10 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | |||
699 | put_cpu(); | 693 | put_cpu(); |
700 | return -EBUSY; | 694 | return -EBUSY; |
701 | } | 695 | } |
696 | |||
697 | /* Can deadlock when called with interrupts disabled */ | ||
698 | WARN_ON(irqs_disabled()); | ||
699 | |||
702 | spin_lock_bh(&call_lock); | 700 | spin_lock_bh(&call_lock); |
703 | __smp_call_function_single(cpu, func, info, nonatomic, wait); | 701 | __smp_call_function_single(cpu, func, info, nonatomic, wait); |
704 | spin_unlock_bh(&call_lock); | 702 | spin_unlock_bh(&call_lock); |