On 09/03/2016 09:38, "Aaron Conole" <acon...@redhat.com> wrote:

>The user has control over the DPDK internal lcore coremask, but this
>parameter can be autofilled with a bit more intelligence. If the user
>does not fill this parameter in, we use the lowest set bit in the
>current task CPU affinity. Otherwise, we will reassign the current
>thread to the specified lcore mask, in addition to the dpdk lcore
>threads.
>
>Signed-off-by: Aaron Conole <acon...@redhat.com>
>Tested-by: Sean K Mooney <sean.k.moo...@intel.com>
>Tested-by: RobertX Wojciechowicz <robertx.wojciechow...@intel.com>
>Tested-by: Kevin Traynor <kevin.tray...@intel.com>
>Acked-by: Panu Matilainen <pmati...@redhat.com>
>Acked-by: Kevin Traynor <kevin.tray...@intel.com>
>Acked-by: Flavio Leitner <f...@sysclose.org>
>---
>v2:
>* Fix a conditional branch coding standard issue
>* When lcore coremask is set, do not reset the affinities as
>  suggested by Kevin Traynor
>
>v3:
>* Fixed grow_argv calls
>* Fixed an error in argc assignment after 'break;' introduced
>  in v2
>* Switched to using xstrdup
>
>v4->v7:
>* No change
>
>v8:
>* Assign the lcore only when resetting the affinity.
>
>v9,v10:
>* No change
>
> lib/netdev-dpdk.c | 62
>++++++++++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 48 insertions(+), 14 deletions(-)
>
>diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>index 7e8e72e..289f916 100644
>--- a/lib/netdev-dpdk.c
>+++ b/lib/netdev-dpdk.c
>@@ -68,6 +68,7 @@ static struct vlog_rate_limit rl =
>VLOG_RATE_LIMIT_INIT(5, 20);
> #define OVS_VPORT_DPDK "ovs_dpdk"
> 
> #define MAX_DPDK_EXCL_OPTS 10
>+#define MAX_BUFSIZ 256

I would remove this, please see below

> 
> /*
>  * need to reserve tons of extra space in the mbufs so we can align the
>@@ -2770,7 +2771,6 @@ construct_dpdk_options(const struct
>ovsrec_open_vswitch *ovs_cfg,
>         {"dpdk-mem-channels", "-n", false, "4"},
>         {"dpdk-hugepage-dir", "--huge-dir", false, NULL},
>     };
>-
>     int i, ret = initial_size;
> 
>     /*First, construct from the flat-options (non-mutex)*/
>@@ -2848,9 +2848,10 @@ construct_dpdk_mutex_options(const struct
>ovsrec_open_vswitch *ovs_cfg,
> }
> 
> static int
>-get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv)
>+get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv,
>+              int argc)
> {
>-    int i = construct_dpdk_options(ovs_cfg, argv, 1);
>+    int i = construct_dpdk_options(ovs_cfg, argv, argc);
>     i = construct_dpdk_mutex_options(ovs_cfg, argv, i);
>     return i;
> }
>@@ -2874,7 +2875,8 @@ __dpdk_init(const struct ovsrec_open_vswitch
>*ovs_cfg)
> {
>     char **argv = NULL;
>     int result;
>-    int argc;
>+    int argc = 0, argc_tmp;
>+    bool auto_determine = true;
>     int err;
>     cpu_set_t cpuset;
> 
>@@ -2908,12 +2910,41 @@ __dpdk_init(const struct ovsrec_open_vswitch
>*ovs_cfg)
>         ovs_abort(0, "Thread getaffinity error %d.", err);
>     }
> 
>-    argv = grow_argv(&argv, 0, 1);
>+    argv = grow_argv(&argv, argc, argc+1);

I think "1" is better than "argc+1"

>     if (!argv) {
>         ovs_abort(0, "Unable to allocate an initial argv.");
>     }
>-    argv[0] = xstrdup("ovs"); /* TODO use prctl to get process name */
>-    argc = get_dpdk_args(ovs_cfg, &argv);
>+    argv[argc++] = xstrdup("ovs"); /* TODO use prctl to get process name
>*/
>+    argc_tmp = get_dpdk_args(ovs_cfg, &argv, argc);
>+
>+    while(argc_tmp != argc) {
>+        if (!strcmp("-c", argv[argc++])) {
>+            auto_determine = false;
>+            break;
>+        }
>+    }
>+    argc = argc_tmp;
>+
>+    /**
>+     * NOTE: This is an unsophisticated mechanism for determining the
>DPDK
>+     * lcore for the DPDK Master.
>+     */
>+    if (auto_determine) {
>+        int i;
>+        for (i = 0; i < CPU_SETSIZE; i++) {
>+            if (CPU_ISSET(i, &cpuset)) {
>+                char buf[MAX_BUFSIZ];
>+                snprintf(buf, MAX_BUFSIZ, "0x%08llX", (1ULL<<i));

please use xasprintf()

>+                argv = grow_argv(&argv, argc, 2);
>+                if (!argv) {
>+                    ovs_abort(0, "Unable to grow argv for coremask");
>+                }
>+                argv[argc++] = xstrdup("-c");
>+                argv[argc++] = xstrdup(buf);
>+                i = CPU_SETSIZE;
>+            }
>+        }
>+    }
> 
>     argv = grow_argv(&argv, argc, 1);
>     if (!argv) {
>@@ -2929,10 +2960,16 @@ __dpdk_init(const struct ovsrec_open_vswitch
>*ovs_cfg)
>         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) {
>-        ovs_abort(0, "Thread getaffinity error %d.", err);
>+    if (auto_determine) {
>+        /* 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) {
>+            ovs_abort(0, "Thread getaffinity error %d.", err);
>+        }
>+
>+        /* We are called from the main thread here */
>+        RTE_PER_LCORE(_lcore_id) = NON_PMD_CORE_ID;

This needs to be done in any case.  Every thread in OVS must have
lcore_id == NON_PMD_CORE_ID, except for the pmd threads.

>     }
> 
>     dpdk_argv = argv;
>@@ -2943,9 +2980,6 @@ __dpdk_init(const struct ovsrec_open_vswitch
>*ovs_cfg)
>     rte_memzone_dump(stdout);
>     rte_eal_init_ret = 0;
> 
>-    /* We are called from the main thread here */
>-    RTE_PER_LCORE(_lcore_id) = NON_PMD_CORE_ID;
>-
>     ovs_thread_create("dpdk_watchdog", dpdk_watchdog, NULL);
> 
> #ifdef VHOST_CUSE
>-- 
>2.5.0

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to