Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp5026473ybl; Tue, 14 Jan 2020 02:12:15 -0800 (PST) X-Google-Smtp-Source: APXvYqyRulnBO82hlbKz/5nfw0qarAeQZkLXCAQMd+/u8W65eufZelJHK3/Ig5Kihv1nbHgczeml X-Received: by 2002:a54:4713:: with SMTP id k19mr16211674oik.113.1578996735278; Tue, 14 Jan 2020 02:12:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578996735; cv=none; d=google.com; s=arc-20160816; b=I+4llwq+7AZgG1t7ht30VqvqXbHl0UVQRKiwAl1rz6eWLFB4+gdLo/esdJxv6T3a/8 PDGDlO0oNx84ffLMGZREwLzZfPNBUeGXPsGIMbjjf4owPd8rd3towwtL4/ouUS7pscuo wS6js2Rol0GMbzRQrMvSA4uApRgk9rNugAG+kFl76rZtnyTDQfupJFObVlvLWEUCmLj2 hv1/7t43TZPeujLqMZOWoy2gV8wzpVgXn3lB7OFo/YjMe0RtfSQQO1vIA0j1WXdSHZjh zPGn7j8zccrgWRGLlkELwb1Gj8K78qACfB/zOekM344tPrEulwLXX7ZBIW+NNOek07R3 Aerg== 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=MQCvqm1ispMWjMa6iCnzKE1DRiX0TV0R10qxhusKnV+SyIUJCeYC74JYNjXx0cszsU 9nbjrVkF/37WjuFHMZJ2ybexJTXoLadfTsTxX3DhuHdWpi0HGlILBzeDL07IlDEU6BzY gUhh4OKP2HEv6BocG4VpM596t3+Xn08zY54dB/YkzwWmm1iVXiz/FZuy8kRr/3oKCyYz J+Jy98CxhQRNbEwdpyKoXIxyZhfXbz5937HiJPia5YvaKhG/yEYVw2/uXlXBhFz24Z50 dX7Z/lERJcK5mKQPjYDWP0HVTLpec3YxF0OlnZMJnbScdnm+Dv8+4XWwL0+WhaPh19Bw sA9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1XetOQKH; 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 r6si8235255otn.216.2020.01.14.02.12.03; Tue, 14 Jan 2020 02:12:15 -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=1XetOQKH; 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 S1731608AbgANKKP (ORCPT + 99 others); Tue, 14 Jan 2020 05:10:15 -0500 Received: from mail.kernel.org ([198.145.29.99]:43816 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729505AbgANKKM (ORCPT ); Tue, 14 Jan 2020 05:10:12 -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 A750724677; Tue, 14 Jan 2020 10:10:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578996612; bh=k18qRjP/nywpIHZ3grDId+QnddItalWgK5eGRgAKNkk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1XetOQKH+mLzTKbJOu+Bxcyim0B8sP2oXXo3PDs36Il2At2z/E3UjrEw/tnxuKdr3 /CSzQdNL10DANZPz3HSO5XblglUTpa258j1kyvMENFJ+o6d9Zr3SWIu1ZgjEoP7jAr LJndQIz07/bhUCMkSSsLe7D05dRLtZykstt8y+ow= 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.14 11/39] can: mscan: mscan_rx_poll(): fix rx path lockup when returning from polling to irq mode Date: Tue, 14 Jan 2020 11:01:45 +0100 Message-Id: <20200114094341.641803479@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200114094336.210038037@linuxfoundation.org> References: <20200114094336.210038037@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)