Blame SOURCES/0031-netdrv-bnxt_en-add-page_pool-support.patch

f95c89
From cde6d65ea5063367fa782fcd1ea9fc54cdad4deb Mon Sep 17 00:00:00 2001
f95c89
From: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Date: Wed, 2 Oct 2019 18:22:46 -0400
f95c89
Subject: [PATCH 31/96] [netdrv] bnxt_en: add page_pool support
f95c89
f95c89
Message-id: <5af2e26517985727f11c26b4580740d97a57abce.1570027456.git.jtoppins@redhat.com>
f95c89
Patchwork-id: 276452
f95c89
O-Subject: [RHEL-8.2 PATCH 24/78] bnxt_en: add page_pool support
f95c89
Bugzilla: 1724766
f95c89
RH-Acked-by: John Linville <linville@redhat.com>
f95c89
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
f95c89
f95c89
This removes contention over page allocation for XDP_REDIRECT actions by
f95c89
adding page_pool support per queue for the driver.  The performance for
f95c89
XDP_REDIRECT actions scales linearly with the number of cores performing
f95c89
redirect actions when using the page pools instead of the standard page
f95c89
allocator.
f95c89
f95c89
v2: Fix up the error path from XDP registration, noted by Ilias Apalodimas.
f95c89
f95c89
Signed-off-by: Andy Gospodarek <gospo@broadcom.com>
f95c89
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
f95c89
Signed-off-by: David S. Miller <davem@davemloft.net>
f95c89
(cherry picked from commit 322b87ca55f2f3936ec9f9de438ef9b2115b5c9b)
f95c89
Bugzilla: 1724766
f95c89
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532
f95c89
Tested: build, boot, basic ping
f95c89
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
f95c89
---
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt.c     | 47 +++++++++++++++++++++++----
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt.h     |  3 ++
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |  3 +-
f95c89
 3 files changed, 46 insertions(+), 7 deletions(-)
f95c89
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:14.390525268 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:14.547523827 +0100
f95c89
@@ -54,6 +54,7 @@
f95c89
 #include <net/pkt_cls.h>
f95c89
 #include <linux/hwmon.h>
f95c89
 #include <linux/hwmon-sysfs.h>
f95c89
+#include <net/page_pool.h>
f95c89
 
f95c89
 #include "bnxt_hsi.h"
f95c89
 #include "bnxt.h"
f95c89
@@ -670,19 +671,20 @@
f95c89
 }
f95c89
 
f95c89
 static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
f95c89
+					 struct bnxt_rx_ring_info *rxr,
f95c89
 					 gfp_t gfp)
