While adding of pmd interface with multiple queues several queues
may be assigned to one thread and this thread will be reloaded
one time for each added queue.

Signed-off-by: Ilya Maximets <i.maxim...@samsung.com>
---
 lib/dpif-netdev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 1b9793b..c477f2b 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -43,6 +43,7 @@
 #include "flow.h"
 #include "cmap.h"
 #include "coverage.h"
+#include "hmapx.h"
 #include "latch.h"
 #include "list.h"
 #include "match.h"
@@ -1139,7 +1140,10 @@ do_add_port(struct dp_netdev *dp, const char *devname, 
const char *type,
     if (netdev_is_pmd(netdev)) {
         int numa_id = netdev_get_numa_id(netdev);
         struct dp_netdev_pmd_thread *pmd;
+        struct hmapx to_reload;
+        struct hmapx_node *node;
 
+        hmapx_init(&to_reload);
         /* Cannot create pmd threads for invalid numa node. */
         ovs_assert(ovs_numa_numa_id_is_valid(numa_id));
 
@@ -1155,8 +1159,14 @@ do_add_port(struct dp_netdev *dp, const char *devname, 
const char *type,
             ovs_mutex_lock(&pmd->poll_mutex);
             dp_netdev_add_rxq_to_pmd(pmd, port, port->rxq[i]);
             ovs_mutex_unlock(&pmd->poll_mutex);
+
+            hmapx_add(&to_reload, pmd);
+        }
+        HMAPX_FOR_EACH (node, &to_reload) {
+            pmd = (struct dp_netdev_pmd_thread *)node->data;
             dp_netdev_reload_pmd__(pmd);
         }
+        hmapx_destroy(&to_reload);
     }
     seq_change(dp->port_seq);
 
-- 
2.5.0

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

Reply via email to