|
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 |
|