[PATCH] vt: refactor console SAK processing
This does several things. - It moves looking up of the current foreground console into process context where we can safely take the semaphore that protects this operation. - It uses the new flavor of work queue processing. - This generates a factor of do_SAK, __do_SAK that runs immediately. - This calls __do_SAK with the console semaphore held ensuring nothing else happens to the console while we process the SAK operation. - With the console SAK processing moved into process context this patch removes the xchg operations that I used to attempt to attomically update struct pid, because of the strange locking used in the SAK processing. With SAK using the normal console semaphore nothing special is needed. Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
0a7b35cb18
commit
8b6312f4dc
@@ -672,7 +672,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
|
||||
vc->vt_mode = tmp;
|
||||
/* the frsig is ignored, so we set it to 0 */
|
||||
vc->vt_mode.frsig = 0;
|
||||
put_pid(xchg(&vc->vt_pid, get_pid(task_pid(current))));
|
||||
put_pid(vc->vt_pid);
|
||||
vc->vt_pid = get_pid(task_pid(current));
|
||||
/* no switch is required -- saw@shade.msu.ru */
|
||||
vc->vt_newvt = -1;
|
||||
release_console_sem();
|
||||
@@ -1063,12 +1064,35 @@ void reset_vc(struct vc_data *vc)
|
||||
vc->vt_mode.relsig = 0;
|
||||
vc->vt_mode.acqsig = 0;
|
||||
vc->vt_mode.frsig = 0;
|
||||
put_pid(xchg(&vc->vt_pid, NULL));
|
||||
put_pid(vc->vt_pid);
|
||||
vc->vt_pid = NULL;
|
||||
vc->vt_newvt = -1;
|
||||
if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */
|
||||
reset_palette(vc);
|
||||
}
|
||||
|
||||
void vc_SAK(struct work_struct *work)
|
||||
{
|
||||
struct vc *vc_con =
|
||||
container_of(work, struct vc, SAK_work);
|
||||
struct vc_data *vc;
|
||||
struct tty_struct *tty;
|
||||
|
||||
acquire_console_sem();
|
||||
vc = vc_con->d;
|
||||
if (vc) {
|
||||
tty = vc->vc_tty;
|
||||
/*
|
||||
* SAK should also work in all raw modes and reset
|
||||
* them properly.
|
||||
*/
|
||||
if (tty)
|
||||
__do_SAK(tty);
|
||||
reset_vc(vc);
|
||||
}
|
||||
release_console_sem();
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs the back end of a vt switch
|
||||
*/
|
||||
|
Reference in New Issue
Block a user