Preparation for re-iplementing low-latency port support. Replace queue_work and schedule_work with tty_buffer_queue_work, and calls to flush_work with tty_buffer_flush_work. cancel_work_sync are replaced by tty_buffer_flush_work as well, because kthread workqueues don't have a method of cancellation other than to flush. flush could potentially take longer, but we would already delay if the callback were in progress. Since it's only used from the release / destroy path, the difference should be negligible. Signed-off-by: Steven Walter <stevenrwalter@xxxxxxxxx> --- drivers/tty/n_tty.c | 2 +- drivers/tty/tty_buffer.c | 19 ++++++++++++++++--- drivers/tty/tty_io.c | 2 +- drivers/tty/tty_ldisc.c | 4 ++-- drivers/tty/tty_port.c | 2 +- include/linux/tty.h | 2 ++ 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 47ca0f3..c3869a5 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -214,7 +214,7 @@ static void n_tty_set_room(struct tty_struct *tty) */ WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags), "scheduling buffer work for halted ldisc\n"); - queue_work(system_unbound_wq, &tty->port->buf.work); + tty_buffer_queue_work(tty->port); } } diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 143deb6..ed7b5c8 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -72,7 +72,7 @@ void tty_buffer_unlock_exclusive(struct tty_port *port) atomic_dec(&buf->priority); mutex_unlock(&buf->lock); if (restart) - queue_work(system_unbound_wq, &buf->work); + tty_buffer_queue_work(port); } EXPORT_SYMBOL_GPL(tty_buffer_unlock_exclusive); @@ -364,7 +364,7 @@ void tty_schedule_flip(struct tty_port *port) struct tty_bufhead *buf = &port->buf; buf->tail->commit = buf->tail->used; - schedule_work(&buf->work); + tty_buffer_queue_work(port); } EXPORT_SYMBOL(tty_schedule_flip); @@ -492,7 +492,7 @@ static void flush_to_ldisc(struct work_struct *work) */ void tty_flush_to_ldisc(struct tty_struct *tty) { - flush_work(&tty->port->buf.work); + tty_buffer_flush_work(tty->port); } /** @@ -520,6 +520,19 @@ EXPORT_SYMBOL(tty_flip_buffer_push); * Must be called before the other tty buffer functions are used. */ + +void tty_buffer_queue_work(struct tty_port *port) +{ + struct tty_bufhead *buf = &port->buf; + schedule_work(&buf->work); +} + +void tty_buffer_flush_work(struct tty_port *port) +{ + struct tty_bufhead *buf = &port->buf; + flush_work(&buf->work); +} + void tty_buffer_init(struct tty_port *port) { struct tty_bufhead *buf = &port->buf; diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 0508a1d..c288473 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -1633,7 +1633,7 @@ static void release_tty(struct tty_struct *tty, int idx) tty->port->itty = NULL; if (tty->link) tty->link->port->itty = NULL; - cancel_work_sync(&tty->port->buf.work); + tty_buffer_flush_work(tty->port); if (tty->link) tty_kref_put(tty->link); diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 2d822aa..982f082 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c @@ -584,9 +584,9 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) /* Restart the work queue in case no characters kick it off. Safe if already running */ - schedule_work(&tty->port->buf.work); + tty_buffer_queue_work(tty->port); if (o_tty) - schedule_work(&o_tty->port->buf.work); + tty_buffer_queue_work(o_tty->port); tty_unlock(tty); return retval; diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c index 1b93357..d041323 100644 --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c @@ -131,7 +131,7 @@ EXPORT_SYMBOL(tty_port_free_xmit_buf); */ void tty_port_destroy(struct tty_port *port) { - cancel_work_sync(&port->buf.work); + tty_buffer_flush_work(port); tty_buffer_free_all(port); } EXPORT_SYMBOL(tty_port_destroy); diff --git a/include/linux/tty.h b/include/linux/tty.h index 5171ef8..7bad787 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -446,6 +446,8 @@ extern void tty_flush_to_ldisc(struct tty_struct *tty); extern void tty_buffer_free_all(struct tty_port *port); extern void tty_buffer_flush(struct tty_struct *tty); extern void tty_buffer_init(struct tty_port *port); +extern void tty_buffer_queue_work(struct tty_port *port); +extern void tty_buffer_flush_work(struct tty_port *port); extern speed_t tty_termios_baud_rate(struct ktermios *termios); extern speed_t tty_termios_input_baud_rate(struct ktermios *termios); extern void tty_termios_encode_baud_rate(struct ktermios *termios, -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html