diff options
-rw-r--r-- | lib/dpif-netdev.c | 56 | ||||
-rw-r--r-- | tests/pmd.at | 7 |
2 files changed, 58 insertions, 5 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 6ca6c89a4..b50164bee 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -924,13 +924,58 @@ pmd_info_show_rxq(struct ds *reply, struct dp_netdev_pmd_thread *pmd) } } +static int +compare_poll_thread_list(const void *a_, const void *b_) +{ + const struct dp_netdev_pmd_thread *a, *b; + + a = *(struct dp_netdev_pmd_thread **)a_; + b = *(struct dp_netdev_pmd_thread **)b_; + + if (a->core_id < b->core_id) { + return -1; + } + if (a->core_id > b->core_id) { + return 1; + } + return 0; +} + +/* Create a sorted list of pmd's from the dp->poll_threads cmap. We can use + * this list, as long as we do not go to quiescent state. */ +static void +sorted_poll_thread_list(struct dp_netdev *dp, + struct dp_netdev_pmd_thread ***list, + size_t *n) +{ + struct dp_netdev_pmd_thread *pmd; + struct dp_netdev_pmd_thread **pmd_list; + size_t k = 0, n_pmds; + + n_pmds = cmap_count(&dp->poll_threads); + pmd_list = xcalloc(n_pmds, sizeof *pmd_list); + + CMAP_FOR_EACH (pmd, node, &dp->poll_threads) { + if (k >= n_pmds) { + break; + } + pmd_list[k++] = pmd; + } + + qsort(pmd_list, k, sizeof *pmd_list, compare_poll_thread_list); + + *list = pmd_list; + *n = k; +} + static void dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], void *aux) { struct ds reply = DS_EMPTY_INITIALIZER; - struct dp_netdev_pmd_thread *pmd; + struct dp_netdev_pmd_thread **pmd_list; struct dp_netdev *dp = NULL; + size_t n; enum pmd_info_type type = *(enum pmd_info_type *) aux; ovs_mutex_lock(&dp_netdev_mutex); @@ -949,7 +994,13 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], return; } - CMAP_FOR_EACH (pmd, node, &dp->poll_threads) { + sorted_poll_thread_list(dp, &pmd_list, &n); + for (size_t i = 0; i < n; i++) { + struct dp_netdev_pmd_thread *pmd = pmd_list[i]; + if (!pmd) { + break; + } + if (type == PMD_INFO_SHOW_RXQ) { pmd_info_show_rxq(&reply, pmd); } else { @@ -972,6 +1023,7 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], } } } + free(pmd_list); ovs_mutex_unlock(&dp_netdev_mutex); diff --git a/tests/pmd.at b/tests/pmd.at index 2816d45cd..05755b3f7 100644 --- a/tests/pmd.at +++ b/tests/pmd.at @@ -53,6 +53,7 @@ m4_define([CHECK_PMD_THREADS_CREATED], [ ]) m4_define([SED_NUMA_CORE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1<cleared>\2<cleared>:/"]) +m4_define([SED_NUMA_CORE_QUEUE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1<cleared>\2<cleared>:/;s/\(queue-id: \)\(0 2 4 6\|1 3 5 7\)/\1<cleared>/"]) m4_define([DUMMY_NUMA], [--dummy-numa="0,0,0,0"]) AT_SETUP([PMD - creating a thread/add-port]) @@ -126,13 +127,13 @@ TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]]) AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x3]) CHECK_PMD_THREADS_CREATED([2], [], [+$TMP]) -AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl +AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_QUEUE_PATTERN], [0], [dnl pmd thread numa_id <cleared> core_id <cleared>: isolated : false - port: p0 queue-id: 0 2 4 6 + port: p0 queue-id: <cleared> pmd thread numa_id <cleared> core_id <cleared>: isolated : false - port: p0 queue-id: 1 3 5 7 + port: p0 queue-id: <cleared> ]) TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]]) |