Merge tag 'irq-urgent-2020-08-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Thomas Gleixner: "Two fixes in the core interrupt code which ensure that all error exits unlock the descriptor lock" * tag 'irq-urgent-2020-08-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: genirq: Unlock irq descriptor after errors genirq/PM: Always unlock IRQ descriptor in rearm_wake_irq()
This commit is contained in:
@@ -2731,8 +2731,10 @@ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
chip = irq_data_get_irq_chip(data);
|
chip = irq_data_get_irq_chip(data);
|
||||||
if (WARN_ON_ONCE(!chip))
|
if (WARN_ON_ONCE(!chip)) {
|
||||||
return -ENODEV;
|
err = -ENODEV;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
if (chip->irq_set_irqchip_state)
|
if (chip->irq_set_irqchip_state)
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
||||||
@@ -2745,6 +2747,7 @@ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
|
|||||||
if (data)
|
if (data)
|
||||||
err = chip->irq_set_irqchip_state(data, which, val);
|
err = chip->irq_set_irqchip_state(data, which, val);
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
irq_put_desc_busunlock(desc, flags);
|
irq_put_desc_busunlock(desc, flags);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@@ -185,14 +185,18 @@ void rearm_wake_irq(unsigned int irq)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
|
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
|
||||||
|
|
||||||
if (!desc || !(desc->istate & IRQS_SUSPENDED) ||
|
if (!desc)
|
||||||
!irqd_is_wakeup_set(&desc->irq_data))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!(desc->istate & IRQS_SUSPENDED) ||
|
||||||
|
!irqd_is_wakeup_set(&desc->irq_data))
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
desc->istate &= ~IRQS_SUSPENDED;
|
desc->istate &= ~IRQS_SUSPENDED;
|
||||||
irqd_set(&desc->irq_data, IRQD_WAKEUP_ARMED);
|
irqd_set(&desc->irq_data, IRQD_WAKEUP_ARMED);
|
||||||
__enable_irq(desc);
|
__enable_irq(desc);
|
||||||
|
|
||||||
|
unlock:
|
||||||
irq_put_desc_busunlock(desc, flags);
|
irq_put_desc_busunlock(desc, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user