Commit 3b35375f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'irq-urgent-2023-08-26' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fix from Thomas Gleixner:
 "A last minute fix for a regression introduced in the v6.5 merge
  window.

  The conversion of the software based interrupt resend mechanism to
  hlist missed to add a check whether the descriptor is already enqueued
  and dropped the interrupt descriptor lookup for nested interrupts.

  The missing check whether the descriptor is already queued causes
  hlist corruption and can be observed in the wild. The dropped parent
  descriptor lookup has not yet caused problems, but it would result in
  stale interrupt line in the worst case.

  Add the missing enqueued check and bring the descriptor lookup back to
  cure this"

* tag 'irq-urgent-2023-08-26' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  genirq: Fix software resend lockup and nested resend
parents c3137613 9f5deb55
...@@ -68,11 +68,16 @@ static int irq_sw_resend(struct irq_desc *desc) ...@@ -68,11 +68,16 @@ static int irq_sw_resend(struct irq_desc *desc)
*/ */
if (!desc->parent_irq) if (!desc->parent_irq)
return -EINVAL; return -EINVAL;
desc = irq_to_desc(desc->parent_irq);
if (!desc)
return -EINVAL;
} }
/* Add to resend_list and activate the softirq: */ /* Add to resend_list and activate the softirq: */
raw_spin_lock(&irq_resend_lock); raw_spin_lock(&irq_resend_lock);
hlist_add_head(&desc->resend_node, &irq_resend_list); if (hlist_unhashed(&desc->resend_node))
hlist_add_head(&desc->resend_node, &irq_resend_list);
raw_spin_unlock(&irq_resend_lock); raw_spin_unlock(&irq_resend_lock);
tasklet_schedule(&resend_tasklet); tasklet_schedule(&resend_tasklet);
return 0; return 0;
......
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