That's a bad race condition, thanks for reporting it!

Regarding the fix, I agree that reloading the threads would
restore the correct mapping, but it would still allow
the threads to run with the incorrect mapping for a brief
interval.

How about postponing the actual threads creation until all
the pmds are configured?

Something like:

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 79c4612..26d9f1f 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2961,6 +2961,7 @@ dp_netdev_set_pmds_on_numa(struct dp_netdev *dp, int
numa_id)
      * pmd threads for the numa node. */
     if (!n_pmds) {
         int can_have, n_unpinned, i;
+        struct dp_netdev_pmd_thread *pmd;

         n_unpinned = ovs_numa_get_n_unpinned_cores_on_numa(numa_id);
         if (!n_unpinned) {
@@ -2973,13 +2974,22 @@ dp_netdev_set_pmds_on_numa(struct dp_netdev *dp,
int numa_id)
          * tries creating NR_PMD_THREADS pmd threads. */
         can_have = dp->pmd_cmask ? n_unpinned : MIN(n_unpinned,
NR_PMD_THREADS);
         for (i = 0; i < can_have; i++) {
-            struct dp_netdev_pmd_thread *pmd = xzalloc(sizeof *pmd);
             unsigned core_id =
ovs_numa_get_unpinned_core_on_numa(numa_id);

+            pmd = xzalloc(sizeof *pmd);
             dp_netdev_configure_pmd(pmd, dp, i, core_id, numa_id);
-            /* Each thread will distribute all devices rx-queues among
-             * themselves. */
-            pmd->thread = ovs_thread_create("pmd", pmd_thread_main, pmd);
+        }
+
+        /* The pmd thread code needs to see all the others configured pmd
+         * threads on the same numa node.  That's why we call
+         * 'dp_netdev_configure_pmd()' on all the threads and then we
actually
+         * start them. */
+        CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
+            if (pmd->numa_id == numa_id) {
+                /* Each thread will distribute all devices rx-queues among
+                 * themselves. */
+                pmd->thread = ovs_thread_create("pmd", pmd_thread_main,
pmd);
+            }
         }
         VLOG_INFO("Created %d pmd threads on numa node %d", can_have,
numa_id);
     }


What do you think?

Thanks!

On 24/07/2015 12:18, "Ilya Maximets" <i.maxim...@samsung.com> wrote:

>Currently pmd threads select queues in pmd_load_queues() according to
>get_n_pmd_threads_on_numa(). This behavior leads to race between pmds,
>beacause dp_netdev_set_pmds_on_numa() starts them one by one and
>current number of threads changes incrementally.
>
>As a result we may have the following situation with 2 pmd threads:
>
>* dp_netdev_set_pmds_on_numa()
>* pmd12 thread started. Currently only 1 pmd thread exists.
>dpif_netdev(pmd12)|INFO|Core 1 processing port 'port_1'
>dpif_netdev(pmd12)|INFO|Core 1 processing port 'port_2'
>* pmd14 thread started. 2 pmd threads exists.
>dpif_netdev|INFO|Created 2 pmd threads on numa node 0
>dpif_netdev(pmd14)|INFO|Core 2 processing port 'port_2'
>
>We have:
>core 1 --> port 1, port 2
>core 2 --> port 2
>
>Fix this by reloading all pmds to get right port mapping.
>
>If we reload pmds, we'll have:
>core 1 --> port 1
>core 2 --> port 2
>
>Cc: Dyasly Sergey <s.dya...@samsung.com>
>Signed-off-by: Ilya Maximets <i.maxim...@samsung.com>
>---
> lib/dpif-netdev.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
>diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>index 2958d52..fd700f9 100644
>--- a/lib/dpif-netdev.c
>+++ b/lib/dpif-netdev.c
>@@ -1127,10 +1127,9 @@ do_add_port(struct dp_netdev *dp, const char
>*devname, const char *type,
>     ovs_refcount_init(&port->ref_cnt);
>     cmap_insert(&dp->ports, &port->node, hash_port_no(port_no));
> 
>-    if (netdev_is_pmd(netdev)) {
>+    if (netdev_is_pmd(netdev))
>         dp_netdev_set_pmds_on_numa(dp, netdev_get_numa_id(netdev));
>-        dp_netdev_reload_pmds(dp);
>-    }
>+
>     seq_change(dp->port_seq);
> 
>     return 0;
>@@ -2978,6 +2977,7 @@ dp_netdev_set_pmds_on_numa(struct dp_netdev *dp,
>int numa_id)
>             pmd->thread = ovs_thread_create("pmd", pmd_thread_main, pmd);
>         }
>         VLOG_INFO("Created %d pmd threads on numa node %d", can_have,
>numa_id);
>+        dp_netdev_reload_pmds(dp);
>     }
> }
> 
>-- 
>2.1.4
>
>_______________________________________________
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Sm
>B5nZacmXNq0gKCC1s_Cw5yUNjxgD4v5kJqZ2uWLlE&m=YcYFmCgJtVWAOpEYl7OaM4nqi7maE7
>XOiMnLOpnugHY&s=Zf_P-5VtI2yJNO-f1ZXolxD5syuhr7WdbyNvdwH3zQM&e= 

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

Reply via email to