Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2304253pxb; Mon, 12 Apr 2021 21:29:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzZRfZigxN3Rj6mfF0FCpq0Tpbr9rcG0nckcmMGm6tv6NIo83LrKCPx5NGqJCtEzUGzz2lm X-Received: by 2002:a63:770e:: with SMTP id s14mr29306633pgc.377.1618288142333; Mon, 12 Apr 2021 21:29:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618288142; cv=none; d=google.com; s=arc-20160816; b=JJ6elfE0UlbKlcgSGixtGcFDtp3bA53Cw4MOPoxVegZja6TamgB2Cn1ABkVfY/LxD2 sOW1hZ7McfibNQWaGmq5hvnaa531YQ85Kj/bdFhnYZnVSA8wn7OibE1ylfNuFbEl+3cH gbbWa4BRUC8p5oGpLOqiQR8mRztGNPzZObNAJAMk0qgpx1nNaCt4aqXPELNtwSZ98Ays E2hb9RZyYCzqMHE9DfhjXVMMyyjW1q+vjT7NHh4iCHMz40n4q/Ut71T9SpOOJH8baBnL 0XKUajpvZHJhNkqu9tsSacDQ5UeaIdUkleksXbD2jyXcW4OlEyGAqAmjpO+v8eLRAlTM 8pBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=asT62JkJAidvdD7UWG30F3qINeBSoKs5djMCZj9XWco=; b=CCN8NPwCZjUBmOX8ACjIUQ+1aFxeE95N6FAb+iwT/jfyIFnQRRpurzWxxpt8w154/i zWnRZ/fUac8llDhxAgZEv3v64t32KJ/guHIUDDUbrzcNWGlFOi1bdMI+6IiwY7aW8Q9Z meze2jmcGDv9mzGryQORa6Wil7blfuR6NBaJ8nXrimaasathXtj1OWWguEK8XEPWP/nq OSUrvC6SDLuIkOyujLDP5umhO2b7vaQZQ7DXLTswrGIm3nXXge9gl3jLHOdMzM/Iw2r4 VATk9PTnaxv1BAh0z+B+NaVDDfq82lDAH3ubJ4m8phUEUDqcBf99PNDFoPFs6WHEBs23 gKaA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b1si13163366pfl.21.2021.04.12.21.28.37; Mon, 12 Apr 2021 21:29:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242968AbhDLPhq (ORCPT + 99 others); Mon, 12 Apr 2021 11:37:46 -0400 Received: from mga05.intel.com ([192.55.52.43]:41987 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242914AbhDLPhp (ORCPT ); Mon, 12 Apr 2021 11:37:45 -0400 IronPort-SDR: R0K20H000oLk8q4oziQWuz8Pd9wcH0X3HslcBg+8nS71F7fpNp8Zf2h64g0uyBrJtFopSDJ5qN mMa6fzrnfweQ== X-IronPort-AV: E=McAfee;i="6200,9189,9952"; a="279520304" X-IronPort-AV: E=Sophos;i="5.82,216,1613462400"; d="scan'208";a="279520304" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Apr 2021 08:37:17 -0700 IronPort-SDR: Y+VhotsPXfLSlncPOi6QP+SGALop2oO8wwbDTZ1PYuURK7dOdAcdBBm1xQGnV3kSkCEJN3Lmvz 1ekseQYaOLuA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,216,1613462400"; d="scan'208";a="614609535" Received: from glass.png.intel.com ([10.158.65.59]) by fmsmga005.fm.intel.com with ESMTP; 12 Apr 2021 08:37:13 -0700 From: Ong Boon Leong To: Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , "David S . Miller" , Jakub Kicinski , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend Cc: Maxime Coquelin , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , KP Singh , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Ong Boon Leong Subject: [PATCH net-next 1/7] net: stmmac: rearrange RX buffer allocation and free functions Date: Mon, 12 Apr 2021 23:41:24 +0800 Message-Id: <20210412154130.20742-2-boon.leong.ong@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210412154130.20742-1-boon.leong.ong@intel.com> References: <20210412154130.20742-1-boon.leong.ong@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch restructures the per RX queue buffer allocation from page_pool to stmmac_alloc_rx_buffers(). We also rearrange dma_free_rx_skbufs() so that it can be used in init_dma_rx_desc_rings() during freeing of RX buffer in the event of page_pool allocation failure to replace the more efficient method earlier. The replacement is needed to make the RX buffer alloc and free method scalable to XDP ZC xsk_pool alloc and free later. Signed-off-by: Ong Boon Leong --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 77285646c5fc..f6d3d26ce45a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1475,6 +1475,43 @@ static void stmmac_free_tx_buffer(struct stmmac_priv *priv, u32 queue, int i) tx_q->tx_skbuff_dma[i].map_as_page = false; } +/** + * dma_free_rx_skbufs - free RX dma buffers + * @priv: private structure + * @queue: RX queue index + */ +static void dma_free_rx_skbufs(struct stmmac_priv *priv, u32 queue) +{ + int i; + + for (i = 0; i < priv->dma_rx_size; i++) + stmmac_free_rx_buffer(priv, queue, i); +} + +static int stmmac_alloc_rx_buffers(struct stmmac_priv *priv, u32 queue, + gfp_t flags) +{ + struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; + int i; + + for (i = 0; i < priv->dma_rx_size; i++) { + struct dma_desc *p; + int ret; + + if (priv->extend_desc) + p = &((rx_q->dma_erx + i)->basic); + else + p = rx_q->dma_rx + i; + + ret = stmmac_init_rx_buffers(priv, p, i, flags, + queue); + if (ret) + return ret; + } + + return 0; +} + /** * stmmac_reinit_rx_buffers - reinit the RX descriptor buffer. * @priv: driver private structure @@ -1547,15 +1584,14 @@ static void stmmac_reinit_rx_buffers(struct stmmac_priv *priv) return; err_reinit_rx_buffers: - do { - while (--i >= 0) - stmmac_free_rx_buffer(priv, queue, i); + while (queue >= 0) { + dma_free_rx_skbufs(priv, queue); if (queue == 0) break; - i = priv->dma_rx_size; - } while (queue-- > 0); + queue--; + } } /** @@ -1572,7 +1608,6 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) u32 rx_count = priv->plat->rx_queues_to_use; int ret = -ENOMEM; int queue; - int i; /* RX INITIALIZATION */ netif_dbg(priv, probe, priv->dev, @@ -1580,7 +1615,7 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) for (queue = 0; queue < rx_count; queue++) { struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; - int ret; + netif_dbg(priv, probe, priv->dev, "(%s) dma_rx_phy=0x%08x\n", __func__, @@ -1596,22 +1631,12 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) "Register MEM_TYPE_PAGE_POOL RxQ-%d\n", rx_q->queue_index); - for (i = 0; i < priv->dma_rx_size; i++) { - struct dma_desc *p; - - if (priv->extend_desc) - p = &((rx_q->dma_erx + i)->basic); - else - p = rx_q->dma_rx + i; - - ret = stmmac_init_rx_buffers(priv, p, i, flags, - queue); - if (ret) - goto err_init_rx_buffers; - } + ret = stmmac_alloc_rx_buffers(priv, queue, flags); + if (ret < 0) + goto err_init_rx_buffers; rx_q->cur_rx = 0; - rx_q->dirty_rx = (unsigned int)(i - priv->dma_rx_size); + rx_q->dirty_rx = 0; /* Setup the chained descriptor addresses */ if (priv->mode == STMMAC_CHAIN_MODE) { @@ -1630,13 +1655,11 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) err_init_rx_buffers: while (queue >= 0) { - while (--i >= 0) - stmmac_free_rx_buffer(priv, queue, i); + dma_free_rx_skbufs(priv, queue); if (queue == 0) break; - i = priv->dma_rx_size; queue--; } @@ -1731,19 +1754,6 @@ static int init_dma_desc_rings(struct net_device *dev, gfp_t flags) return ret; } -/** - * dma_free_rx_skbufs - free RX dma buffers - * @priv: private structure - * @queue: RX queue index - */ -static void dma_free_rx_skbufs(struct stmmac_priv *priv, u32 queue) -{ - int i; - - for (i = 0; i < priv->dma_rx_size; i++) - stmmac_free_rx_buffer(priv, queue, i); -} - /** * dma_free_tx_skbufs - free TX dma buffers * @priv: private structure -- 2.25.1