[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
@@ -3324,10 +3324,8 @@ int tty_ioctl(struct inode * inode, struct file * file,
|
||||
* Nasty bug: do_SAK is being called in interrupt context. This can
|
||||
* deadlock. We punt it up to process context. AKPM - 16Mar2001
|
||||
*/
|
||||
static void __do_SAK(struct work_struct *work)
|
||||
void __do_SAK(struct tty_struct *tty)
|
||||
{
|
||||
struct tty_struct *tty =
|
||||
container_of(work, struct tty_struct, SAK_work);
|
||||
#ifdef TTY_SOFT_SAK
|
||||
tty_hangup(tty);
|
||||
#else
|
||||
@@ -3394,6 +3392,13 @@ static void __do_SAK(struct work_struct *work)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void do_SAK_work(struct work_struct *work)
|
||||
{
|
||||
struct tty_struct *tty =
|
||||
container_of(work, struct tty_struct, SAK_work);
|
||||
__do_SAK(tty);
|
||||
}
|
||||
|
||||
/*
|
||||
* The tq handling here is a little racy - tty->SAK_work may already be queued.
|
||||
* Fortunately we don't need to worry, because if ->SAK_work is already queued,
|
||||
@@ -3404,7 +3409,7 @@ void do_SAK(struct tty_struct *tty)
|
||||
{
|
||||
if (!tty)
|
||||
return;
|
||||
PREPARE_WORK(&tty->SAK_work, __do_SAK);
|
||||
PREPARE_WORK(&tty->SAK_work, do_SAK_work);
|
||||
schedule_work(&tty->SAK_work);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user