[ovs-dev] [PATCH v2 1/1] dpif-netdev: The pmd-*-show commands will show info in core order

Eelco Chaudron echaudro at redhat.com
Tue May 9 07:03:59 UTC 2017


Please Ignore as it has the wrong sign-off header :(

//Eelco

On 09/05/17 09:00, Eelco Chaudron wrote:
> From: root <root at wsfd-netdev15.ntdv.lab.eng.bos.redhat.com>
>
> The "ovs-appctl dpif-netdev/pmd-rxq-show" and "ovs-appctl
> dpif-netdev/pmd-stats-show" commands show their output per core_id,
> sorted on the hash location. My OCD was kicking in when using these
> commands, hence this change to display them in natural core_id order.
>
> In addition I had to change a test case that would fail if the cores
> where not in order in the hash list. This is due to OVS assigning
> queues to cores based on the order in the hash list. The test case now
> checks if any core has the set of queues in the given order.
>
> Manually tested this on my setup, and ran clang-analyze.
>
> Signed-off-by: root <root at wsfd-netdev15.ntdv.lab.eng.bos.redhat.com>
> ---
>   lib/dpif-netdev.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>   tests/pmd.at      |  7 ++++---
>   2 files changed, 58 insertions(+), 4 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 4ee5d05..30aa5e9 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -922,13 +922,59 @@ 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 i, n;
>       enum pmd_info_type type = *(enum pmd_info_type *) aux;
>   
>       ovs_mutex_lock(&dp_netdev_mutex);
> @@ -947,7 +993,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 (i = 0; i < n; i++) {
> +        pmd = pmd_list[i];
> +        if (!pmd) {
> +            break;
> +        }
> +
>           if (type == PMD_INFO_SHOW_RXQ) {
>               pmd_info_show_rxq(&reply, pmd);
>           } else {
> @@ -970,6 +1022,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 2816d45..05755b3 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:]])




More information about the dev mailing list