[ovs-dev] [PATCH] INSTALL.DPDK.md: Clarify DPDK arguments.

Zoltan Kiss zoltan.kiss at linaro.org
Mon Dec 14 18:31:36 UTC 2015



On 14/12/15 17:35, Traynor, Kevin wrote:
> How about letting the control threads just float on the non-isolcpu'd cores.
> We could then potentially remove the -c argument which would simplify
> setup as the user would only need to think about one mask - pmd-cpu-mask
> (which of course we could also default).
>
> Strawman for it would be something like this...

Seems good, assuming that the thread affinity at the time dpdk_init() 
was called reflects what cores are allowed for non-PMD threads. And what 
if the user wants to change that later?

>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index e3a0771..031f405 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -2135,12 +2135,15 @@ process_vhost_flags(char *flag, char *default_val, int size,
>   int
>   dpdk_init(int argc, char **argv)
>   {
>       int result;
>       int base = 0;
>       char *pragram_name = argv[0];
> +    int err;
> +    int isset;
> +    cpu_set_t cpuset;
>
>       if (argc < 2 || strcmp(argv[1], "--dpdk"))
>           return 0;
>
>       /* Remove the --dpdk argument from arg list.*/
>       argc--;
> @@ -2176,23 +2179,51 @@ dpdk_init(int argc, char **argv)
>            */
>           argc -= 2;
>           argv += 2;    /* Increment by two to bypass the vhost flag arguments */
>           base = 2;
>       }
>
> +    /*NOTE: Assumes -c option removed from cmdline/db etc. */
> +
> +    /* Get the main thread affinity */
> +    CPU_ZERO(&cpuset);
> +    err = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
> +    if (err) {
> +        VLOG_ERR("Thread getaffinity error %d",err);
> +        return err;
> +    }
> +
> +    /* Extract lowest core affinity and set the -c */
> +    for (i = 0; i < CPU_SETSIZE; i++) {
> +        isset = CPU_ISSET(i, &cpuset);
> +        if (isset) {
> +            /* TODO: check for any numa inconsistencies with memory and embedded -c
> +             * option in argv for rte_eal_init() */
> +            break;
> +        }
> +    }
> +
>       /* Keep the program name argument as this is needed for call to
>        * rte_eal_init()
>        */
>       argv[0] = pragram_name;
>
>       /* Make sure things are initialized ... */
>       result = rte_eal_init(argc, argv);
>       if (result < 0) {
>           ovs_abort(result, "Cannot init EAL");
>       }
>
> +    /* Set the main thread affinity back to pre rte_eal_init() value */
> +    err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
> +    if (err) {
> +        VLOG_ERR("Thread setaffinity error %d",err);
> +        return err;
> +    }



More information about the dev mailing list