tty: remove recursive implementation of tty_ldisc_release
PATCH 1/1 tty: remove recursive implementation of tty_ldisc_release
From: Alan Cox <[email protected]>
We need to do this in one pass with the locking requirements we now have.
---
drivers/tty/tty_ldisc.c | 40 +++++++++++++++++++++++----------------- 1 files changed, 23 insertions(+), 17 deletions(-)
drivers/tty/tty_ldisc.c +23 -17
@@ -894,6 +894,23 @@ int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)tty_ldisc_enable (tty);return 0 ; } + +static int tty_ldisc_kill (struct tty_struct *tty) +{ +mutex_lock (&tty->ldisc_mutex); +/* +* Now kill off the ldisc +*/ +tty_ldisc_close (tty, tty->ldisc); +tty_ldisc_put (tty->ldisc); +/* Force an oops if we mess this up */ + tty->ldisc =NULL ; + +/* Ensure the next open requests the N_TTY ldisc */ +tty_set_termios_ldisc (tty,N_TTY ); +mutex_unlock (&tty->ldisc_mutex); +} +/** * tty_ldisc_release - release line discipline * @tty: tty being shut down
@@ -912,30 +929,19 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)* race with the set_ldisc code path. */ -/* 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); +if (o_tty) { +tty_ldisc_halt (o_tty); +tty_ldisc_flush_works (o_tty); + }tty_lock_pair (tty, o_tty); -mutex_lock (&tty->ldisc_mutex); -/* -* Now kill off the ldisc -*/ -tty_ldisc_close (tty, tty->ldisc); -tty_ldisc_put (tty->ldisc); -/* Force an oops if we mess this up */ - tty->ldisc =NULL ; - -/* Ensure the next open requests the N_TTY ldisc */ -tty_set_termios_ldisc (tty,N_TTY ); -mutex_unlock (&tty->ldisc_mutex); -/* This will need doing differently if we need to lock */ +tty_ldisc_kill (tty);if (o_tty) -tty_ldisc_release (o_tty,NULL ); +tty_ldisc_kill (o_tty);/* And the memory resources remaining (buffers, termios) will be disposed of when the kref hits zero */
Quoted 7 lines · Alan Cox
From: Alan Cox <[email protected]>
We need to do this in one pass with the locking requirements we now have.
Signed-off-by Alan Cox <[email protected]>---
I don't see any lockdep warnings anymore with this patch applied on top of all others.
Quoted 11 lines · On Fri, 25 May 2012 13:13:15 +0200 Sasha Levin <[email protected]> wrote:
Quoted 7 lines · Alan Cox
From: Alan Cox <[email protected]>
We need to do this in one pass with the locking requirements we now have.
Signed-off-by Alan Cox <[email protected]>---
I don't see any lockdep warnings anymore with this patch applied on top of all others.
Yay thanks for reporting/testing
Quoted 17 lines · Alan Cox
From: Alan Cox <[email protected]>
We need to do this in one pass with the locking requirements we now have.
Signed-off-by Alan Cox <[email protected]>---
drivers/tty/tty_ldisc.c | 40 +++++++++++++++++++++++-----------------
1 files changed, 23 insertions(+), 17 deletions(-)drivers/tty/tty_ldisc.c +0
-0
drivers/tty/tty_ldisc.c int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) · line 898
Quoted 5 lines
drivers/tty/tty_ldisc.c +2
-0@@ -894,6 +894,23 @@ int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) tty_ldisc_enable(tty); return 0; } + +static int tty_ldisc_kill (struct tty_struct *tty)
Maybe the return type should be defined as void to avoid compile warning.
After applying Alan's three patches for addressing tty locks and the patch int the below link:
http://marc.info/?l=linux-kernel&m=133775308420817&w=2
Looks no lockdep warnings are triggered any more when running 'exit' in shell of ssh session.
So I will send out the formal patch in the above link.
Thanks,
Signature · 1 line
Ming Lei