Received: by 2002:a25:d783:0:0:0:0:0 with SMTP id o125csp651560ybg; Thu, 19 Mar 2020 06:26:10 -0700 (PDT) X-Google-Smtp-Source: ADFU+vsW79tVTHmz9IVr5qblue7D/o56/nvlroKf1qrCjaFnDI0DYEZRhELfxObZ9gCq26pozgXO X-Received: by 2002:a9d:7a47:: with SMTP id z7mr2354164otm.341.1584624370108; Thu, 19 Mar 2020 06:26:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1584624370; cv=none; d=google.com; s=arc-20160816; b=owSYJ0oKYt3KEjCIMQpZQQHbTxUxKxv7hocrEyOhdDGl9enL8btAMz/fxEFWF1nnep YO41qmOBsU4GEaLAhRcE+zqdqtUfwHxkMqU6YL2slWsek5YaVfPVBB1ozu5wcBph4BKl atGRG5JJlKBFxl7Ds3UMpEoLOHERoAtZ097fV1A79DfcKfTlM/o9MdBaS7ioudYqKBkz +I9FsVhdpxDmuRtg0G+DxgIzZKk2FqyrQM8IxqITN8+n4HLF+3Y8dLSq4n29aC8gEOj1 0ZTMJ8MvzpJy4/yl8yhAgTPMDttlRuoQ6iyHCSun2bbajL3/rGiF/0aYz2VXKQiFurie XBgA== 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=+8R720cYsAmElhCoFUzkgrIMnxZLk1MrkTGlRc2WUMI=; b=PLbvUXcXF10uttCY+TMQmlhTWwlytWkxEe1dcHTvUnzRCQ8Th7nzvBVpLTykaQ4M2K F0UuzfGl1dF/RabMUBDBkY1VU9bWWVzjtfQve9KZDwIwvUwAk4eCUqUbV06TS9Gp3p6R 6TdcyKWlb39cwlmHXygnUy3kBBnmwSFtdNJXfD/EVVjGiBnzCAbyCiTzTqh+gbx0yxDT nTWpz3UgHAezsizggxH2gZufKxZfVg1up/qR07NS4/3yBYXdQ/oBC4J8jcXpDeg1aNXP VFh6pF95AjTG1CIOmgYSZmTt1RSdRN6PM/5HzxOWkBHeUfaGr1eqO6g3u7Xm03wZGuVG JxCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=F5KVKQpu; 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 c24si1275973otf.33.2020.03.19.06.25.57; Thu, 19 Mar 2020 06:26:10 -0700 (PDT) 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=F5KVKQpu; 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 S1730661AbgCSNZj (ORCPT + 99 others); Thu, 19 Mar 2020 09:25:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:53254 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730655AbgCSNZh (ORCPT ); Thu, 19 Mar 2020 09:25:37 -0400 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 D45EF2098B; Thu, 19 Mar 2020 13:25:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1584624336; bh=x/7Mj1IVLKhB1GyaA358yPJMXxDjNwkvTdsrP80kqqM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F5KVKQpupb1nxQCcXN/0PFX/RcayhjdKUrxRZJnSKNdBehJcUUbuQ6lq+n091ilna fIG6jSqruW7X1jqA3TgLHEmxmIssu/jQfU3LkMv5Dz7pqaD57oU80R6x9BNRD/Pi1A JhDHTZCER2IR1hrbxEdUVkrICmb/werMUwtgWBTs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Marek Vasut , "David S. Miller" , Lukas Wunner , Petr Stetiar , YueHaibing , Sasha Levin Subject: [PATCH 5.5 27/65] net: ks8851-ml: Fix IRQ handling and locking Date: Thu, 19 Mar 2020 14:04:09 +0100 Message-Id: <20200319123934.961487440@linuxfoundation.org> X-Mailer: git-send-email 2.25.2 In-Reply-To: <20200319123926.466988514@linuxfoundation.org> References: <20200319123926.466988514@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: 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 1c9e70c8cc30f..58579baf3f7a0 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c @@ -513,14 +513,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; } @@ -546,6 +549,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; } @@ -615,6 +619,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); @@ -671,10 +676,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 @@ -688,9 +692,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