On Tue, Oct 14, 2014 at 10:01 AM, David Verbeiren
<[email protected]> wrote:
> 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 <[email protected]>
> Suggested-by: Maryam Tahhan <[email protected]>
I added tx lock to protect dpdk rind txq and did couple of cleanups
and pushed patch to master.
Thanks,
Pravin.
> ---
> 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
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev