lkml.org 
[lkml]   [2013]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] tty: Only hangup once
On Wed, Jul 31, 2013 at 02:05:45PM -0400, Peter Hurley wrote:
> Instrumented testing shows a tty can be hungup multiple times [1].
> Although concurrent hangups are properly serialized, multiple
> hangups for the same tty should be prevented.
>
> If tty has already been HUPPED, abort hangup. Note it is not
> necessary to cleanup file *redirect on subsequent hangups,
> as only TIOCCONS can set that value and ioctls are disabled
> after hangup.
>
> Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
>
> [1]
> Test performed by simulating a concurrent async hangup via
> tty_hangup() with a sync hangup via tty_vhangup(), while
> __tty_hangup() was instrumented with:
>
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index 26bb78c..fe8b061 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -629,6 +629,8 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)
>
> tty_lock(tty);
>
> + WARN_ON(test_bit(TTY_HUPPED, &tty->flags));
> +
> /* some functions below drop BTM, so we need this bit */
> set_bit(TTY_HUPPING, &tty->flags);
>
> Test result:
>
> WARNING: at /home/peter/src/kernels/mainline/drivers/tty/tty_io.c:632 __tty_hangup+0x459/0x460()
> Modules linked in: ip6table_filter ip6_tables ebtable_nat <...snip...>
> CPU: 6 PID: 1197 Comm: kworker/6:2 Not tainted 3.10.0-0+rfcomm-xeon #0+rfcomm
> Hardware name: Dell Inc. Precision WorkStation T5400 /0RW203, BIOS A11 04/30/2012
> Workqueue: events do_tty_hangup
> 0000000000000009 ffff8802b16d7d18 ffffffff816b553e ffff8802b16d7d58
> ffffffff810407e0 ffff880254f95c00 ffff880254f95c00 ffff8802bfd92b00
> ffff8802bfd96b00 ffff880254f95e40 0000000000000180 ffff8802b16d7d68
> Call Trace:
> [<ffffffff816b553e>] dump_stack+0x19/0x1b
> [<ffffffff810407e0>] warn_slowpath_common+0x70/0xa0
> [<ffffffff8104082a>] warn_slowpath_null+0x1a/0x20
> [<ffffffff813fb279>] __tty_hangup+0x459/0x460
> [<ffffffff8107409c>] ? finish_task_switch+0xbc/0xe0
> [<ffffffff813fb297>] do_tty_hangup+0x17/0x20
> [<ffffffff8105fd6f>] process_one_work+0x16f/0x450
> [<ffffffff8106007c>] process_scheduled_works+0x2c/0x40
> [<ffffffff8106060a>] worker_thread+0x26a/0x380
> [<ffffffff810603a0>] ? rescuer_thread+0x310/0x310
> [<ffffffff810698a0>] kthread+0xc0/0xd0
> [<ffffffff816b0000>] ? destroy_compound_page+0x65/0x92
> [<ffffffff810697e0>] ? kthread_create_on_node+0x130/0x130
> [<ffffffff816c495c>] ret_from_fork+0x7c/0xb0
> [<ffffffff810697e0>] ? kthread_create_on_node+0x130/0x130
> ---[ end trace 98d9f01536cf411e ]---
> ---
> drivers/tty/tty_io.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index 26bb78c..a9355ce 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -629,6 +629,11 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)
>
> tty_lock(tty);
>
> + if (test_bit(TTY_HUPPED, &tty->flags)) {
> + tty_unlock(tty);
> + return;
> + }
> +
> /* some functions below drop BTM, so we need this bit */
> set_bit(TTY_HUPPING, &tty->flags);

A diff inside the changelog entry of a diff is going to cause havoc :)

I'll go edit this to make it not complain...

thanks,

greg k-h


\
 
 \ /
  Last update: 2013-08-02 06:01    [W:0.070 / U:0.036 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site