Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp2331258ybz; Thu, 23 Apr 2020 16:10:21 -0700 (PDT) X-Google-Smtp-Source: APiQypLOx9sqD4wQ22k7lGOn4SjyNAlNFLFgEvtc9rkpK5h6YWbQK2VYlP5fdjsyJRLEtS4pmLWu X-Received: by 2002:a05:6402:552:: with SMTP id i18mr4785308edx.378.1587683421316; Thu, 23 Apr 2020 16:10:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587683421; cv=none; d=google.com; s=arc-20160816; b=NA09uoT3Ax7rn8MSXXBVwHq6wANGKfuIJocoTux/H7hBxgNiGoi70uxLITqfCjm3cB 3/QCLyn0Le2q+y64BOax097pVrZUxZ1+CGT/8LYyTR/g8R+OHIoFrrSbohEFKO8/ZI89 1nh6gplHa2DwgRFkYEWRGXDaGi7Th1tVKqezhin6tGrcC5HhpQWLBAASY0r3wxrkUGOu fZaZBmKp34hvRrQGM3l5UvTe+D8MZ3eUfX5Lt1/mNgzb0F+UV//Bk3MsfHoMYIs+vUc3 uFIAB+WDN1vm0UXQblKnsTA3T2uXlsaAT0Uh4FLSvie/BPOnIK42Yop6N5rvJ/xPQyJf sm5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=aTgCNDUjtOfeR11pBdxonp7L/re6RqdzGaEfewrNvkg=; b=p19ojnGwA/L/hoTmYZ0xye3Kz12B7R8ytadjbmpTEBmOU15u+lZfGU5g4ldvnAKbyR FnorS9XRJfrVybkOqWc1CjuB/cjFxx8jDeOZJ3f76pBQ5BZg06LPmmnarE2jaKMhMjgC jnDWUOHHsCrMKAkUuxuJLwQeyex2zAFJcZGwrxZgwf2yhJXGZwb/rFOuJx+M3QHzTFrs yV4vLIzVX6rX3muAQxXkNZxotpxPXqFIWtsOONZh6eWRWNGlyIwzV3QfxZKctQkJQ9QS 1ExxeP7u/w8m5n+0BemniXCOhZioJ2k+XugpD+KX1XNh8im6jqh+5flvFCkB3uGmVMPO JMRg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u25si2015457edy.422.2020.04.23.16.09.58; Thu, 23 Apr 2020 16:10:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728836AbgDWXHW (ORCPT + 99 others); Thu, 23 Apr 2020 19:07:22 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:49754 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728430AbgDWXGs (ORCPT ); Thu, 23 Apr 2020 19:06:48 -0400 Received: from [192.168.4.242] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1jRkvS-0004h9-Ln; Fri, 24 Apr 2020 00:06:34 +0100 Received: from ben by deadeye with local (Exim 4.93) (envelope-from ) id 1jRkvS-00E6r5-C9; Fri, 24 Apr 2020 00:06:34 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, Denis Kirjanov , "Marc Kleine-Budde" , "Florian Faber" Date: Fri, 24 Apr 2020 00:06:17 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 150/245] can: mscan: mscan_rx_poll(): fix rx path lockup when returning from polling to irq mode In-Reply-To: X-SA-Exim-Connect-IP: 192.168.4.242 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.83-rc1 review patch. If anyone has any objections, please let me know. ------------------ 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 Signed-off-by: Marc Kleine-Budde Signed-off-by: Ben Hutchings --- 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 @@ -412,13 +412,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; @@ -439,18 +438,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)