|
@@ -717,12 +717,12 @@ static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs)
|
|
|
irqbits |= irq_bit;
|
|
|
if (vm86_irqs[intno].sig)
|
|
|
send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
|
|
|
- spin_unlock_irqrestore(&irqbits_lock, flags);
|
|
|
/*
|
|
|
* IRQ will be re-enabled when user asks for the irq (whether
|
|
|
* polling or as a result of the signal)
|
|
|
*/
|
|
|
- disable_irq(intno);
|
|
|
+ disable_irq_nosync(intno);
|
|
|
+ spin_unlock_irqrestore(&irqbits_lock, flags);
|
|
|
return IRQ_HANDLED;
|
|
|
|
|
|
out:
|
|
@@ -754,17 +754,20 @@ static inline int get_and_reset_irq(int irqnumber)
|
|
|
{
|
|
|
int bit;
|
|
|
unsigned long flags;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (invalid_vm86_irq(irqnumber)) return 0;
|
|
|
if (vm86_irqs[irqnumber].tsk != current) return 0;
|
|
|
spin_lock_irqsave(&irqbits_lock, flags);
|
|
|
bit = irqbits & (1 << irqnumber);
|
|
|
irqbits &= ~bit;
|
|
|
+ if (bit) {
|
|
|
+ enable_irq(irqnumber);
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+
|
|
|
spin_unlock_irqrestore(&irqbits_lock, flags);
|
|
|
- if (!bit)
|
|
|
- return 0;
|
|
|
- enable_irq(irqnumber);
|
|
|
- return 1;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
|