af_xdp: support recv multi-buffer

(cherry picked from commit cf4507174c716b42b2719908f43014f20daf02d7)
This commit is contained in:
yangchen 2024-09-27 03:51:25 +08:00 committed by openeuler-sync-bot
parent bf2fe05763
commit 89e4105c87
2 changed files with 121 additions and 1 deletions

View File

@ -0,0 +1,116 @@
From ed5af003e157c40b50f836de32219ab38b481346 Mon Sep 17 00:00:00 2001
From: yangchen <yangchen145@huawei.com>
Date: Fri, 27 Sep 2024 04:55:05 +0800
Subject: [PATCH] af_xdp: support recv multi-buffer
---
drivers/net/af_xdp/rte_eth_af_xdp.c | 53 +++++++++++++++++++++++------
1 file changed, 43 insertions(+), 10 deletions(-)
diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c
index e79a308..ddee40d 100644
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
@@ -62,6 +62,15 @@
#define PF_XDP AF_XDP
#endif
+/* XDP_USE_SG and XDP_PKT_CONTD are defined in linux/if_xdp.h, but not present before kernel-6.x. */
+#ifndef XDP_USE_SG
+#define XDP_USE_SG (1 << 4)
+#endif
+
+#ifndef XDP_PKT_CONTD
+#define XDP_PKT_CONTD (1 << 0)
+#endif
+
RTE_LOG_REGISTER_DEFAULT(af_xdp_logtype, NOTICE);
#define AF_XDP_LOG(level, fmt, args...) \
@@ -321,6 +330,10 @@ af_xdp_rx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
int i;
struct rte_mbuf *fq_bufs[ETH_AF_XDP_RX_BATCH_SIZE];
struct rte_eth_dev *dev = &rte_eth_devices[rxq->port];
+ bool new_packet = true;
+ struct rte_mbuf *cur_mbuf = NULL;
+ struct rte_mbuf *pre_mbuf = NULL;
+ uint16_t rcvd_pkts = 0;
nb_pkts = xsk_ring_cons__peek(rx, nb_pkts, &idx_rx);
@@ -358,27 +371,43 @@ af_xdp_rx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
uint64_t addr;
uint32_t len;
uint64_t offset;
+ bool eop = true;
desc = xsk_ring_cons__rx_desc(rx, idx_rx++);
addr = desc->addr;
len = desc->len;
+ eop = !(desc->options & XDP_PKT_CONTD);
offset = xsk_umem__extract_offset(addr);
addr = xsk_umem__extract_addr(addr);
- bufs[i] = (struct rte_mbuf *)
- xsk_umem__get_data(umem->buffer, addr +
- umem->mb_pool->header_size);
- bufs[i]->data_off = offset - sizeof(struct rte_mbuf) -
+ cur_mbuf = (struct rte_mbuf *)xsk_umem__get_data(umem->buffer,
+ addr + umem->mb_pool->header_size);
+ cur_mbuf->data_off = offset - sizeof(struct rte_mbuf) -
rte_pktmbuf_priv_size(umem->mb_pool) -
umem->mb_pool->header_size;
- bufs[i]->port = rxq->port;
-
- rte_pktmbuf_pkt_len(bufs[i]) = len;
- rte_pktmbuf_data_len(bufs[i]) = len;
+ cur_mbuf->port = rxq->port;
+ cur_mbuf->next = NULL;
+ rte_pktmbuf_pkt_len(cur_mbuf) = len;
+ rte_pktmbuf_data_len(cur_mbuf) = len;
rx_bytes += len;
- }
+ if (new_packet) {
+ bufs[rcvd_pkts] = cur_mbuf;
+ bufs[rcvd_pkts]->nb_segs = 1;
+ rcvd_pkts++;
+ } else {
+ bufs[rcvd_pkts - 1]->nb_segs++;
+ bufs[rcvd_pkts - 1]->pkt_len += cur_mbuf->pkt_len;
+ pre_mbuf->next = cur_mbuf;
+ }
+
+ if (!eop) {
+ pre_mbuf = cur_mbuf;
+ }
+
+ new_packet = eop;
+ }
xsk_ring_cons__release(rx, nb_pkts);
(void)reserve_fill_queue(umem, nb_pkts, fq_bufs, fq);
@@ -386,7 +415,7 @@ af_xdp_rx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
rxq->stats.rx_pkts += nb_pkts;
rxq->stats.rx_bytes += rx_bytes;
- return nb_pkts;
+ return rcvd_pkts;
}
#else
static uint16_t
@@ -1679,6 +1708,10 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq,
cfg.bind_flags |= XDP_USE_NEED_WAKEUP;
#endif
+#if defined(XDP_USE_SG)
+ cfg.bind_flags |= XDP_USE_SG;
+#endif
+
/* Disable libbpf from loading XDP program */
if (internals->use_cni || internals->use_pinned_map)
cfg.libbpf_flags |= XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD;
--
2.33.0

View File

@ -1,6 +1,6 @@
Name: dpdk
Version: 21.11
Release: 71
Release: 72
Packager: packaging@6wind.com
URL: http://dpdk.org
%global source_version 21.11
@ -513,6 +513,7 @@ patch6477: 0477-ethdev-move-driver-interface-functions-to-its-own-fi.patch
patch6478: 0478-adapt-libbpf-0.8.0.patch
patch9479: 0479-config-arm-adapt-RTE_MAX_LCORE-to-640.patch
patch9480: 0480-af_xdp-support-recv-multi-buffer.patch
Summary: Data Plane Development Kit core
Group: System Environment/Libraries
@ -671,6 +672,9 @@ strip -g $RPM_BUILD_ROOT/lib/modules/%{kern_devel_ver}/extra/dpdk/igb_uio.ko
/usr/sbin/depmod
%changelog
* Fri Sep 27 2024 yangchen <yangchen145@huawei.com> - 21.11-72
af_xdp: support recv multi-buffer
* Fri Sep 27 2024 yangchen <yangchen145@huawei.com> - 21.11-71
config: arm adapt RTE_MAX_LCORE to 640