[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20120524155121.20241.68413.stgit@bob.linux.org.uk>
Date: Thu, 24 May 2012 16:51:31 +0100
From: Alan Cox <alan@...rguk.ukuu.org.uk>
To: linux-kernel@...r.kernel.org
Subject: [PATCH] tty: fix ldisc lock inversion trace
From: Alan Cox <alan@...ux.intel.com>
This is caused by tty_release using tty_lock_pair to lock both
sides of the pty/tty pair, and then tty_ldisc_release dropping
and relocking one side only. We can drop both fine, so drop both
to avoid any lock ordering concerns.
Signed-off-by: Alan Cox <alan@...ux.intel.com>
---
drivers/tty/tty_ldisc.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index 173a900..833e851 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -912,10 +912,13 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
* race with the set_ldisc code path.
*/
- tty_unlock(tty);
+ /* We don't give a monkeys' about the o_tty lock here but we
+ must do both to avoid lock inversions against another single
+ locking case */
+ tty_unlock_pair(tty, o_tty);
tty_ldisc_halt(tty);
tty_ldisc_flush_works(tty);
- tty_lock(tty);
+ tty_lock_pair(tty, o_tty);
mutex_lock(&tty->ldisc_mutex);
/*
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists