Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp5912427ybf; Thu, 5 Mar 2020 09:20:43 -0800 (PST) X-Google-Smtp-Source: ADFU+vuN3Bwhs0W77ukQ5yD756KxKHnutJQCfkmlO75R9+8ns1iWHOSv73nXRskmGXg2HEnjuB+E X-Received: by 2002:a9d:21c5:: with SMTP id s63mr7298963otb.142.1583428843094; Thu, 05 Mar 2020 09:20:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583428843; cv=none; d=google.com; s=arc-20160816; b=FH8vOaAgrAdfYEHl4av0sP/JsX3W1vm0lQawBWikJC/Iq9d8KfZNqAfR4v8O10kyfa 5amVZknFfAo/WhseTBRTgc7Ve1kXHtQJW1s3hA1Wv+v8UH5pDSH5XKf+pnLSZ5aqO7xq eqzWwXO0Q1kGy6bQmemXO3se/RpZ4Bp54VdtoSXKKcuM/ujdc1eq9ahtu3Jza4Xcjh94 3F0QHTonqQqXehhxeTkUxQn4jdxJHVXGyiz8467cOUY0aAl3KR04o1XXhc4O3teNkQ6q lOPMwmi4kLbKo1Dj3YNj1oumkJA5B4H0MAcQ8CPxwOgtUB/jsDbeA/dJ4lBmrd/VfEOe kP2Q== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZJybJ+z8Q7WWevdFmLsjLBa5aCVIt0/lKRmx3C4m9Og=; b=L1JRiuiLHRj/YZEyGKq/CYSIbkEZAQdqoQKTXFkE4zbykFucZHWk08F+Z7ZuGvLd2A JDPYtI5eG0AOmURt2GjY+suokbLTjKqruYA6fzNvCkR6qmFsK4RtNuywjJITkhS3a4kT F/JHSCpnWN0n92xTnaI8gTbZun4CTa+gp0jQQ8K8d6i7e+KOS7bAMyWJIUfwVk7r+8GL asCdauxUVts8Fyde5OHXTnGkiJGaFI87Pvti10yZdYbEupwOEZ2VGz95PUtITfeX9+oe q0p0SjQJ25AWTkABmKnHPoojz63brkewvxeu6dHm4fu5VEdyrF7s2dYIZ/DJiJXowdzj xWgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gU9Q4KQ1; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n1si4011072otf.102.2020.03.05.09.20.30; Thu, 05 Mar 2020 09:20:43 -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=gU9Q4KQ1; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728144AbgCERUA (ORCPT + 99 others); Thu, 5 Mar 2020 12:20:00 -0500 Received: from mail.kernel.org ([198.145.29.99]:41466 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726979AbgCERO6 (ORCPT ); Thu, 5 Mar 2020 12:14:58 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A7CEB20848; Thu, 5 Mar 2020 17:14:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583428497; bh=fIW9RpwBzvjkRLCfM9sJ2cMeptlTr1Gs34EZQL58bpw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gU9Q4KQ19riq+8/oAw28AKaL6qam/IfMCMJeyw4xtG2FsOlOgAQIDCT0JJkdtuRYJ yFwJc45mDdTXaYjy1Ec8cDudnhbjuISuS+J4nYmJEn7Vvp1UWGQEpQJpxAKL1y2a/o ON1HZ5w+nmhHMljmgIrRt4CgXtegk/bgnQNeuwPM= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Marek Vasut , "David S . Miller" , Lukas Wunner , Petr Stetiar , YueHaibing , Sasha Levin , netdev@vger.kernel.org Subject: [PATCH AUTOSEL 5.4 29/58] net: ks8851-ml: Fix IRQ handling and locking Date: Thu, 5 Mar 2020 12:13:50 -0500 Message-Id: <20200305171420.29595-29-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200305171420.29595-1-sashal@kernel.org> References: <20200305171420.29595-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marek Vasut [ Upstream commit 44343418d0f2f623cb9da6f5000df793131cbe3b ] The KS8851 requires that packet RX and TX are mutually exclusive. Currently, the driver hopes to achieve this by disabling interrupt from the card by writing the card registers and by disabling the interrupt on the interrupt controller. This however is racy on SMP. Replace this approach by expanding the spinlock used around the ks_start_xmit() TX path to ks_irq() RX path to assure true mutual exclusion and remove the interrupt enabling/disabling, which is now not needed anymore. Furthermore, disable interrupts also in ks_net_stop(), which was missing before. Note that a massive improvement here would be to re-use the KS8851 driver approach, which is to move the TX path into a worker thread, interrupt handling to threaded interrupt, and synchronize everything with mutexes, but that would be a much bigger rework, for a separate patch. Signed-off-by: Marek Vasut Cc: David S. Miller Cc: Lukas Wunner Cc: Petr Stetiar Cc: YueHaibing Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/micrel/ks8851_mll.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c index a41a90c589db2..20cb5b500661a 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c @@ -548,14 +548,17 @@ static irqreturn_t ks_irq(int irq, void *pw) { struct net_device *netdev = pw; struct ks_net *ks = netdev_priv(netdev); + unsigned long flags; u16 status; + spin_lock_irqsave(&ks->statelock, flags); /*this should be the first in IRQ handler */ ks_save_cmd_reg(ks); status = ks_rdreg16(ks, KS_ISR); if (unlikely(!status)) { ks_restore_cmd_reg(ks); + spin_unlock_irqrestore(&ks->statelock, flags); return IRQ_NONE; } @@ -581,6 +584,7 @@ static irqreturn_t ks_irq(int irq, void *pw) ks->netdev->stats.rx_over_errors++; /* this should be the last in IRQ handler*/ ks_restore_cmd_reg(ks); + spin_unlock_irqrestore(&ks->statelock, flags); return IRQ_HANDLED; } @@ -650,6 +654,7 @@ static int ks_net_stop(struct net_device *netdev) /* shutdown RX/TX QMU */ ks_disable_qmu(ks); + ks_disable_int(ks); /* set powermode to soft power down to save power */ ks_set_powermode(ks, PMECR_PM_SOFTDOWN); @@ -706,10 +711,9 @@ static netdev_tx_t ks_start_xmit(struct sk_buff *skb, struct net_device *netdev) { netdev_tx_t retv = NETDEV_TX_OK; struct ks_net *ks = netdev_priv(netdev); + unsigned long flags; - disable_irq(netdev->irq); - ks_disable_int(ks); - spin_lock(&ks->statelock); + spin_lock_irqsave(&ks->statelock, flags); /* Extra space are required: * 4 byte for alignment, 4 for status/length, 4 for CRC @@ -723,9 +727,7 @@ static netdev_tx_t ks_start_xmit(struct sk_buff *skb, struct net_device *netdev) dev_kfree_skb(skb); } else retv = NETDEV_TX_BUSY; - spin_unlock(&ks->statelock); - ks_enable_int(ks); - enable_irq(netdev->irq); + spin_unlock_irqrestore(&ks->statelock, flags); return retv; } -- 2.20.1