lkml.org 
[lkml]   [2013]   [Jul]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    From
    Subject[PATCH] tty: Only hangup once
    Date
    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);

    --
    1.8.1.2


    \
     
     \ /
      Last update: 2013-07-31 20:21    [W:2.214 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site