Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2735715imj; Mon, 11 Feb 2019 07:43:26 -0800 (PST) X-Google-Smtp-Source: AHgI3IZVNisgT+IJt1xvhOUMYP4zGIXQa7KPrdO8QTjY5Yh9Unvdyrm1Tid7xBV+prgIQS6ueAQC X-Received: by 2002:a17:902:442:: with SMTP id 60mr36418848ple.73.1549899806006; Mon, 11 Feb 2019 07:43:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549899805; cv=none; d=google.com; s=arc-20160816; b=nRDWAqI5FqKMHQPYl2K/mMechgYb5lnndlUtjabd6vmLEnpDDQj+EAhcNLCn8dTKq9 K1sTMQUxWIFUxn0oZwjMWkhe8G91/dQcLfed63c9k7gl2pS+x7RkxVWXwOOehEOA/3Mp JU4e6jFEomT47x5RCezeCfoPGidZTiGcY6ecN9mfkP8k6CltQ+J+204nF81wmBLTNG8v opCw1Q/AYYj/ZHGPu6m1HlrGaaNAFacePDBXOdmfnXrrVJcoAhx9Ayojmv3gduJsfPp3 /dRIccqS2BIJGiCHbv2A/6ffqHLCx60I6h4oh/x6mOyiv65VR8qYpZGE6/Jh1t9ifEii S9wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ccu8xk50ET9g2Vv1b8sVAxR5V+wmuvlJ+9cwzgTS1js=; b=r26aBa28l2s3rQMYcoksGcsuPRaBMJHz44IYven2Ng8wFW/xGm+tjgkM3B97MtWW4T n7IglitxvuJMpBvssf26UykzxlV2sD+LsBXx6ovTHcMUU10C3cymqVHudXDAbJLn2Cvx tl6Xr3OtM2o0EbEhiL6eBp0VfH3u1tRCHP6j1oTIkCyff4TL2Vd5wYljFAw51+HND5oZ 6AFS97vSQzPKsLkOhoTY5PEVeMjvD5QFttin/d+xzGmjI8nBJ2Qx4fosIPgm5fKXCJ1I tQBqj9soP/UhUqFHJfv4ih1vyyljVBDNRjSkWg+5pnlPWCcfGSsUXwrOFPcljmA+ZqRh exmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=pTnDGdcX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i12si9136490pgq.466.2019.02.11.07.43.09; Mon, 11 Feb 2019 07:43:25 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=pTnDGdcX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387727AbfBKPmU (ORCPT + 99 others); Mon, 11 Feb 2019 10:42:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:59838 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733282AbfBKOql (ORCPT ); Mon, 11 Feb 2019 09:46:41 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1203A20700; Mon, 11 Feb 2019 14:46:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1549896400; bh=8mlOSWb4ShClfox0s19CCQ4mSz+ovXEUhPLUgxkxV4Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pTnDGdcXD1rlr49rXZdbKB0weAgNVGEcaUvjygGaCEx0PzVh/5gX9XVXnNi8JnWJ5 SggdrMxr7yFnAYgy+6yZS2PfGRpmvOHLYZwjegNIzSP3ex5lGyMj5wVqLYr0OmNmgy QWsU/fV/T5+6/IX6uh/GXDds3KYhRwTdqzTyqjz8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Geert Uytterhoeven , Simon Horman , Sasha Levin Subject: [PATCH 4.19 154/313] serial: sh-sci: Fix locking in sci_submit_rx() Date: Mon, 11 Feb 2019 15:17:14 +0100 Message-Id: <20190211141903.818428347@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190211141852.749630980@linuxfoundation.org> References: <20190211141852.749630980@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit dd1f2250da95e87cb3e612858f94b14f99445a7c ] Some callers of sci_submit_rx() hold the port spinlock, others don't. During fallback to PIO, the driver needs to obtain the port spinlock. If the lock was already held, spinlock recursion is detected, causing a deadlock: BUG: spinlock recursion on CPU#0. Fix this by adding a flag parameter to sci_submit_rx() for the caller to indicate the port spinlock is already held, so spinlock recursion can be avoided. Move the spin_lock_irqsave() up, so all DMA disable steps are protected, which is safe as the recently introduced dmaengine_terminate_async() can be called in atomic context. Signed-off-by: Geert Uytterhoeven Reviewed-by: Simon Horman Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/sh-sci.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index effba6ce0caa..5fdd7944b73b 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -1331,7 +1331,7 @@ static void sci_tx_dma_release(struct sci_port *s) dma_release_channel(chan); } -static void sci_submit_rx(struct sci_port *s) +static void sci_submit_rx(struct sci_port *s, bool port_lock_held) { struct dma_chan *chan = s->chan_rx; struct uart_port *port = &s->port; @@ -1362,16 +1362,18 @@ static void sci_submit_rx(struct sci_port *s) return; fail: + /* Switch to PIO */ + if (!port_lock_held) + spin_lock_irqsave(&port->lock, flags); if (i) dmaengine_terminate_async(chan); for (i = 0; i < 2; i++) s->cookie_rx[i] = -EINVAL; s->active_rx = -EINVAL; - /* Switch to PIO */ - spin_lock_irqsave(&port->lock, flags); s->chan_rx = NULL; sci_start_rx(port); - spin_unlock_irqrestore(&port->lock, flags); + if (!port_lock_held) + spin_unlock_irqrestore(&port->lock, flags); } static void work_fn_tx(struct work_struct *work) @@ -1491,7 +1493,7 @@ static enum hrtimer_restart rx_timer_fn(struct hrtimer *t) } if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) - sci_submit_rx(s); + sci_submit_rx(s, true); /* Direct new serial port interrupts back to CPU */ scr = serial_port_in(port, SCSCR); @@ -1617,7 +1619,7 @@ static void sci_request_dma(struct uart_port *port) s->chan_rx_saved = s->chan_rx = chan; if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) - sci_submit_rx(s); + sci_submit_rx(s, false); } } @@ -1667,7 +1669,7 @@ static irqreturn_t sci_rx_interrupt(int irq, void *ptr) scr |= SCSCR_RDRQE; } else { scr &= ~SCSCR_RIE; - sci_submit_rx(s); + sci_submit_rx(s, false); } serial_port_out(port, SCSCR, scr); /* Clear current interrupt */ -- 2.19.1