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

Commit eef2622a authored by Christian Borntraeger's avatar Christian Borntraeger Committed by Benjamin Herrenschmidt
Browse files

hvc_console: Fix free_irq in spinlocked section



    commit 611e097d
    Author: Christian Borntraeger <borntraeger@de.ibm.com>
    hvc_console: rework setup to replace irq functions with callbacks
    introduced a spinlock recursion problem. The notifier_del is
    called with a lock held, and in turns calls free_irq which then
    complains when manipulating procfs. This fixes it by moving the
    call to the notifier to outside of the locked section.

Signed-off-by: default avatarChristian <Borntraeger&lt;borntraeger@de.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent f5ea64dc
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -367,13 +367,13 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
	spin_lock_irqsave(&hp->lock, flags);

	if (--hp->count == 0) {
		if (hp->ops->notifier_del)
			hp->ops->notifier_del(hp, hp->data);

		/* We are done with the tty pointer now. */
		hp->tty = NULL;
		spin_unlock_irqrestore(&hp->lock, flags);

		if (hp->ops->notifier_del)
			hp->ops->notifier_del(hp, hp->data);

		/*
		 * Chain calls chars_in_buffer() and returns immediately if
		 * there is no buffered data otherwise sleeps on a wait queue
@@ -416,11 +416,11 @@ static void hvc_hangup(struct tty_struct *tty)
	hp->n_outbuf = 0;
	hp->tty = NULL;

	spin_unlock_irqrestore(&hp->lock, flags);

	if (hp->ops->notifier_del)
			hp->ops->notifier_del(hp, hp->data);

	spin_unlock_irqrestore(&hp->lock, flags);

	while(temp_open_count) {
		--temp_open_count;
		kref_put(&hp->kref, destroy_hvc_struct);