Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69ab8494 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

genirq: Wake up irq thread after action has been installed



The wake_up_process() of the new irq thread in __setup_irq() is too
early as the irqaction is not yet fully initialized especially
action->irq is not yet set. The interrupt thread might dereference the
wrong irq descriptor.

Move the wakeup after the action is installed and action->irq has been
set.

Reported-by: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Tested-by: default avatarMichael Buesch <mb@bu3sch.de>
parent 2d860ad7
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -607,7 +607,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
		 */
		get_task_struct(t);
		new->thread = t;
		wake_up_process(t);
	}

	/*
@@ -690,6 +689,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
				(int)(new->flags & IRQF_TRIGGER_MASK));
	}

	new->irq = irq;
	*old_ptr = new;

	/* Reset broken irq detection when installing new handler */
@@ -707,7 +707,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)

	spin_unlock_irqrestore(&desc->lock, flags);

	new->irq = irq;
	/*
	 * Strictly no need to wake it up, but hung_task complains
	 * when no hard interrupt wakes the thread up.
	 */
	if (new->thread)
		wake_up_process(new->thread);

	register_irq_proc(irq, desc);
	new->dir = NULL;
	register_handler_proc(irq, new);