From 74ac56673627165ec0b512c9e76ae5839a3c3358 Mon Sep 17 00:00:00 2001 From: Matias Elo Date: Wed, 11 Jun 2025 17:03:27 +0300 Subject: [PATCH 1/2] linux-gen: dpdk: increase minimum rx burst size DPDK receive burst size must be divisible by 8 to work with any driver, so increase minimum RX burst size to 8. Signed-off-by: Matias Elo --- platform/linux-generic/pktio/dpdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 35447a4c9a6..2ce0d73d20c 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -88,7 +88,7 @@ ODP_STATIC_ASSERT((DPDK_NB_MBUF % DPDK_MEMPOOL_CACHE_SIZE == 0) && , "DPDK mempool cache size failure"); /* Minimum RX burst size */ -#define DPDK_MIN_RX_BURST 4 +#define DPDK_MIN_RX_BURST 8 ODP_STATIC_ASSERT(DPDK_MIN_RX_BURST <= UINT8_MAX, "DPDK_MIN_RX_BURST too large"); From c6339bce773cd1d28237ab500d159bc9b3dd9988 Mon Sep 17 00:00:00 2001 From: Matias Elo Date: Wed, 11 Jun 2025 17:01:53 +0300 Subject: [PATCH 2/2] linux-gen: dpdk: fix crash with stopped pktio device Trying to receive or transmit packets after a DPDK device has been stopped is not allowed by DPDK. Fix this by moving rte_eth_dev_stop() to odp_pktio_close(). rte_eth_dev_stop() has to be called also inside odp_pktio_start() to enable reconfiguration. Signed-off-by: Matias Elo --- platform/linux-generic/pktio/dpdk.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 2ce0d73d20c..93efe632528 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright (c) 2016-2018 Linaro Limited - * Copyright (c) 2019-2023 Nokia + * Copyright (c) 2019-2025 Nokia */ #include @@ -1345,14 +1345,14 @@ static int dpdk_setup_eth_dev(pktio_entry_t *pktio_entry) static int dpdk_close(pktio_entry_t *pktio_entry) { pkt_dpdk_t *pkt_dpdk = pkt_priv(pktio_entry); - unsigned idx; - unsigned i, j; + + rte_eth_dev_stop(pkt_dpdk->port_id); /* Free cache packets */ - for (i = 0; i < ODP_PKTIN_MAX_QUEUES; i++) { - idx = pkt_dpdk->rx_cache[i].idx; + for (uint32_t i = 0; i < ODP_PKTIN_MAX_QUEUES; i++) { + uint8_t idx = pkt_dpdk->rx_cache[i].idx; - for (j = 0; j < pkt_dpdk->rx_cache[i].count; j++) + for (uint8_t j = 0; j < pkt_dpdk->rx_cache[i].count; j++) rte_pktmbuf_free(pkt_dpdk->rx_cache[i].pkt[idx++]); } @@ -2060,6 +2060,11 @@ static int dpdk_start(pktio_entry_t *pktio_entry) uint16_t port_id = pkt_dpdk->port_id; int ret; + /* Stop previously started DPDK device to enable reconfiguration */ + if (pktio_entry->state == PKTIO_STATE_STOPPED || + pktio_entry->state == PKTIO_STATE_STOP_PENDING) + rte_eth_dev_stop(port_id); + ret = rte_eth_dev_info_get(port_id, &dev_info); if (ret != 0) { _ODP_ERR("DPDK: rte_eth_dev_info_get() failed with return value: %d, port: %u\n", @@ -2124,10 +2129,8 @@ static int dpdk_start(pktio_entry_t *pktio_entry) return 0; } -static int dpdk_stop(pktio_entry_t *pktio_entry) +static int dpdk_stop(pktio_entry_t *pktio_entry ODP_UNUSED) { - rte_eth_dev_stop(pkt_priv(pktio_entry)->port_id); - return 0; }