From patchwork Mon Aug 7 13:47:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 798643 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=monstr-eu.20150623.gappssmtp.com header.i=@monstr-eu.20150623.gappssmtp.com header.b="0b7IkL7b"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xQzQB5p5Xz9s0Z for ; Mon, 7 Aug 2017 23:48:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751891AbdHGNsB (ORCPT ); Mon, 7 Aug 2017 09:48:01 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:34037 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751364AbdHGNr7 (ORCPT ); Mon, 7 Aug 2017 09:47:59 -0400 Received: by mail-wr0-f195.google.com with SMTP id o33so389373wrb.1 for ; Mon, 07 Aug 2017 06:47:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monstr-eu.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=WMkpt/XO1AJRsrxOmjRkdQmcp5u7ILcNdLMejlGVfYg=; b=0b7IkL7bMDmUzFqlNPvNaj90wC9VJEucSgIxvLGA8QGb2UdOkDj6nbf3vkKgXjZ2+F dNSdNZpMMyteyXUbLnTFz9yE57ubiP32tuYm+TYeai5nFAJyWpGwWZMzTCU5st+feyGU B17YJ8klLzfKusig7waZf3vP8fZZErt2M496SnWYDbrJwrohYiVWkiezD9nso0ZiQ4J5 Qh7x1n9jY+Mi/9kau5klSHUqTlH8huYDlQQgfhNIMDhQJIf8Qb/8Ao+fHPaTuWdHTuly cGEB+i4jjqnKIzL0v0Z14aFYZADUMsloOGsKmDVL7LF8iT9m7koNPNg9Ag4S8oTmYyxC 5uZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=WMkpt/XO1AJRsrxOmjRkdQmcp5u7ILcNdLMejlGVfYg=; b=OZ4KWhcakt4DjsENGWwMhVXQEcw5Cr/N+7NYWLc251F9KBzOz8IlrcsDWoHNBm4xWn +Hticjf6KbLj8sR0zNq2+yR1v53p5MdAygG9zAENRntjTmkW7S44wHUr9iq5xsm+YU7U dN3z6TRRiOrjgKrr6UY1emeDG2GmaN26cjgNY4NwkfydVKWTN7WKbnUq6Slm7hMmTCgR bwQaYYirBhI037NysAjEJZJc5fQt2LvqpIAS3NCEz9F7dPAggiBAPMWoMCU3x6GVJ1yj 6jTd4433ANQXxWH92148dEBVo5o/d97vI+symbhyMcyk9eAiMOpWovktf/rKJfvg9doK OjbA== X-Gm-Message-State: AHYfb5ib3F1nK+LH2f5w15s3F6M87k2CUzro0+J2AJHcfvD1mmlBM/nf aaYfPIZTXiy102sE X-Received: by 10.223.139.147 with SMTP id o19mr420129wra.207.1502113678615; Mon, 07 Aug 2017 06:47:58 -0700 (PDT) Received: from localhost (nat-35.starnet.cz. [178.255.168.35]) by smtp.gmail.com with ESMTPSA id 16sm15097990wrx.26.2017.08.07.06.47.57 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 07 Aug 2017 06:47:58 -0700 (PDT) From: Michal Simek To: linux-kernel@vger.kernel.org, monstr@monstr.eu Cc: Matthias Auchmann , =?UTF-8?q?S=C3=B6ren=20Brinkmann?= , netdev@vger.kernel.org, Marc Kleine-Budde , linux-can@vger.kernel.org, Wolfgang Grandegger , linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/2] can: xilinx: Fix ksoftirq CPU monopolization Date: Mon, 7 Aug 2017 15:47:56 +0200 Message-Id: <21850c76207942f5ae5c225f2627fb068d5234d0.1502113674.git.michal.simek@xilinx.com> X-Mailer: git-send-email 1.9.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Matthias Auchmann When using both the RXOK and the RXNEMP interrupt, when there were more than one receive messages in the FIFO, ksoftirqd started to go crazy and monopolize one CPU. The reason being is that RXOK just fires once even if there are multiple frames sitting in the RX FIFO, so the code didn't reflect that properly. Changed that to only use the RXNEMP interrupt and thereby got rid of the bug. Signed-off-by: Matthias Auchmann Acked-by: Kedareswara rao Appana Signed-off-by: Michal Simek --- drivers/net/can/xilinx_can.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c index 89aec07c225f..05ea2820d27b 100644 --- a/drivers/net/can/xilinx_can.c +++ b/drivers/net/can/xilinx_can.c @@ -101,7 +101,7 @@ enum xcan_reg { #define XCAN_INTR_ALL (XCAN_IXR_TXOK_MASK | XCAN_IXR_BSOFF_MASK |\ XCAN_IXR_WKUP_MASK | XCAN_IXR_SLP_MASK | \ XCAN_IXR_RXNEMP_MASK | XCAN_IXR_ERROR_MASK | \ - XCAN_IXR_ARBLST_MASK | XCAN_IXR_RXOK_MASK) + XCAN_IXR_ARBLST_MASK) /* CAN register bit shift - XCAN___SHIFT */ #define XCAN_BTR_SJW_SHIFT 7 /* Synchronous jump width */ @@ -709,15 +709,7 @@ static int xcan_rx_poll(struct napi_struct *napi, int quota) isr = priv->read_reg(priv, XCAN_ISR_OFFSET); while ((isr & XCAN_IXR_RXNEMP_MASK) && (work_done < quota)) { - if (isr & XCAN_IXR_RXOK_MASK) { - priv->write_reg(priv, XCAN_ICR_OFFSET, - XCAN_IXR_RXOK_MASK); - work_done += xcan_rx(ndev); - } else { - priv->write_reg(priv, XCAN_ICR_OFFSET, - XCAN_IXR_RXNEMP_MASK); - break; - } + work_done += xcan_rx(ndev); priv->write_reg(priv, XCAN_ICR_OFFSET, XCAN_IXR_RXNEMP_MASK); isr = priv->read_reg(priv, XCAN_ISR_OFFSET); } @@ -728,7 +720,7 @@ static int xcan_rx_poll(struct napi_struct *napi, int quota) if (work_done < quota) { napi_complete_done(napi, work_done); ier = priv->read_reg(priv, XCAN_IER_OFFSET); - ier |= (XCAN_IXR_RXOK_MASK | XCAN_IXR_RXNEMP_MASK); + ier |= XCAN_IXR_RXNEMP_MASK; priv->write_reg(priv, XCAN_IER_OFFSET, ier); } return work_done; @@ -800,9 +792,9 @@ static irqreturn_t xcan_interrupt(int irq, void *dev_id) } /* Check for the type of receive interrupt and Processing it */ - if (isr & (XCAN_IXR_RXNEMP_MASK | XCAN_IXR_RXOK_MASK)) { + if (isr & XCAN_IXR_RXNEMP_MASK) { ier = priv->read_reg(priv, XCAN_IER_OFFSET); - ier &= ~(XCAN_IXR_RXNEMP_MASK | XCAN_IXR_RXOK_MASK); + ier &= ~XCAN_IXR_RXNEMP_MASK; priv->write_reg(priv, XCAN_IER_OFFSET, ier); napi_schedule(&priv->napi); }