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