diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index a67f3a1fa..bac51de8e 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -123,6 +123,22 @@ automatically. The processing cycles that have been stored for each rxq will be used where known to assign rxqs to pmd based on a round robin of the sorted rxqs. +For example, in the case where here there are 5 rxqs and 3 cores (e.g. 3,7,8) +available, and the measured usage of core cycles per rxq over the last +interval is seen to be: + +- Queue #0: 30% +- Queue #1: 80% +- Queue #3: 60% +- Queue #4: 70% +- Queue #5: 10% + +The rxqs will be assigned to cores 3,7,8 in the following order: + +Core 3: Q1 (80%) | +Core 7: Q4 (70%) | Q5 (10%) +core 8: Q3 (60%) | Q0 (30%) + Rxq to pmds assignment takes place whenever there are configuration changes. QoS diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 7331b0bdb..1b2dc9b3d 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3287,6 +3287,7 @@ struct rr_numa { int n_pmds; int cur_index; + bool idx_inc; }; static struct rr_numa * @@ -3343,13 +3344,37 @@ rr_numa_list_populate(struct dp_netdev *dp, struct rr_numa_list *rr) numa->n_pmds++; numa->pmds = xrealloc(numa->pmds, numa->n_pmds * sizeof *numa->pmds); numa->pmds[numa->n_pmds - 1] = pmd; + /* At least one pmd so initialise curr_idx and idx_inc. */ + numa->cur_index = 0; + numa->idx_inc = true; } } +/* Returns the next pmd from the numa node in + * incrementing or decrementing order. */ static struct dp_netdev_pmd_thread * rr_numa_get_pmd(struct rr_numa *numa) { - return numa->pmds[numa->cur_index++ % numa->n_pmds]; + int numa_idx = numa->cur_index; + + if (numa->idx_inc == true) { + /* Incrementing through list of pmds. */ + if (numa->cur_index == numa->n_pmds-1) { + /* Reached the last pmd. */ + numa->idx_inc = false; + } else { + numa->cur_index++; + } + } else { + /* Decrementing through list of pmds. */ + if (numa->cur_index == 0) { + /* Reached the first pmd. */ + numa->idx_inc = true; + } else { + numa->cur_index--; + } + } + return numa->pmds[numa_idx]; } static void diff --git a/tests/pmd.at b/tests/pmd.at index b6732eac5..e39a23a43 100644 --- a/tests/pmd.at +++ b/tests/pmd.at @@ -53,7 +53,7 @@ m4_define([CHECK_PMD_THREADS_CREATED], [ ]) m4_define([SED_NUMA_CORE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1\2:/"]) -m4_define([SED_NUMA_CORE_QUEUE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1\2:/;s/\(queue-id: \)0 2 4 6/\1/;s/\(queue-id: \)1 3 5 7/\1/"]) +m4_define([SED_NUMA_CORE_QUEUE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1\2:/;s/\(queue-id: \)1 2 5 6/\1/;s/\(queue-id: \)0 3 4 7/\1/"]) m4_define([DUMMY_NUMA], [--dummy-numa="0,0,0,0"]) AT_SETUP([PMD - creating a thread/add-port])