From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753536AbcAKFX6 (ORCPT ); Mon, 11 Jan 2016 00:23:58 -0500 Received: from mail-pa0-f53.google.com ([209.85.220.53]:33251 "EHLO mail-pa0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752006AbcAKFX4 (ORCPT ); Mon, 11 Jan 2016 00:23:56 -0500 Subject: Re: [PATCH 4/8] serial: core: Take port mutex for send_xchar() tty method To: Greg Kroah-Hartman References: <1449966992-4033-1-git-send-email-peter@hurleysoftware.com> <1449966992-4033-5-git-send-email-peter@hurleysoftware.com> Cc: Jiri Slaby , linux-kernel@vger.kernel.org From: Peter Hurley Message-ID: <56933C6A.2040707@hurleysoftware.com> Date: Sun, 10 Jan 2016 21:23:54 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <1449966992-4033-5-git-send-email-peter@hurleysoftware.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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); >