diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2008-08-07 09:18:34 +0200 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-08-12 17:52:55 +1000 |
commit | b1b135c8d619cb2c7045d6ee4e48375882518bb5 (patch) | |
tree | 7c48ccd12e2d01e548351f34bde77fb13f5dc513 | |
parent | ed6d68763b8b589c0ae9d231cbd72bd01f6685c5 (diff) | |
download | linux-3.10-b1b135c8d619cb2c7045d6ee4e48375882518bb5.tar.gz linux-3.10-b1b135c8d619cb2c7045d6ee4e48375882518bb5.tar.bz2 linux-3.10-b1b135c8d619cb2c7045d6ee4e48375882518bb5.zip |
fix spinlock recursion in hvc_console
commit 611e097d7707741a336a0677d9d69bec40f29f3d
Author: Christian Borntraeger <borntraeger@de.ibm.com>
hvc_console: rework setup to replace irq functions with callbacks
introduced a spinlock recursion problem.
request_irq tries to call the handler if the IRQ is shared.
The irq handler of hvc_console calls hvc_poll and hvc_kill
which might take the hvc_struct spinlock. Therefore, we have
to call request_irq outside the spinlock.
We can move the notifier_add safely outside the spinlock as ->data must
not be changed by the backend. Otherwise, tty_hangup would fail anyway.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | drivers/char/hvc_console.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index 02aac104842..fd64137b1ab 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c @@ -322,11 +322,10 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) hp->tty = tty; - if (hp->ops->notifier_add) - rc = hp->ops->notifier_add(hp, hp->data); - spin_unlock_irqrestore(&hp->lock, flags); + if (hp->ops->notifier_add) + rc = hp->ops->notifier_add(hp, hp->data); /* * If the notifier fails we return an error. The tty layer |