From patchwork Fri Dec 14 08:59:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 153788 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1820117ljp; Fri, 14 Dec 2018 00:59:11 -0800 (PST) X-Google-Smtp-Source: AFSGD/WYxtdxbehs4BQG7lkEOBPBfBDGC+2jn29QYgUMfdmtbwsqJnAmI35Xy2iEWKTokTPAPjPV X-Received: by 2002:a62:3006:: with SMTP id w6mr2063755pfw.258.1544777951608; Fri, 14 Dec 2018 00:59:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544777951; cv=none; d=google.com; s=arc-20160816; b=He9zN+9IMLWkZe0Rw1h9WhLWFd6xpC661pPGS8ViamRGuQz9tEqQvm3cq2SDvxApX2 vfUzZQUnbryOrMzXbT7cXo1n6jH/2j9RtcQFAqOobpoGmchYmNHIIvFkY5kFpoFrDl2X JqIiUpUneBeRT/YfHxQ0xcxPM2teX02CHMGuLq9MkfO/yRb5VeuBkx/vlB8/siwYQl71 sTGwaKIkek6bl6SAAR6RrR5mhIGke1vkiKzgvCsabxKDEc9g+mlWCNSxa6QFkb0Uz+2h 8NHy0SKjIF437ssXq/b5OiwA/v84q3lV1hRIi3F8ww3+i0PL5xi/D3LG9XFuzH+ADRor 3GGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=A64ZpNahV4kIxM46GuSp2YjQhLEiPpZQb4X68YDJfXM=; b=FeC8I+DL3By2LE03mJRoMBHd/zYIB2C9BTz4r1ynxLwxU2EBNfaJJQ7UO26JgnG1dH 6jlu7w0kceDkxX8Nn6tLXjpkV6YE1sl/G+/3hpGarIjG92UvCi8K4/TkPQNGiYzi3sG1 5RzQzxYW4EpK15IAUyQvmNSZvXwMDEwbEePNlbWaL2ws1JArjEw/4yntsMw38QKpmHm2 gGKKpZp/ikDSl/Wf0KbtYc+dvodTVsM8Vb1XUGeSuxDRH+dnQuyYTC68HKg1AA8c1uj8 tPst/c5K5Ho5+AGk1n6CMpzDsaZ72eo32bDiveVTo81c0/i8jfqCuPbgEEvp7MATqBWN gQdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=MvkY4X5f; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v69si763613pgd.284.2018.12.14.00.59.11; Fri, 14 Dec 2018 00:59:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of netdev-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=@linaro.org header.s=google header.b=MvkY4X5f; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728718AbeLNI7K (ORCPT + 10 others); Fri, 14 Dec 2018 03:59:10 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:37095 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726520AbeLNI7I (ORCPT ); Fri, 14 Dec 2018 03:59:08 -0500 Received: by mail-wm1-f65.google.com with SMTP id g67so4990838wmd.2 for ; Fri, 14 Dec 2018 00:59:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=A64ZpNahV4kIxM46GuSp2YjQhLEiPpZQb4X68YDJfXM=; b=MvkY4X5fvMIiJJ2FxqnDCNxHDmh5HDAD6UohP7UJzAZBHcbJ03DAgKdGse/VrclSHl tvZ4DRBly7b/pPnWTTXwgF3Rh/+VqXPzZtP/1CgfAjx07EcZhYURwuTLRaknDvI/tLeL Qt/wp8tCQICqNnIZMdcZq7JWYiHLjyMBGIg/s= 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=A64ZpNahV4kIxM46GuSp2YjQhLEiPpZQb4X68YDJfXM=; b=XcPETMAO3tig2zaAb6cLWv6AkH1rYNd+iMNK49J3+IIUu1x8QUUkhwOLWYtzUZZYyn M8ld7p+IfptRJq5M0RTRjwU3AAokx8KtqGkuTjdu9gc+AhqHEFsuVvi/KNhorBMnFjid bT225HUeq23FnGyfP0TuiZoTAN9bV+8CGRnmALvg//rHcZ7iBwaoBRjAbR+Bq96Ka27o MG6GeXO5vDd1Esv5MV+KFIbKwKVmbaohdZUinepuM42bb7zTvwpAtQGC68RB0bmbiSSE GFsj9OiDoZ3WVDWyPrguCMW5OYVORV7RV/34E3au2ozh61y4sRA78WmkR3MqGbj7GdCM 9K5g== X-Gm-Message-State: AA+aEWYtuHJr3BJNhjvqu/C3miqRug7cwL1GGfCJI4sc+96c1oNOm1ka pi0KTLYdT2A4x/bC5bwP/RzN7R4nX8M= X-Received: by 2002:a1c:a84f:: with SMTP id r76mr2500809wme.16.1544777946445; Fri, 14 Dec 2018 00:59:06 -0800 (PST) Received: from apalos.lan (ppp-94-64-136-149.home.otenet.gr. [94.64.136.149]) by smtp.gmail.com with ESMTPSA id o82sm4373808wmo.29.2018.12.14.00.59.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 14 Dec 2018 00:59:05 -0800 (PST) From: Ilias Apalodimas To: netdev@vger.kernel.org, jaswinder.singh@linaro.org, ard.biesheuvel@linaro.org Cc: masami.hiramatsu@linaro.org, masahisa.kojima@linaro.org, Ilias Apalodimas Subject: [net-next, PATCH 2/2] net: socionext: remove mmio reads on Tx Date: Fri, 14 Dec 2018 10:59:01 +0200 Message-Id: <1544777941-24083-2-git-send-email-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544777941-24083-1-git-send-email-ilias.apalodimas@linaro.org> References: <1544777941-24083-1-git-send-email-ilias.apalodimas@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently the driver issues 2 mmio reads to figure out the number of transmitted packets and clean them. We can get rid of the expensive reads since BIT 31 of the Tx descriptor can be used for that. We can also remove the budget counting of Tx completions since all of the descriptors are not deliberately processed. Performance numbers using pktgen are: size pre-patch(pps) post-patch(pps) 64 362483 427916 128 358315 411686 256 352725 389683 512 215675 216464 1024 113812 114442 Signed-off-by: Ilias Apalodimas --- drivers/net/ethernet/socionext/netsec.c | 97 ++++++++++++++----------- 1 file changed, 54 insertions(+), 43 deletions(-) -- 2.19.1 diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c index 584a6b3f6542..05a0948ad929 100644 --- a/drivers/net/ethernet/socionext/netsec.c +++ b/drivers/net/ethernet/socionext/netsec.c @@ -257,7 +257,6 @@ struct netsec_desc_ring { dma_addr_t desc_dma; struct netsec_desc *desc; void *vaddr; - u16 pkt_cnt; u16 head, tail; }; @@ -598,33 +597,26 @@ static void netsec_set_rx_de(struct netsec_priv *priv, dring->desc[idx].len = desc->len; } -static int netsec_clean_tx_dring(struct netsec_priv *priv, int budget) +static bool netsec_clean_tx_dring(struct netsec_priv *priv) { struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; unsigned int pkts, bytes; - - dring->pkt_cnt += netsec_read(priv, NETSEC_REG_NRM_TX_DONE_PKTCNT); - - if (dring->pkt_cnt < budget) - budget = dring->pkt_cnt; + struct netsec_de *entry; + int tail = dring->tail; + int cnt = 0; pkts = 0; bytes = 0; + entry = dring->vaddr + DESC_SZ * tail; - while (pkts < budget) { + while (!(entry->attr & (1U << NETSEC_TX_SHIFT_OWN_FIELD)) && + cnt < DESC_NUM) { struct netsec_desc *desc; - struct netsec_de *entry; - int tail, eop; - - tail = dring->tail; - - /* move tail ahead */ - dring->tail = (tail + 1) % DESC_NUM; + int eop; desc = &dring->desc[tail]; - entry = dring->vaddr + DESC_SZ * tail; - eop = (entry->attr >> NETSEC_TX_LAST) & 1; + dma_rmb(); dma_unmap_single(priv->dev, desc->dma_addr, desc->len, DMA_TO_DEVICE); @@ -633,38 +625,51 @@ static int netsec_clean_tx_dring(struct netsec_priv *priv, int budget) bytes += desc->skb->len; dev_kfree_skb(desc->skb); } + /* clean up so netsec_uninit_pkt_dring() won't free the skb + * again + */ *desc = (struct netsec_desc){}; + + /* entry->attr is not going to be accessed by the NIC until + * netsec_set_tx_de() is called. No need for a dma_wmb() here + */ + entry->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; + /* move tail ahead */ + dring->tail = (tail + 1) % DESC_NUM; + + tail = dring->tail; + entry = dring->vaddr + DESC_SZ * tail; + cnt++; } - dring->pkt_cnt -= budget; - priv->ndev->stats.tx_packets += budget; + if (!cnt) + return false; + + /* reading the register clears the irq */ + netsec_read(priv, NETSEC_REG_NRM_TX_DONE_PKTCNT); + + priv->ndev->stats.tx_packets += cnt; priv->ndev->stats.tx_bytes += bytes; - netdev_completed_queue(priv->ndev, budget, bytes); + netdev_completed_queue(priv->ndev, cnt, bytes); - return budget; + return true; } -static int netsec_process_tx(struct netsec_priv *priv, int budget) +static void netsec_process_tx(struct netsec_priv *priv) { struct net_device *ndev = priv->ndev; - int new, done = 0; + bool cleaned; - do { - new = netsec_clean_tx_dring(priv, budget); - done += new; - budget -= new; - } while (new); + cleaned = netsec_clean_tx_dring(priv); - if (done && netif_queue_stopped(ndev)) { + if (cleaned && netif_queue_stopped(ndev)) { /* Make sure we update the value, anyone stopping the queue * after this will read the proper consumer idx */ smp_wmb(); netif_wake_queue(ndev); } - - return done; } static void *netsec_alloc_rx_data(struct netsec_priv *priv, @@ -813,24 +818,17 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget) static int netsec_napi_poll(struct napi_struct *napi, int budget) { struct netsec_priv *priv; - int tx, rx, done, todo; + int rx, done, todo; priv = container_of(napi, struct netsec_priv, napi); + netsec_process_tx(priv); + todo = budget; do { - if (!todo) - break; - - tx = netsec_process_tx(priv, todo); - todo -= tx; - - if (!todo) - break; - rx = netsec_process_rx(priv, todo); todo -= rx; - } while (rx || tx); + } while (rx); done = budget - todo; @@ -1007,7 +1005,6 @@ static void netsec_uninit_pkt_dring(struct netsec_priv *priv, int id) dring->head = 0; dring->tail = 0; - dring->pkt_cnt = 0; if (id == NETSEC_RING_TX) netdev_reset_queue(priv->ndev); @@ -1030,6 +1027,7 @@ static void netsec_free_dring(struct netsec_priv *priv, int id) static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) { struct netsec_desc_ring *dring = &priv->desc_ring[id]; + int i; dring->vaddr = dma_zalloc_coherent(priv->dev, DESC_SZ * DESC_NUM, &dring->desc_dma, GFP_KERNEL); @@ -1040,6 +1038,19 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) if (!dring->desc) goto err; + if (id == NETSEC_RING_TX) { + for (i = 0; i < DESC_NUM; i++) { + struct netsec_de *de; + + de = dring->vaddr + (DESC_SZ * i); + /* de->attr is not going to be accessed by the NIC + * until netsec_set_tx_de() is called. + * No need for a dma_wmb() here + */ + de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; + } + } + return 0; err: netsec_free_dring(priv, id);