From 95abe11a926b5f17bd494c886255d5f48aa8e550 Mon Sep 17 00:00:00 2001 From: Lukas Sismis Date: Tue, 21 Mar 2023 10:22:33 +0100 Subject: [PATCH] dpdk: fix DPDK API change on NUMA/socket retrieval Ticket: #5923 --- src/runmode-dpdk.c | 30 +++++++++++++++++++++++++++--- src/source-dpdk.c | 6 ++++-- src/source-dpdk.h | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/runmode-dpdk.c b/src/runmode-dpdk.c index d2ca7207c56..c738cf61842 100644 --- a/src/runmode-dpdk.c +++ b/src/runmode-dpdk.c @@ -954,6 +954,24 @@ static void DeviceSetMTU(struct rte_eth_conf *port_conf, uint16_t mtu) #endif } +/** + * \param port_id - queried port + * \param socket_id - socket ID of the queried port + * \return positive number on success, negative on failure (errno) + */ +static int32_t DeviceSetSocketID(uint16_t port_id, int32_t *socket_id) +{ + rte_errno = 0; + int retval = rte_eth_dev_socket_id(port_id); + *socket_id = retval; + +#if RTE_VER_YEAR > 22 || RTE_VER_YEAR == 22 && RTE_VER_MONTH == 11 // DPDK API changed since 22.11 + retval = -rte_errno; +#endif + + return retval; +} + static void DeviceInitPortConf(const DPDKIfaceConfig *iconf, const struct rte_eth_dev_info *dev_info, struct rte_eth_conf *port_conf) { @@ -1150,7 +1168,14 @@ static int DeviceConfigureIPS(DPDKIfaceConfig *iconf) SCReturnInt(retval); } - if (rte_eth_dev_socket_id(iconf->port_id) != rte_eth_dev_socket_id(iconf->out_port_id)) { + int32_t out_port_socket_id; + retval = DeviceSetSocketID(iconf->port_id, &out_port_socket_id); + if (retval < 0) { + SCLogError("%s: invalid socket id (err=%d)", iconf->out_iface, retval); + SCReturnInt(retval); + } + + if (iconf->socket_id != out_port_socket_id) { SCLogWarning("%s: out iface %s is not on the same NUMA node", iconf->iface, iconf->out_iface); } @@ -1190,12 +1215,11 @@ static int DeviceConfigure(DPDKIfaceConfig *iconf) SCReturnInt(retval); } - retval = rte_eth_dev_socket_id(iconf->port_id); + retval = DeviceSetSocketID(iconf->port_id, &iconf->socket_id); if (retval < 0) { SCLogError("%s: invalid socket id (err=%d)", iconf->iface, retval); SCReturnInt(retval); } - iconf->socket_id = retval; retval = rte_eth_dev_info_get(iconf->port_id, &dev_info); if (retval != 0) { diff --git a/src/source-dpdk.c b/src/source-dpdk.c index 3537f7b8cea..60828c0b76f 100644 --- a/src/source-dpdk.c +++ b/src/source-dpdk.c @@ -121,6 +121,7 @@ typedef struct DPDKThreadVars_ { uint64_t dropped; uint16_t port_id; uint16_t queue_id; + int32_t port_socket_id; struct rte_mempool *pkt_mempool; struct rte_mbuf *received_mbufs[BURST_SIZE]; } DPDKThreadVars; @@ -473,15 +474,16 @@ static TmEcode ReceiveDPDKThreadInit(ThreadVars *tv, const void *initdata, void ptv->threads = dpdk_config->threads; ptv->port_id = dpdk_config->port_id; ptv->out_port_id = dpdk_config->out_port_id; + ptv->port_socket_id = dpdk_config->socket_id; // pass the pointer to the mempool and then forget about it. Mempool is freed in thread deinit. ptv->pkt_mempool = dpdk_config->pkt_mempool; dpdk_config->pkt_mempool = NULL; thread_numa = GetNumaNode(); - if (thread_numa >= 0 && thread_numa != rte_eth_dev_socket_id(ptv->port_id)) { + if (thread_numa >= 0 && thread_numa != ptv->port_socket_id) { SC_ATOMIC_ADD(dpdk_config->inconsitent_numa_cnt, 1); SCLogPerf("%s: NIC is on NUMA %d, thread on NUMA %d", dpdk_config->iface, - rte_eth_dev_socket_id(ptv->port_id), thread_numa); + ptv->port_socket_id, thread_numa); } uint16_t queue_id = SC_ATOMIC_ADD(dpdk_config->queue_id, 1); diff --git a/src/source-dpdk.h b/src/source-dpdk.h index 9a7d6500e4c..3fdb63cb35d 100644 --- a/src/source-dpdk.h +++ b/src/source-dpdk.h @@ -46,7 +46,7 @@ typedef struct DPDKIfaceConfig_ { #ifdef HAVE_DPDK char iface[RTE_ETH_NAME_MAX_LEN]; uint16_t port_id; - uint16_t socket_id; + int32_t socket_id; /* number of threads - zero means all available */ int threads; /* IPS mode */