tty: Fix high cpu load if tty is unreleaseable
Kernel oops can cause the tty to be unreleaseable (for example, if n_tty_read() crashes while on the read_wait queue). This will cause tty_release() to endlessly loop without sleeping. Use a killable sleep timeout which grows by 2n+1 jiffies over the interval [0, 120 secs.) and then jumps to forever (but still killable). NB: killable just allows for the task to be rewoken manually, not to be terminated. Cc: <stable@vger.kernel.org> # since before 2.6.32 Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
547039ec50
commit
37b1645788
|
@ -1709,6 +1709,7 @@ int tty_release(struct inode *inode, struct file *filp)
|
|||
int pty_master, tty_closing, o_tty_closing, do_sleep;
|
||||
int idx;
|
||||
char buf[64];
|
||||
long timeout = 0;
|
||||
|
||||
if (tty_paranoia_check(tty, inode, __func__))
|
||||
return 0;
|
||||
|
@ -1793,7 +1794,11 @@ int tty_release(struct inode *inode, struct file *filp)
|
|||
__func__, tty_name(tty, buf));
|
||||
tty_unlock_pair(tty, o_tty);
|
||||
mutex_unlock(&tty_mutex);
|
||||
schedule();
|
||||
schedule_timeout_killable(timeout);
|
||||
if (timeout < 120 * HZ)
|
||||
timeout = 2 * timeout + 1;
|
||||
else
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue