[PATCH] tty: fix ldisc lock inversion trace

From: Alan Cox
Date: Thu May 24 2012 - 11:35:54 EST


From: Alan Cox <alan@xxxxxxxxxxxxxxx>

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@xxxxxxxxxxxxxxx>
---

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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/