diff options
-rw-r--r-- | arch/i386/kernel/vm86.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index d16cd3738a4..d3b4c540eb6 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c | |||
@@ -717,12 +717,12 @@ static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs) | |||
717 | irqbits |= irq_bit; | 717 | irqbits |= irq_bit; |
718 | if (vm86_irqs[intno].sig) | 718 | if (vm86_irqs[intno].sig) |
719 | send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1); | 719 | send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1); |
720 | spin_unlock_irqrestore(&irqbits_lock, flags); | ||
721 | /* | 720 | /* |
722 | * IRQ will be re-enabled when user asks for the irq (whether | 721 | * IRQ will be re-enabled when user asks for the irq (whether |
723 | * polling or as a result of the signal) | 722 | * polling or as a result of the signal) |
724 | */ | 723 | */ |
725 | disable_irq(intno); | 724 | disable_irq_nosync(intno); |
725 | spin_unlock_irqrestore(&irqbits_lock, flags); | ||
726 | return IRQ_HANDLED; | 726 | return IRQ_HANDLED; |
727 | 727 | ||
728 | out: | 728 | out: |
@@ -754,17 +754,20 @@ static inline int get_and_reset_irq(int irqnumber) | |||
754 | { | 754 | { |
755 | int bit; | 755 | int bit; |
756 | unsigned long flags; | 756 | unsigned long flags; |
757 | int ret = 0; | ||
757 | 758 | ||
758 | if (invalid_vm86_irq(irqnumber)) return 0; | 759 | if (invalid_vm86_irq(irqnumber)) return 0; |
759 | if (vm86_irqs[irqnumber].tsk != current) return 0; | 760 | if (vm86_irqs[irqnumber].tsk != current) return 0; |
760 | spin_lock_irqsave(&irqbits_lock, flags); | 761 | spin_lock_irqsave(&irqbits_lock, flags); |
761 | bit = irqbits & (1 << irqnumber); | 762 | bit = irqbits & (1 << irqnumber); |
762 | irqbits &= ~bit; | 763 | irqbits &= ~bit; |
764 | if (bit) { | ||
765 | enable_irq(irqnumber); | ||
766 | ret = 1; | ||
767 | } | ||
768 | |||
763 | spin_unlock_irqrestore(&irqbits_lock, flags); | 769 | spin_unlock_irqrestore(&irqbits_lock, flags); |
764 | if (!bit) | 770 | return ret; |
765 | return 0; | ||
766 | enable_irq(irqnumber); | ||
767 | return 1; | ||
768 | } | 771 | } |
769 | 772 | ||
770 | 773 | ||