diff --git a/Documentation/topics/dpdk/pmd.rst b/Documentation/topics/dpdk/pmd.rst index caa7d97befb..1f61bddb6ec 100644 --- a/Documentation/topics/dpdk/pmd.rst +++ b/Documentation/topics/dpdk/pmd.rst @@ -237,9 +237,12 @@ If not set, the default variance improvement threshold is 25%. .. note:: - PMD Auto Load Balancing doesn't currently work if queues are assigned - cross NUMA as actual processing load could get worse after assignment - as compared to what dry run predicts. + PMD Auto Load Balancing doesn't request a reassignment if queues are + assigned cross NUMA and there are multiple NUMA nodes available for + reassignment. This is because reassignment to a different NUMA node could + lead to an unpredictable change in processing cycles required for a queue. + However, if there is only one cross NUMA node available then a dry run and + possible request to reassign may continue as normal. The minimum time between 2 consecutive PMD auto load balancing iterations can also be configured by:: diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 816945375bc..29e74ee4341 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -4887,6 +4887,12 @@ struct rr_numa { bool idx_inc; }; +static size_t +rr_numa_list_count(struct rr_numa_list *rr) +{ + return hmap_count(&rr->numas); +} + static struct rr_numa * rr_numa_list_lookup(struct rr_numa_list *rr, int numa_id) { @@ -5599,10 +5605,14 @@ get_dry_run_variance(struct dp_netdev *dp, uint32_t *core_list, for (int i = 0; i < n_rxqs; i++) { int numa_id = netdev_get_numa_id(rxqs[i]->port->netdev); numa = rr_numa_list_lookup(&rr, numa_id); + /* If there is no available pmd on the local numa but there is only one + * numa for cross-numa polling, we can estimate the dry run. */ + if (!numa && rr_numa_list_count(&rr) == 1) { + numa = rr_numa_list_next(&rr, NULL); + } if (!numa) { - /* Abort if cross NUMA polling. */ - VLOG_DBG("PMD auto lb dry run." - " Aborting due to cross-numa polling."); + VLOG_DBG("PMD auto lb dry run. Aborting due to " + "multiple numa nodes available for cross-numa polling."); goto cleanup; }