DPDK rings don't need one queue per PMD thread and don't support multiple
queues (set_multiq function is undefined). To fix operation with DPDK rings,
this patch ignores EOPNOTSUPP error on netdev_set_multiq() and provides, for
DPDK rings, a netdev send() function that ignores the provided queue id
(= PMD thread core id).

Signed-off-by: David Verbeiren <david.verbei...@intel.com>
Suggested-by: Maryam Tahhan <maryam.tah...@intel.com>
---
Patch -> V2:
- Avoid testing type of netdev in send() by providing a different
send() function for DPDK rings, as suggested by Pravin.

 lib/dpif-netdev.c |  4 ++--
 lib/netdev-dpdk.c | 29 +++++++++++++++++++++++------
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index cea7c88..3ec115c 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -794,7 +794,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, 
const char *type,
         /* There can only be ovs_numa_get_n_cores() pmd threads,
          * so creates a txq for each. */
         error = netdev_set_multiq(netdev, n_cores, dp->n_dpdk_rxqs);
-        if (error) {
+        if (error && (error != EOPNOTSUPP)) {
             VLOG_ERR("%s, cannot set multiq", devname);
             return errno;
         }
@@ -1958,7 +1958,7 @@ dpif_netdev_pmd_set(struct dpif *dpif, unsigned int 
n_rxqs, const char *cmask)
                 /* Sets the new rx queue config.  */
                 err = netdev_set_multiq(port->netdev, ovs_numa_get_n_cores(),
                                         n_rxqs);
-                if (err) {
+                if (err && (err != EOPNOTSUPP)) {
                     VLOG_ERR("Failed to set dpdk interface %s rx_queue to:"
                              " %u", netdev_get_name(port->netdev),
                              n_rxqs);
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 9c93768..4d8db84 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -845,8 +845,8 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct 
dpif_packet ** pkts,
     }
 }
 
-static int
-netdev_dpdk_send(struct netdev *netdev, int qid, struct dpif_packet **pkts,
+static inline int
+netdev_dpdk_send__(struct netdev *netdev, int qid, struct dpif_packet **pkts,
                  int cnt, bool may_steal)
 {
     struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
@@ -900,6 +900,13 @@ netdev_dpdk_send(struct netdev *netdev, int qid, struct 
dpif_packet **pkts,
 }
 
 static int
+netdev_dpdk_eth_send(struct netdev *netdev, int qid, struct dpif_packet **pkts,
+                 int cnt, bool may_steal)
+{
+    netdev_dpdk_send__(netdev, qid, pkts, cnt, may_steal);
+}
+
+static int
 netdev_dpdk_set_etheraddr(struct netdev *netdev,
                           const uint8_t mac[ETH_ADDR_LEN])
 {
@@ -1355,6 +1362,14 @@ dpdk_ring_open(const char dev_name[], unsigned int 
*eth_port_id) OVS_REQUIRES(dp
 }
 
 static int
+netdev_dpdk_ring_send(struct netdev *netdev, int qid, struct dpif_packet 
**pkts,
+                 int cnt, bool may_steal)
+{
+    netdev_dpdk_send__(netdev, 0 /* DPDK Rings have a single TX queue */,
+                        pkts, cnt, may_steal);
+}
+
+static int
 netdev_dpdk_ring_construct(struct netdev *netdev)
 {
     unsigned int port_no = 0;
@@ -1378,7 +1393,7 @@ unlock_dpdk:
     return err;
 }
 
-#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, MULTIQ)      \
+#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, MULTIQ, SEND)      \
 {                                                             \
     NAME,                                                     \
     INIT,                       /* init */                    \
@@ -1395,7 +1410,7 @@ unlock_dpdk:
     netdev_dpdk_get_numa_id,    /* get_numa_id */             \
     MULTIQ,                     /* set_multiq */              \
                                                               \
-    netdev_dpdk_send,           /* send */                    \
+    SEND,                       /* send */                    \
     NULL,                       /* send_wait */               \
                                                               \
     netdev_dpdk_set_etheraddr,                                \
@@ -1481,14 +1496,16 @@ const struct netdev_class dpdk_class =
         "dpdk",
         dpdk_class_init,
         netdev_dpdk_construct,
-        netdev_dpdk_set_multiq);
+        netdev_dpdk_set_multiq,
+        netdev_dpdk_eth_send);
 
 const struct netdev_class dpdk_ring_class =
     NETDEV_DPDK_CLASS(
         "dpdkr",
         NULL,
         netdev_dpdk_ring_construct,
-        NULL);
+        NULL,
+        netdev_dpdk_ring_send);
 
 void
 netdev_dpdk_register(void)
-- 
1.8.3.2

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

Reply via email to