Commit 4b19449d authored by Davide Libenzi's avatar Davide Libenzi Committed by Linus Torvalds

epoll keyed wakeups: make tty use keyed wakeups

Introduce keyed event wakeups inside the TTY code.
Signed-off-by: default avatarDavide Libenzi <davidel@xmailserver.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: David Miller <davem@davemloft.net>
Cc: William Lee Irwin III <wli@movementarian.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 39510888
...@@ -464,7 +464,7 @@ void tty_wakeup(struct tty_struct *tty) ...@@ -464,7 +464,7 @@ void tty_wakeup(struct tty_struct *tty)
tty_ldisc_deref(ld); tty_ldisc_deref(ld);
} }
} }
wake_up_interruptible(&tty->write_wait); wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
} }
EXPORT_SYMBOL_GPL(tty_wakeup); EXPORT_SYMBOL_GPL(tty_wakeup);
...@@ -587,8 +587,8 @@ static void do_tty_hangup(struct work_struct *work) ...@@ -587,8 +587,8 @@ static void do_tty_hangup(struct work_struct *work)
* FIXME: Once we trust the LDISC code better we can wait here for * FIXME: Once we trust the LDISC code better we can wait here for
* ldisc completion and fix the driver call race * ldisc completion and fix the driver call race
*/ */
wake_up_interruptible(&tty->write_wait); wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
wake_up_interruptible(&tty->read_wait); wake_up_interruptible_poll(&tty->read_wait, POLLIN);
/* /*
* Shutdown the current line discipline, and reset it to * Shutdown the current line discipline, and reset it to
* N_TTY. * N_TTY.
...@@ -879,7 +879,7 @@ void stop_tty(struct tty_struct *tty) ...@@ -879,7 +879,7 @@ void stop_tty(struct tty_struct *tty)
if (tty->link && tty->link->packet) { if (tty->link && tty->link->packet) {
tty->ctrl_status &= ~TIOCPKT_START; tty->ctrl_status &= ~TIOCPKT_START;
tty->ctrl_status |= TIOCPKT_STOP; tty->ctrl_status |= TIOCPKT_STOP;
wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
} }
spin_unlock_irqrestore(&tty->ctrl_lock, flags); spin_unlock_irqrestore(&tty->ctrl_lock, flags);
if (tty->ops->stop) if (tty->ops->stop)
...@@ -913,7 +913,7 @@ void start_tty(struct tty_struct *tty) ...@@ -913,7 +913,7 @@ void start_tty(struct tty_struct *tty)
if (tty->link && tty->link->packet) { if (tty->link && tty->link->packet) {
tty->ctrl_status &= ~TIOCPKT_STOP; tty->ctrl_status &= ~TIOCPKT_STOP;
tty->ctrl_status |= TIOCPKT_START; tty->ctrl_status |= TIOCPKT_START;
wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
} }
spin_unlock_irqrestore(&tty->ctrl_lock, flags); spin_unlock_irqrestore(&tty->ctrl_lock, flags);
if (tty->ops->start) if (tty->ops->start)
...@@ -970,7 +970,7 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count, ...@@ -970,7 +970,7 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
void tty_write_unlock(struct tty_struct *tty) void tty_write_unlock(struct tty_struct *tty)
{ {
mutex_unlock(&tty->atomic_write_lock); mutex_unlock(&tty->atomic_write_lock);
wake_up_interruptible(&tty->write_wait); wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
} }
int tty_write_lock(struct tty_struct *tty, int ndelay) int tty_write_lock(struct tty_struct *tty, int ndelay)
...@@ -1623,21 +1623,21 @@ void tty_release_dev(struct file *filp) ...@@ -1623,21 +1623,21 @@ void tty_release_dev(struct file *filp)
if (tty_closing) { if (tty_closing) {
if (waitqueue_active(&tty->read_wait)) { if (waitqueue_active(&tty->read_wait)) {
wake_up(&tty->read_wait); wake_up_poll(&tty->read_wait, POLLIN);
do_sleep++; do_sleep++;
} }
if (waitqueue_active(&tty->write_wait)) { if (waitqueue_active(&tty->write_wait)) {
wake_up(&tty->write_wait); wake_up_poll(&tty->write_wait, POLLOUT);
do_sleep++; do_sleep++;
} }
} }
if (o_tty_closing) { if (o_tty_closing) {
if (waitqueue_active(&o_tty->read_wait)) { if (waitqueue_active(&o_tty->read_wait)) {
wake_up(&o_tty->read_wait); wake_up_poll(&o_tty->read_wait, POLLIN);
do_sleep++; do_sleep++;
} }
if (waitqueue_active(&o_tty->write_wait)) { if (waitqueue_active(&o_tty->write_wait)) {
wake_up(&o_tty->write_wait); wake_up_poll(&o_tty->write_wait, POLLOUT);
do_sleep++; do_sleep++;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment