From patchwork Wed Oct 25 22:04:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 830399 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=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nhr/g4Oi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yMkjK2kfQz9t4V for ; Thu, 26 Oct 2017 09:05:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932400AbdJYWFV (ORCPT ); Wed, 25 Oct 2017 18:05:21 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:54476 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932340AbdJYWFO (ORCPT ); Wed, 25 Oct 2017 18:05:14 -0400 Received: by mail-qk0-f193.google.com with SMTP id n5so1971875qke.11; Wed, 25 Oct 2017 15:05:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JApzyhj8DxeACQKcu8uB2Geh0yH2PWXE49pUbZPKfAQ=; b=nhr/g4Oi0tGdoS25F0Smd3I5MAY48wqDFnJypwH6jU3dTK0QgXoPzSQ5HNxc0NYIPS oqpTiWM65jZV85+btm1rIHRFn2Eo3dOXN4QVJTtIUf4HUxrydAatRBRJZJ91f7NyCBHD GfR+0b83aK02d5u0pzfHH1NALIzW2v1BHPqy2cDiKIumeAxSiOrvIUQhQ65faQlacT4a qXF81jeOCssZHz0mkaefQiTgUb5+DdzbP6P7/4jKbnKCtFvCK9LqvQJZTHOnaOeZeIx0 vgu0Kzmr58fQN0/HRKkNRnewRGxHI+GQOSdjzc2ieEvFlZRiXu/YHHcXAMiJJkeaY1ra i7lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JApzyhj8DxeACQKcu8uB2Geh0yH2PWXE49pUbZPKfAQ=; b=OZTS4jl+CdRyliBsEmkKcDPehD6UBDisNKGmPgA6p0jXRkYidF4LoM/EyfXzkqhTlX 9CXNXQeu24IEBBBhPUXigIbqJePRL53W7UM2qT0sOE/KwekuLtI1ya2YsngWJLOnOdJh EhRr+92/zYzi4pPke5VtZjNKXrHAkORn2131eY1iU01xGgsURDxsP7zMP4/G1hVlMyN7 rS9wy7g9WgWo9DMz8T0yV++TR8MqutuPg+3qgZ0fzqaVJU7y6SwP3bJWRLadrSuODSWQ CkvjIkZigLmH31YLtkwVekzgbpzlk2muU5E1YY6LuypyNIPHouyIKJAWfwUdIL9zU9gT aHYA== X-Gm-Message-State: AMCzsaU5iSB5WueqPhPziaUtItxCZ1SPfm28bKigk7RIbFq4jAU8hdRw 929z1BJxeoJsDfRZ1xJCeErKgvyO X-Google-Smtp-Source: ABhQp+QdJkeXxrDmeW85SFPFcbERrEn2C0B5T4wBmtk1ocN6rUdzjKQAzIUsyJVcElX42oA0uk4X+Q== X-Received: by 10.55.180.132 with SMTP id d126mr5640928qkf.268.1508969113576; Wed, 25 Oct 2017 15:05:13 -0700 (PDT) Received: from stb-bld-02.irv.broadcom.com ([192.19.255.250]) by smtp.gmail.com with ESMTPSA id f38sm2690246qtf.17.2017.10.25.15.05.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 25 Oct 2017 15:05:12 -0700 (PDT) From: Doug Berger To: Florian Fainelli Cc: Doug Berger , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next 7/9] net: bcmgenet: relax lock constraints to reduce IRQ latency Date: Wed, 25 Oct 2017 15:04:17 -0700 Message-Id: <20171025220419.24951-8-opendmb@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171025220419.24951-1-opendmb@gmail.com> References: <20171025220419.24951-1-opendmb@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since the ring locks are not used in a hard IRQ context it is often not necessary to disable global IRQs while waiting on a lock. Using less restrictive lock and unlock calls improves the real-time responsiveness of the system. Signed-off-by: Doug Berger --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 747224714394..91f52c1b5108 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1405,11 +1405,10 @@ static unsigned int bcmgenet_tx_reclaim(struct net_device *dev, struct bcmgenet_tx_ring *ring) { unsigned int released; - unsigned long flags; - spin_lock_irqsave(&ring->lock, flags); + spin_lock_bh(&ring->lock); released = __bcmgenet_tx_reclaim(dev, ring); - spin_unlock_irqrestore(&ring->lock, flags); + spin_unlock_bh(&ring->lock); return released; } @@ -1420,15 +1419,14 @@ static int bcmgenet_tx_poll(struct napi_struct *napi, int budget) container_of(napi, struct bcmgenet_tx_ring, napi); unsigned int work_done = 0; struct netdev_queue *txq; - unsigned long flags; - spin_lock_irqsave(&ring->lock, flags); + spin_lock(&ring->lock); work_done = __bcmgenet_tx_reclaim(ring->priv->dev, ring); if (ring->free_bds > (MAX_SKB_FRAGS + 1)) { txq = netdev_get_tx_queue(ring->priv->dev, ring->queue); netif_tx_wake_queue(txq); } - spin_unlock_irqrestore(&ring->lock, flags); + spin_unlock(&ring->lock); if (work_done == 0) { napi_complete(napi); @@ -1523,7 +1521,6 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) struct bcmgenet_tx_ring *ring = NULL; struct enet_cb *tx_cb_ptr; struct netdev_queue *txq; - unsigned long flags = 0; int nr_frags, index; dma_addr_t mapping; unsigned int size; @@ -1550,7 +1547,7 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) nr_frags = skb_shinfo(skb)->nr_frags; - spin_lock_irqsave(&ring->lock, flags); + spin_lock(&ring->lock); if (ring->free_bds <= (nr_frags + 1)) { if (!netif_tx_queue_stopped(txq)) { netif_tx_stop_queue(txq); @@ -1645,7 +1642,7 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) bcmgenet_tdma_ring_writel(priv, ring->index, ring->prod_index, TDMA_PROD_INDEX); out: - spin_unlock_irqrestore(&ring->lock, flags); + spin_unlock(&ring->lock); return ret; @@ -2520,17 +2517,16 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) /* Interrupt bottom half */ static void bcmgenet_irq_task(struct work_struct *work) { - unsigned long flags; unsigned int status; struct bcmgenet_priv *priv = container_of( work, struct bcmgenet_priv, bcmgenet_irq_work); netif_dbg(priv, intr, priv->dev, "%s\n", __func__); - spin_lock_irqsave(&priv->lock, flags); + spin_lock_irq(&priv->lock); status = priv->irq0_stat; priv->irq0_stat = 0; - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock_irq(&priv->lock); /* Link UP/DOWN event */ if (status & UMAC_IRQ_LINK_EVENT) @@ -2927,7 +2923,6 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) u32 p_index, c_index, intsts, intmsk; struct netdev_queue *txq; unsigned int free_bds; - unsigned long flags; bool txq_stopped; if (!netif_msg_tx_err(priv)) @@ -2935,7 +2930,7 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) txq = netdev_get_tx_queue(priv->dev, ring->queue); - spin_lock_irqsave(&ring->lock, flags); + spin_lock(&ring->lock); if (ring->index == DESC_INDEX) { intsts = ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS); intmsk = UMAC_IRQ_TXDMA_DONE | UMAC_IRQ_TXDMA_MBDONE; @@ -2947,7 +2942,7 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) p_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_PROD_INDEX); txq_stopped = netif_tx_queue_stopped(txq); free_bds = ring->free_bds; - spin_unlock_irqrestore(&ring->lock, flags); + spin_unlock(&ring->lock); netif_err(priv, tx_err, priv->dev, "Ring %d queue %d status summary\n" "TX queue status: %s, interrupts: %s\n"