f95c89
 {
f95c89
 	struct device *dev = &bp->pdev->dev;
f95c89
 	struct page *page;
f95c89
 
f95c89
-	page = alloc_page(gfp);
f95c89
+	page = page_pool_dev_alloc_pages(rxr->page_pool);
f95c89
 	if (!page)
f95c89
 		return NULL;
f95c89
 
f95c89
 	*mapping = dma_map_page_attrs(dev, page, 0, PAGE_SIZE, bp->rx_dir,
f95c89
 				      DMA_ATTR_WEAK_ORDERING);
f95c89
 	if (dma_mapping_error(dev, *mapping)) {
f95c89
-		__free_page(page);
f95c89
+		page_pool_recycle_direct(rxr->page_pool, page);
f95c89
 		return NULL;
f95c89
 	}
f95c89
 	*mapping += bp->rx_dma_offset;
f95c89
@@ -718,7 +720,8 @@
f95c89
 	dma_addr_t mapping;
f95c89
 
f95c89
 	if (BNXT_RX_PAGE_MODE(bp)) {
f95c89
-		struct page *page = __bnxt_alloc_rx_page(bp, &mapping, gfp);
f95c89
+		struct page *page =
f95c89
+			__bnxt_alloc_rx_page(bp, &mapping, rxr, gfp);
f95c89
 
f95c89
 		if (!page)
f95c89
 			return -ENOMEM;
f95c89
@@ -2363,7 +2366,7 @@
f95c89
 				dma_unmap_page_attrs(&pdev->dev, mapping,
f95c89
 						     PAGE_SIZE, bp->rx_dir,
f95c89
 						     DMA_ATTR_WEAK_ORDERING);
f95c89
-				__free_page(data);
f95c89
+				page_pool_recycle_direct(rxr->page_pool, data);
f95c89
 			} else {
f95c89
 				dma_unmap_single_attrs(&pdev->dev, mapping,
f95c89
 						       bp->rx_buf_use_size,
f95c89
@@ -2500,6 +2503,8 @@
f95c89
 		if (xdp_rxq_info_is_reg(&rxr->xdp_rxq))
f95c89
 			xdp_rxq_info_unreg(&rxr->xdp_rxq);
f95c89
 
f95c89
+		rxr->page_pool = NULL;
f95c89
+
f95c89
 		kfree(rxr->rx_tpa);
f95c89
 		rxr->rx_tpa = NULL;
f95c89
 
f95c89
@@ -2514,6 +2519,26 @@
f95c89
 	}
f95c89
 }
f95c89
 
f95c89
+static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
f95c89
+				   struct bnxt_rx_ring_info *rxr)
f95c89
+{
f95c89
+	struct page_pool_params pp = { 0 };
f95c89
+
f95c89
+	pp.pool_size = bp->rx_ring_size;
f95c89
+	pp.nid = dev_to_node(&bp->pdev->dev);
f95c89
+	pp.dev = &bp->pdev->dev;
f95c89
+	pp.dma_dir = DMA_BIDIRECTIONAL;
f95c89
+
f95c89
+	rxr->page_pool = page_pool_create(&pp;;
f95c89
+	if (IS_ERR(rxr->page_pool)) {
f95c89
+		int err = PTR_ERR(rxr->page_pool);
f95c89
+
f95c89
+		rxr->page_pool = NULL;
f95c89
+		return err;
f95c89
+	}
f95c89
+	return 0;
f95c89
+}
f95c89
+
f95c89
 static int bnxt_alloc_rx_rings(struct bnxt *bp)
f95c89
 {
f95c89
 	int i, rc, agg_rings = 0, tpa_rings = 0;
f95c89
@@ -2533,14 +2558,24 @@
f95c89
 
f95c89
 		ring = &rxr->rx_ring_struct;
f95c89
 
f95c89
+		rc = bnxt_alloc_rx_page_pool(bp, rxr);
f95c89
+		if (rc)
f95c89
+			return rc;
f95c89
+
f95c89
 		rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i);
f95c89
-		if (rc < 0)
f95c89
+		if (rc < 0) {
f95c89
+			page_pool_free(rxr->page_pool);
f95c89
+			rxr->page_pool = NULL;
f95c89
 			return rc;
f95c89
+		}
f95c89
 
f95c89
 		rc = xdp_rxq_info_reg_mem_model(&rxr->xdp_rxq,
f95c89
-						MEM_TYPE_PAGE_SHARED, NULL);
f95c89
+						MEM_TYPE_PAGE_POOL,
f95c89
+						rxr->page_pool);
f95c89
 		if (rc) {
f95c89
 			xdp_rxq_info_unreg(&rxr->xdp_rxq);
f95c89
+			page_pool_free(rxr->page_pool);
f95c89
+			rxr->page_pool = NULL;
f95c89
 			return rc;
f95c89
 		}
f95c89
 
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2020-02-06 16:23:14.390525268 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2020-02-06 16:23:14.548523818 +0100
f95c89
@@ -26,6 +26,8 @@
f95c89
 #include <net/xdp.h>
f95c89
 #include <linux/net_dim.h>
f95c89
 
f95c89
+struct page_pool;
f95c89
+
f95c89
 struct tx_bd {
f95c89
 	__le32 tx_bd_len_flags_type;
f95c89
 	#define TX_BD_TYPE					(0x3f << 0)
f95c89
@@ -799,6 +801,7 @@
f95c89
 	struct bnxt_ring_struct	rx_ring_struct;
f95c89
 	struct bnxt_ring_struct	rx_agg_ring_struct;
f95c89
 	struct xdp_rxq_info	xdp_rxq;
f95c89
+	struct page_pool	*page_pool;
f95c89
 };
f95c89
 
f95c89
 struct bnxt_cp_ring_info {
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c	2020-02-06 16:23:14.390525268 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c	2020-02-06 16:23:14.548523818 +0100
f95c89
@@ -15,6 +15,7 @@
f95c89
 #include <linux/bpf.h>
f95c89
 #include <linux/bpf_trace.h>
f95c89
 #include <linux/filter.h>
f95c89
+#include <net/page_pool.h>
f95c89
 #include "bnxt_hsi.h"
f95c89
 #include "bnxt.h"
f95c89
 #include "bnxt_xdp.h"
f95c89
@@ -191,7 +192,7 @@
f95c89
 
f95c89
 		if (xdp_do_redirect(bp->dev, &xdp, xdp_prog)) {
f95c89
 			trace_xdp_exception(bp->dev, xdp_prog, act);
f95c89
-			__free_page(page);
f95c89
+			page_pool_recycle_direct(rxr->page_pool, page);
f95c89
 			return true;
f95c89
 		}
f95c89