lkml.org 
[lkml]   [2007]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] Software Suspend: Fix suspend when console is in VT_AUTO/KD_GRAPHICS mode
    From
    Date
    Hi Pavel,

    When the console is in VT_AUTO/KD_GRAPHICS mode, switching to the
    SUSPEND_CONSOLE fails, resulting in vt_waitactive() waiting indefinately
    or until the task is interrupted. The following patch tests if a
    console switch can occur in set_console() and returns early if a console
    switch is not possible.

    Signed-off-by: Andrew Johnson <ajohnson@intrinsyc.com>

    diff -rup linux-2.6.20.1/drivers/char/vt.c linux/drivers/char/vt.c
    --- linux-2.6.20.1/drivers/char/vt.c 2007-02-19 22:34:32.000000000 -0800
    +++ linux/drivers/char/vt.c 2007-03-08 14:15:41.000000000 -0800
    @@ -2188,10 +2188,20 @@ static void console_callback(struct work
    release_console_sem();
    }

    -void set_console(int nr)
    +extern char vt_dont_switch;
    +
    +int set_console(int nr)
    {
    + struct vc_data *vc = vc_cons[fg_console].d;
    +
    + if(!vc_cons_allocated(nr) || vt_dont_switch || vc->vc_mode ==
    KD_GRAPHICS) {
    + return -EINVAL;
    + }
    +
    want_console = nr;
    schedule_console_callback();
    +
    + return 0;
    }

    struct tty_driver *console_driver;
    diff -rup linux-2.6.20.1/drivers/char/vt_ioctl.c
    linux/drivers/char/vt_ioctl.c
    --- linux-2.6.20.1/drivers/char/vt_ioctl.c 2007-02-19 22:34:32.000000000
    -0800
    +++ linux/drivers/char/vt_ioctl.c 2007-03-08 14:15:41.000000000 -0800
    @@ -34,7 +34,7 @@
    #include <linux/kbd_diacr.h>
    #include <linux/selection.h>

    -static char vt_dont_switch;
    +char vt_dont_switch;
    extern struct tty_driver *console_driver;

    #define VT_IS_IN_USE(i) (console_driver->ttys[i] &&
    console_driver->ttys[i]->count)
    diff -rup linux-2.6.20.1/include/linux/kbd_kern.h
    linux/include/linux/kbd_kern.h
    --- linux-2.6.20.1/include/linux/kbd_kern.h 2007-02-19
    22:34:32.000000000 -0800
    +++ linux/include/linux/kbd_kern.h 2007-03-08 14:15:41.000000000 -0800
    @@ -75,7 +75,7 @@ extern int do_poke_blanked_console;

    extern void (*kbd_ledfunc)(unsigned int led);

    -extern void set_console(int nr);
    +extern int set_console(int nr);
    extern void schedule_console_callback(void);

    static inline void set_leds(void)
    diff -rup linux-2.6.20.1/kernel/power/console.c
    linux/kernel/power/console.c
    --- linux-2.6.20.1/kernel/power/console.c 2007-02-19 22:34:32.000000000
    -0800
    +++ linux/kernel/power/console.c 2007-03-08 14:15:41.000000000 -0800
    @@ -27,7 +27,11 @@ int pm_prepare_console(void)
    return 1;
    }

    - set_console(SUSPEND_CONSOLE);
    + if (set_console(SUSPEND_CONSOLE)) {
    + /* Unable to change to the new console */
    + release_console_sem();
    + return 1;
    + }
    release_console_sem();

    if (vt_waitactive(SUSPEND_CONSOLE)) {

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-03-09 00:13    [W:0.023 / U:0.588 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site