提交 c89ff239 编写于 作者: L Linus Torvalds

Merge tag 'tty-3.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull a TTY fix from Greg Kroah-Hartman:
 "This is a deadlock bugfix that was easy to hit, and that the vt layer
  lock rework got wrong, so it reverts the logic back to the way it was
  in 3.3 and earlier kernels to prevent problems."

* tag 'tty-3.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  vt: Fix deadlock on scroll-lock
...@@ -1085,15 +1085,21 @@ void vt_set_led_state(int console, int leds) ...@@ -1085,15 +1085,21 @@ void vt_set_led_state(int console, int leds)
* *
* Handle console start. This is a wrapper for the VT layer * Handle console start. This is a wrapper for the VT layer
* so that we can keep kbd knowledge internal * so that we can keep kbd knowledge internal
*
* FIXME: We eventually need to hold the kbd lock here to protect
* the LED updating. We can't do it yet because fn_hold calls stop_tty
* and start_tty under the kbd_event_lock, while normal tty paths
* don't hold the lock. We probably need to split out an LED lock
* but not during an -rc release!
*/ */
void vt_kbd_con_start(int console) void vt_kbd_con_start(int console)
{ {
struct kbd_struct * kbd = kbd_table + console; struct kbd_struct * kbd = kbd_table + console;
unsigned long flags; /* unsigned long flags; */
spin_lock_irqsave(&kbd_event_lock, flags); /* spin_lock_irqsave(&kbd_event_lock, flags); */
clr_vc_kbd_led(kbd, VC_SCROLLOCK); clr_vc_kbd_led(kbd, VC_SCROLLOCK);
set_leds(); set_leds();
spin_unlock_irqrestore(&kbd_event_lock, flags); /* spin_unlock_irqrestore(&kbd_event_lock, flags); */
} }
/** /**
...@@ -1102,22 +1108,28 @@ void vt_kbd_con_start(int console) ...@@ -1102,22 +1108,28 @@ void vt_kbd_con_start(int console)
* *
* Handle console stop. This is a wrapper for the VT layer * Handle console stop. This is a wrapper for the VT layer
* so that we can keep kbd knowledge internal * so that we can keep kbd knowledge internal
*
* FIXME: We eventually need to hold the kbd lock here to protect
* the LED updating. We can't do it yet because fn_hold calls stop_tty
* and start_tty under the kbd_event_lock, while normal tty paths
* don't hold the lock. We probably need to split out an LED lock
* but not during an -rc release!
*/ */
void vt_kbd_con_stop(int console) void vt_kbd_con_stop(int console)
{ {
struct kbd_struct * kbd = kbd_table + console; struct kbd_struct * kbd = kbd_table + console;
unsigned long flags; /* unsigned long flags; */
spin_lock_irqsave(&kbd_event_lock, flags); /* spin_lock_irqsave(&kbd_event_lock, flags); */
set_vc_kbd_led(kbd, VC_SCROLLOCK); set_vc_kbd_led(kbd, VC_SCROLLOCK);
set_leds(); set_leds();
spin_unlock_irqrestore(&kbd_event_lock, flags); /* spin_unlock_irqrestore(&kbd_event_lock, flags); */
} }
/* /*
* This is the tasklet that updates LED state on all keyboards * This is the tasklet that updates LED state on all keyboards
* attached to the box. The reason we use tasklet is that we * attached to the box. The reason we use tasklet is that we
* need to handle the scenario when keyboard handler is not * need to handle the scenario when keyboard handler is not
* registered yet but we already getting updates form VT to * registered yet but we already getting updates from the VT to
* update led state. * update led state.
*/ */
static void kbd_bh(unsigned long dummy) static void kbd_bh(unsigned long dummy)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册