From: Peter Hurley <peter@hurleysoftware.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 4/8] serial: core: Take port mutex for send_xchar() tty method
Date: Sun, 10 Jan 2016 21:23:54 -0800 [thread overview]
Message-ID: <56933C6A.2040707@hurleysoftware.com> (raw)
In-Reply-To: <1449966992-4033-5-git-send-email-peter@hurleysoftware.com>
On 12/12/2015 04:36 PM, Peter Hurley wrote:
> Prepare for separate methods of preventing unsafe uart port access
> when sending xchar; claim port mutex for the tty ops method (which
> might sleep) and rcu for the throttle/unthrottle uses.
>
> The implied limitation is that uart drivers which support
> AUTOXOFF flow control cannot define a send_xchar() method that sleeps.
This patch doesn't do what I want, so I need to rework this solution.
Regards,
Peter Hurley
> Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
> ---
> drivers/tty/serial/serial_core.c | 30 +++++++++++++++++++-----------
> 1 file changed, 19 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
> index 4430518..806eba81 100644
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -610,23 +610,31 @@ static void uart_flush_buffer(struct tty_struct *tty)
> * This function is used to send a high-priority XON/XOFF character to
> * the device
> */
> -static void uart_send_xchar(struct tty_struct *tty, char ch)
> +static void __uart_send_xchar(struct uart_port *uport, char ch)
> {
> - struct uart_state *state = tty->driver_data;
> - struct uart_port *port = state->uart_port;
> unsigned long flags;
>
> - if (port->ops->send_xchar)
> - port->ops->send_xchar(port, ch);
> + if (uport->ops->send_xchar)
> + uport->ops->send_xchar(uport, ch);
> else {
> - spin_lock_irqsave(&port->lock, flags);
> - port->x_char = ch;
> + spin_lock_irqsave(&uport->lock, flags);
> + uport->x_char = ch;
> if (ch)
> - port->ops->start_tx(port);
> - spin_unlock_irqrestore(&port->lock, flags);
> + uport->ops->start_tx(port);
> + spin_unlock_irqrestore(&uport->lock, flags);
> }
> }
>
> +static void uart_send_xchar(struct tty_struct *tty, char ch)
> +{
> + struct uart_state *state = tty->driver_data;
> + struct uart_port *uport = state->uart_port;
> +
> + mutex_lock(&state->port.mutex);
> + __uart_send_xchar(uport, ch);
> + mutex_unlock(&state->port.mutex);
> +}
> +
> static void uart_throttle(struct tty_struct *tty)
> {
> struct uart_state *state = tty->driver_data;
> @@ -644,7 +652,7 @@ static void uart_throttle(struct tty_struct *tty)
> }
>
> if (mask & UPSTAT_AUTOXOFF)
> - uart_send_xchar(tty, STOP_CHAR(tty));
> + __uart_send_xchar(port, STOP_CHAR(tty));
>
> if (mask & UPSTAT_AUTORTS)
> uart_clear_mctrl(port, TIOCM_RTS);
> @@ -667,7 +675,7 @@ static void uart_unthrottle(struct tty_struct *tty)
> }
>
> if (mask & UPSTAT_AUTOXOFF)
> - uart_send_xchar(tty, START_CHAR(tty));
> + __uart_send_xchar(port, START_CHAR(tty));
>
> if (mask & UPSTAT_AUTORTS)
> uart_set_mctrl(port, TIOCM_RTS);
>
next prev parent reply other threads:[~2016-01-11 5:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-13 0:36 [PATCH 0/8] Fix unsafe uart port access Peter Hurley
2015-12-13 0:36 ` [PATCH 1/8] serial: core: Fold __uart_put_char() into caller Peter Hurley
2015-12-13 0:36 ` [PATCH 2/8] serial: core: Fold do_uart_get_info() " Peter Hurley
2015-12-13 0:36 ` [PATCH 3/8] serial: core: Use tty->index for port # in debug messages Peter Hurley
2015-12-13 0:36 ` [PATCH 4/8] serial: core: Take port mutex for send_xchar() tty method Peter Hurley
2016-01-11 5:23 ` Peter Hurley [this message]
2015-12-13 0:36 ` [PATCH 5/8] serial: core: Expand port mutex section in uart_poll_init() Peter Hurley
2015-12-13 0:36 ` [PATCH 6/8] serial: core: Prevent unsafe uart port access, part 1 Peter Hurley
2015-12-13 0:36 ` [PATCH 7/8] serial: core: Prevent unsafe uart port access, part 2 Peter Hurley
2015-12-13 0:36 ` [PATCH 8/8] serial: core: Prevent unsafe uart port access, part 3 Peter Hurley
2016-01-11 5:29 ` [PATCH 0/8] Fix unsafe uart port access Peter Hurley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56933C6A.2040707@hurleysoftware.com \
--to=peter@hurleysoftware.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.