From 89f184cd76ec6fd58ae0eb43e546e72154a624de Mon Sep 17 00:00:00 2001 From: Lukas Sismis Date: Tue, 25 Jul 2023 13:07:39 +0200 Subject: [PATCH 1/2] dpdk: fix DPDK thread check for IPS mode Ticket: #6233 --- src/runmode-dpdk.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/runmode-dpdk.c b/src/runmode-dpdk.c index 339344d14fa0..a3caeb5a902a 100644 --- a/src/runmode-dpdk.c +++ b/src/runmode-dpdk.c @@ -357,7 +357,6 @@ static int ConfigSetThreads(DPDKIfaceConfig *iconf, const char *entry_str) { SCEnter(); static int32_t remaining_auto_cpus = -1; - static uint32_t total_cpus = 0; if (!threading_set_cpu_affinity) { SCLogError("DPDK runmode requires configured thread affinity"); SCReturnInt(-EINVAL); @@ -432,12 +431,6 @@ static int ConfigSetThreads(DPDKIfaceConfig *iconf, const char *entry_str) SCReturnInt(-ERANGE); } - total_cpus += iconf->threads; - if (total_cpus > sched_cpus) { - SCLogError("Interfaces requested more cores than configured in the threading section"); - SCReturnInt(-ERANGE); - } - SCReturnInt(0); } @@ -801,6 +794,25 @@ static int ConfigLoad(DPDKIfaceConfig *iconf, const char *iface) SCReturnInt(0); } +static int32_t ConfigValidateThreads(uint16_t iface_threads) +{ + static uint32_t total_cpus = 0; + total_cpus += iface_threads; + ThreadsAffinityType *wtaf = GetAffinityTypeFromName("worker-cpu-set"); + if (wtaf == NULL) { + SCLogError("Specify worker-cpu-set list in the threading section"); + return -1; + } + if (total_cpus > UtilAffinityGetAffinedCPUNum(wtaf)) { + SCLogError("Interfaces requested more cores than configured in the threading section " + "(requested %d configured %d", + total_cpus, UtilAffinityGetAffinedCPUNum(wtaf)); + return -1; + } + + return 0; +} + static DPDKIfaceConfig *ConfigParse(const char *iface) { SCEnter(); @@ -811,7 +823,7 @@ static DPDKIfaceConfig *ConfigParse(const char *iface) ConfigInit(&iconf); retval = ConfigLoad(iconf, iface); - if (retval < 0) { + if (retval < 0 || ConfigValidateThreads(iconf->threads) != 0) { iconf->DerefFunc(iconf); SCReturnPtr(NULL, "void *"); } From 51abc53eed9cad8fc79e3070864b6088000cdc68 Mon Sep 17 00:00:00 2001 From: Lukas Sismis Date: Mon, 17 Jul 2023 11:33:18 +0200 Subject: [PATCH 2/2] dpdk: treat unknown socket ID as a valid socket ID Ticket: #6232 --- src/runmode-dpdk.c | 5 ++++- src/source-dpdk.c | 7 +++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/runmode-dpdk.c b/src/runmode-dpdk.c index a3caeb5a902a..5a934e8b9ed5 100644 --- a/src/runmode-dpdk.c +++ b/src/runmode-dpdk.c @@ -1073,7 +1073,7 @@ static void DeviceSetMTU(struct rte_eth_conf *port_conf, uint16_t mtu) /** * \param port_id - queried port * \param socket_id - socket ID of the queried port - * \return positive number on success, negative on failure (errno) + * \return non-negative number on success, negative on failure (errno) */ static int32_t DeviceSetSocketID(uint16_t port_id, int32_t *socket_id) { @@ -1083,6 +1083,9 @@ static int32_t DeviceSetSocketID(uint16_t port_id, int32_t *socket_id) #if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) // DPDK API changed since 22.11 retval = -rte_errno; +#else + if (retval == SOCKET_ID_ANY) + retval = 0; // DPDK couldn't determine socket ID of a port #endif return retval; diff --git a/src/source-dpdk.c b/src/source-dpdk.c index 363b718897c3..c5fe93c38abe 100644 --- a/src/source-dpdk.c +++ b/src/source-dpdk.c @@ -547,11 +547,10 @@ static TmEcode ReceiveDPDKThreadInit(ThreadVars *tv, const void *initdata, void DevicePostStartPMDSpecificActions(ptv, dev_info.driver_name); uint16_t inconsistent_numa_cnt = SC_ATOMIC_GET(dpdk_config->inconsitent_numa_cnt); - if (inconsistent_numa_cnt > 0) { + if (inconsistent_numa_cnt > 0 && ptv->port_socket_id != SOCKET_ID_ANY) { SCLogWarning("%s: NIC is on NUMA %d, %u threads on different NUMA node(s)", - dpdk_config->iface, rte_eth_dev_socket_id(ptv->port_id), inconsistent_numa_cnt); - } - if (ptv->port_socket_id == SOCKET_ID_ANY) { + dpdk_config->iface, ptv->port_socket_id, inconsistent_numa_cnt); + } else if (ptv->port_socket_id == SOCKET_ID_ANY) { SCLogNotice( "%s: unable to determine NIC's NUMA node, degraded performance can be expected", dpdk_config->iface);