[ovs-dev] [PATCH v2 3/3] dpdk: Use ovs-numa provided functions to manage thread affinity.

Ilya Maximets i.maximets at samsung.com
Mon Sep 2 13:15:37 UTC 2019


On 02.09.2019 16:09, David Marchand wrote:
> On Mon, Sep 2, 2019 at 1:27 PM Ilya Maximets <i.maximets at samsung.com> wrote:
>>
>> This allows to decrease code duplication and avoid using Linux-specific
>> functions (this might be useful in the future if we'll try to allow
>> running OvS+DPDK on FreeBSD).
>>
>> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
>> Acked-by: William Tu <u9012063 at gmail.com>
>> ---
>>  lib/dpdk.c | 27 ++++++++++++---------------
>>  1 file changed, 12 insertions(+), 15 deletions(-)
>>
>> diff --git a/lib/dpdk.c b/lib/dpdk.c
>> index fc58de55a..6f297d918 100644
>> --- a/lib/dpdk.c
>> +++ b/lib/dpdk.c
>> @@ -275,7 +275,7 @@ dpdk_init__(const struct smap *ovs_other_config)
>>      int result;
>>      bool auto_determine = true;
>>      int err = 0;
> 
> Nit: err can be removed.

It's used 2 times in this function.
We could only avoid initializing it here.

> 
> 
>> -    cpu_set_t cpuset;
>> +    struct ovs_numa_dump *affinity = NULL;
>>      struct svec args = SVEC_EMPTY_INITIALIZER;
>>
>>      log_stream = fopencookie(NULL, "w+", dpdk_log_func);
>> @@ -357,22 +357,22 @@ dpdk_init__(const struct smap *ovs_other_config)
>>       * lcore for the DPDK Master.
>>       */
>>      if (auto_determine) {
>> +        const struct ovs_numa_info_core *core;
>>          int cpu = 0;
>>
>>          /* Get the main thread affinity */
>> -        CPU_ZERO(&cpuset);
>> -        err = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t),
>> -                                     &cpuset);
>> -        if (!err) {
>> -            for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
>> -                if (CPU_ISSET(cpu, &cpuset)) {
>> -                    break;
>> +        affinity = ovs_numa_thread_getaffinity_dump();
>> +        if (affinity) {
>> +            cpu = INT_MAX;
>> +            FOR_EACH_CORE_ON_DUMP (core, affinity) {
>> +                if (cpu > core->core_id) {
>> +                    cpu = core->core_id;
>>                  }
>>              }
>>          } else {
>>              /* User did not set dpdk-lcore-mask and unable to get current
>>               * thread affintity - default to core #0 */
>> -            VLOG_ERR("Thread getaffinity error %d. Using core #0", err);
>> +            VLOG_ERR("Thread getaffinity failed. Using core #0");
>>          }
>>          svec_add(&args, "-l");
>>          svec_add_nocopy(&args, xasprintf("%d", cpu));
>> @@ -403,12 +403,9 @@ dpdk_init__(const struct smap *ovs_other_config)
>>      svec_destroy(&args);
>>
>>      /* Set the main thread affinity back to pre rte_eal_init() value */
>> -    if (auto_determine && !err) {
>> -        err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t),
>> -                                     &cpuset);
>> -        if (err) {
>> -            VLOG_ERR("Thread setaffinity error %d", err);
>> -        }
>> +    if (affinity) {
>> +        ovs_numa_thread_setaffinity_dump(affinity);
>> +        ovs_numa_dump_destroy(affinity);
>>      }
>>
>>      if (result < 0) {
>> --
>> 2.17.1
>>
> 
> Reviewed-by: David Marchand <david.marchand at redhat.com>
> 
> 
> --
> David Marchand
> 
> 


More information about the dev mailing list