Olaf Hering bc4608
From: Haiyang Zhang <haiyangz@microsoft.com>
Olaf Hering bc4608
Date: Fri, 28 Jan 2022 18:03:38 -0800
Olaf Hering bc4608
Patch-mainline: v5.18-rc1
Olaf Hering bc4608
Subject: net: mana: Reuse XDP dropped page
Olaf Hering bc4608
Git-commit: a6bf5703f17bdbd775c0e6837dd2d5b1c344e28c
Olaf Hering bc4608
References: bsc#1195651
Olaf Hering bc4608
Olaf Hering bc4608
Reuse the dropped page in RX path to save page allocation
Olaf Hering bc4608
overhead.
Olaf Hering bc4608
Olaf Hering bc4608
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Olaf Hering bc4608
Signed-off-by: David S. Miller <davem@davemloft.net>
Olaf Hering bc4608
Acked-by: Olaf Hering <ohering@suse.de>
Olaf Hering bc4608
---
Olaf Hering bc4608
 drivers/net/ethernet/microsoft/mana/mana.h    |  1 +
Olaf Hering bc4608
 drivers/net/ethernet/microsoft/mana/mana_en.c | 15 +++++++++++++--
Olaf Hering bc4608
 2 files changed, 14 insertions(+), 2 deletions(-)
Olaf Hering bc4608
Olaf Hering bc4608
diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h
Olaf Hering bc4608
--- a/drivers/net/ethernet/microsoft/mana/mana.h
Olaf Hering bc4608
+++ b/drivers/net/ethernet/microsoft/mana/mana.h
Olaf Hering bc4608
@@ -310,6 +310,7 @@ struct mana_rxq {
Olaf Hering bc4608
 
Olaf Hering bc4608
 	struct bpf_prog __rcu *bpf_prog;
Olaf Hering bc4608
 	struct xdp_rxq_info xdp_rxq;
Olaf Hering bc4608
+	struct page *xdp_save_page;
Olaf Hering bc4608
 
Olaf Hering bc4608
 	/* MUST BE THE LAST MEMBER:
Olaf Hering bc4608
 	 * Each receive buffer has an associated mana_recv_buf_oob.
Olaf Hering bc4608
diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
Olaf Hering bc4608
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
Olaf Hering bc4608
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
Olaf Hering bc4608
@@ -1059,7 +1059,9 @@ drop_xdp:
Olaf Hering bc4608
 	u64_stats_update_end(&rx_stats->syncp);
Olaf Hering bc4608
 
Olaf Hering bc4608
 drop:
Olaf Hering bc4608
-	free_page((unsigned long)buf_va);
Olaf Hering bc4608
+	WARN_ON_ONCE(rxq->xdp_save_page);
Olaf Hering bc4608
+	rxq->xdp_save_page = virt_to_page(buf_va);
Olaf Hering bc4608
+
Olaf Hering bc4608
 	++ndev->stats.rx_dropped;
Olaf Hering bc4608
 
Olaf Hering bc4608
 	return;
Olaf Hering bc4608
@@ -1116,7 +1118,13 @@ static void mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq,
Olaf Hering bc4608
 	rxbuf_oob = &rxq->rx_oobs[curr];
Olaf Hering bc4608
 	WARN_ON_ONCE(rxbuf_oob->wqe_inf.wqe_size_in_bu != 1);
Olaf Hering bc4608
 
Olaf Hering bc4608
-	new_page = alloc_page(GFP_ATOMIC);
Olaf Hering bc4608
+	/* Reuse XDP dropped page if available */
Olaf Hering bc4608
+	if (rxq->xdp_save_page) {
Olaf Hering bc4608
+		new_page = rxq->xdp_save_page;
Olaf Hering bc4608
+		rxq->xdp_save_page = NULL;
Olaf Hering bc4608
+	} else {
Olaf Hering bc4608
+		new_page = alloc_page(GFP_ATOMIC);
Olaf Hering bc4608
+	}
Olaf Hering bc4608
 
Olaf Hering bc4608
 	if (new_page) {
Olaf Hering bc4608
 		da = dma_map_page(dev, new_page, XDP_PACKET_HEADROOM, rxq->datasize,
Olaf Hering bc4608
@@ -1403,6 +1411,9 @@ static void mana_destroy_rxq(struct mana_port_context *apc,
Olaf Hering bc4608
 
Olaf Hering bc4608
 	mana_deinit_cq(apc, &rxq->rx_cq);
Olaf Hering bc4608
 
Olaf Hering bc4608
+	if (rxq->xdp_save_page)
Olaf Hering bc4608
+		__free_page(rxq->xdp_save_page);
Olaf Hering bc4608
+
Olaf Hering bc4608
 	for (i = 0; i < rxq->num_rx_buf; i++) {
Olaf Hering bc4608
 		rx_oob = &rxq->rx_oobs[i];
Olaf Hering bc4608