Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp5033660ybl; Tue, 14 Jan 2020 02:20:13 -0800 (PST) X-Google-Smtp-Source: APXvYqzGDdLlj0KGfcHscqEU6xIt5pAmVgTxztlpOdjB83NkMTxIeVeuvCbzE71A02BBXz0ZIJpv X-Received: by 2002:aca:b1d5:: with SMTP id a204mr15731928oif.82.1578997213068; Tue, 14 Jan 2020 02:20:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578997213; cv=none; d=google.com; s=arc-20160816; b=xDquyjp3i0kfYZrJXOl967oQGE99VjQQxv2Y1Gjzrmta+3UMUhN9mDUAxpApXO0yJW nwlGu12ATTGZRBiaoW1GtHrOw9pXXKDwRQXv9kk5auGbZIalY6Us6lWRshjl+XUH/Wti wqRHpKyMRiL+xdZ/j+n42Y5Gr/hBofVhroIvAcgoLnRuoviaDAsfPj45IWDbib78PSDv DYojZkMBk07YTygi1BQnrVyMXoIKCVg3CR7ks0kucrPNi+oB4wC6+apK9c/9QNBymhW+ fmjyAWVihGdW6C94h8lqH0j6MoDlGM3Zv6JKgCEvVQ2XedObwY43Fn28Zd0MgFVyvgGa 0xXA== 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=O1hjg67DYEzyfg8nExAdy/gT1L2cpm8/4sV3LFaN/vw=; b=XrXSkYuFiPCOImw7A5XxjsLmeNztsjH47uGR+85rx6A6CJZAxJUaMKeNdhH/09CqHY +bEnbp2np3hawa/VC0WCXmolBuFx9X+vBC8QRYvxRN751/wwd5lEqvERHHeloPzBqHeo FYWhVcO11Y8GQJ0gNQKAiKeBni9KU649RIvMZqRxmIsHwzNkHWj0xnps4sl7rOY3jmsm KZwuadhxAoMJrJfZAq9/xR4r7BnKwg+TnAvgDjXbvx8cQVQ+L1C/Bf47xRnKeMnQRz5L k7D0hNp+JxUMgbJcTHhdkksf3vmzxc5zaWACgowySEOozk8GKZvQ8pJ+UdTX6euKy/Xc ooIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=l0ixdT7H; 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 i8si8007201otp.254.2020.01.14.02.20.02; Tue, 14 Jan 2020 02:20:13 -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=l0ixdT7H; 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 S1729615AbgANKHc (ORCPT + 99 others); Tue, 14 Jan 2020 05:07:32 -0500 Received: from mail.kernel.org ([198.145.29.99]:37854 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729499AbgANKHb (ORCPT ); Tue, 14 Jan 2020 05:07:31 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.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 A17BC20678; Tue, 14 Jan 2020 10:07:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578996450; bh=k18qRjP/nywpIHZ3grDId+QnddItalWgK5eGRgAKNkk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l0ixdT7HT4ko6ZUnq1qxLhLWR3IddHdJ7h2EvRe38FRNmyE5L8gCFv+6nLYN6zgwH dAW7ig350Yu8zjX1IWoDh0wxiFInm3fFTLj+d+/rxkNQLApIcaFXlE6Slmu6Ijn7B4 YsLJy9M68MxFRy/RReorky/OCXKSjyHTxaNcGOoQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Florian Faber , Marc Kleine-Budde Subject: [PATCH 4.19 21/46] can: mscan: mscan_rx_poll(): fix rx path lockup when returning from polling to irq mode Date: Tue, 14 Jan 2020 11:01:38 +0100 Message-Id: <20200114094344.766503208@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200114094339.608068818@linuxfoundation.org> References: <20200114094339.608068818@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Florian Faber commit 2d77bd61a2927be8f4e00d9478fe6996c47e8d45 upstream. Under load, the RX side of the mscan driver can get stuck while TX still works. Restarting the interface locks up the system. This behaviour could be reproduced reliably on a MPC5121e based system. The patch fixes the return value of the NAPI polling function (should be the number of processed packets, not constant 1) and the condition under which IRQs are enabled again after polling is finished. With this patch, no more lockups were observed over a test period of ten days. Fixes: afa17a500a36 ("net/can: add driver for mscan family & mpc52xx_mscan") Signed-off-by: Florian Faber Cc: linux-stable Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/mscan/mscan.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) --- a/drivers/net/can/mscan/mscan.c +++ b/drivers/net/can/mscan/mscan.c @@ -392,13 +392,12 @@ static int mscan_rx_poll(struct napi_str struct net_device *dev = napi->dev; struct mscan_regs __iomem *regs = priv->reg_base; struct net_device_stats *stats = &dev->stats; - int npackets = 0; - int ret = 1; + int work_done = 0; struct sk_buff *skb; struct can_frame *frame; u8 canrflg; - while (npackets < quota) { + while (work_done < quota) { canrflg = in_8(®s->canrflg); if (!(canrflg & (MSCAN_RXF | MSCAN_ERR_IF))) break; @@ -419,18 +418,18 @@ static int mscan_rx_poll(struct napi_str stats->rx_packets++; stats->rx_bytes += frame->can_dlc; - npackets++; + work_done++; netif_receive_skb(skb); } - if (!(in_8(®s->canrflg) & (MSCAN_RXF | MSCAN_ERR_IF))) { - napi_complete(&priv->napi); - clear_bit(F_RX_PROGRESS, &priv->flags); - if (priv->can.state < CAN_STATE_BUS_OFF) - out_8(®s->canrier, priv->shadow_canrier); - ret = 0; + if (work_done < quota) { + if (likely(napi_complete_done(&priv->napi, work_done))) { + clear_bit(F_RX_PROGRESS, &priv->flags); + if (priv->can.state < CAN_STATE_BUS_OFF) + out_8(®s->canrier, priv->shadow_canrier); + } } - return ret; + return work_done; } static irqreturn_t mscan_isr(int irq, void *dev_id)