Commit 1d229a65 authored by Linus Torvalds's avatar Linus Torvalds

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()
parents e1d74fbe f107cee9
...@@ -2731,8 +2731,10 @@ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, ...@@ -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, ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment