[ovs-dev] [PATCH v4] Update relevant artifacts to add support for DPDK 17.05.1.

Darrell Ball dball at vmware.com
Sat Jul 29 01:30:42 UTC 2017



-----Original Message-----
From: <ovs-dev-bounces at openvswitch.org> on behalf of Michal Weglicki <michalx.weglicki at intel.com>
Date: Tuesday, July 25, 2017 at 5:34 AM
To: "dev at openvswitch.org" <dev at openvswitch.org>
Subject: [ovs-dev] [PATCH v4] Update relevant artifacts to add support for	DPDK 17.05.1.

    Upgrading to DPDK 17.05.1 stable release adds new
    significant features relevant to OVS, including,
    but not limited to:
    - tun/tap PMD,
    - VFIO hotplug support,
    - Generic flow API.
    
    Following changes are applied:
    - netdev-dpdk: Changes required by DPDK API modifications.
    - doc: Because of DPDK API changes, backward compatibility
      with previous DPDK releases will be broken, thus all
      relevant documentation entries are updated.
    - .travis: DPDK version change from 16.11.1 to 17.05.1.
    - rhel/openvswitch-fedora.spec.in: DPDK version change
      from 16.11 to 17.05.1
    
    v1->v2: Patch rebase.
    v2->v3: Fixed wrong formating after v2 patch rebase.
    v3->v4: Minor documentation changes.
    
    Signed-off-by: Michal Weglicki <michalx.weglicki at intel.com>
    Reviewed-by: Aaron Conole <aconole at redhat.com>
    ---
     .travis/linux-build.sh                   |   2 +-
     Documentation/faq/releases.rst           |   1 +
     Documentation/howto/dpdk.rst             |   6 +-
     Documentation/intro/install/dpdk.rst     |  14 +--
     Documentation/topics/dpdk/vhost-user.rst |  12 +--
     NEWS                                     |   1 +
     lib/netdev-dpdk.c                        | 144 +++++++++++++++++++------------
     rhel/openvswitch-fedora.spec.in          |   2 +-
     tests/dpdk/ring_client.c                 |   6 +-
     9 files changed, 114 insertions(+), 74 deletions(-)
    
    diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
    index f66b534..efccdf1 100755
    --- a/.travis/linux-build.sh
    +++ b/.travis/linux-build.sh
    @@ -80,7 +80,7 @@ fi
     
     if [ "$DPDK" ]; then
         if [ -z "$DPDK_VER" ]; then
    -        DPDK_VER="16.11.2"
    +        DPDK_VER="17.05.1"
         fi
         install_dpdk $DPDK_VER
         if [ "$CC" = "clang" ]; then
    diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst
    index 707834b..2ecc24c 100644
    --- a/Documentation/faq/releases.rst
    +++ b/Documentation/faq/releases.rst
    @@ -161,6 +161,7 @@ Q: What DPDK version does each Open vSwitch release work with?
         2.5.x        2.2
         2.6.x        16.07.2
         2.7.x        16.11.2
    +    2.8.x        17.05.1
         ============ =======
     
     Q: I get an error like this when I configure Open vSwitch:
    diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst
    index af01d3e..1756c8c 100644
    --- a/Documentation/howto/dpdk.rst
    +++ b/Documentation/howto/dpdk.rst
    @@ -528,15 +528,15 @@ described in :ref:`dpdk-testpmd`. Once compiled, run the application::
     
     When you finish testing, bind the vNICs back to kernel::
     
    -    $ $DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:03.0
    -    $ $DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:04.0
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py --bind=virtio-pci 0000:00:03.0
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py --bind=virtio-pci 0000:00:04.0
     
     .. note::
     
       Valid PCI IDs must be passed in above example. The PCI IDs can be retrieved
       like so::
     
    -      $ $DPDK_DIR/tools/dpdk-devbind.py --status
    +      $ $DPDK_DIR/usertools/dpdk-devbind.py --status
     
     More information on the dpdkvhostuser ports can be found in
     :doc:`/topics/dpdk/vhost-user`.

[Darrell]
While dealing with something else, I noticed that this file has an outdated reference,
as of OVS 2.8/DPDK 17.05.1, to VFIO not supporting hotplug. Specifically, the text 

“This feature is not supported with VFIO” under “Port Hotplug”

It will be removed unless someone objects.

//////////////////



    diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
    index a05aa1a..20baa63 100644
    --- a/Documentation/intro/install/dpdk.rst
    +++ b/Documentation/intro/install/dpdk.rst
    @@ -40,7 +40,7 @@ Build requirements
     In addition to the requirements described in :doc:`general`, building Open
     vSwitch with DPDK will require the following:
     
    -- DPDK 16.11
    +- DPDK 17.05.1
     
     - A `DPDK supported NIC`_
     
    @@ -69,9 +69,9 @@ Install DPDK
     #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
     
            $ cd /usr/src/
    -       $ wget https://urldefense.proofpoint.com/v2/url?u=http-3A__fast.dpdk.org_rel_dpdk-2D16.11.2.tar.xz&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=MP_pr-aH-lrKfYN45gHDyPQ6aLBg5TGAW1UPDDHkAN4&e= 
    -       $ tar xf dpdk-16.11.2.tar.xz
    -       $ export DPDK_DIR=/usr/src/dpdk-stable-16.11.2
    +       $ wget https://urldefense.proofpoint.com/v2/url?u=http-3A__fast.dpdk.org_rel_dpdk-2D17.05.1.tar.xz&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=f_ilq_XNBOLxaVzU1zrEm3tSh6IUZ3RVzXBuLrVpE6Y&e= 
    +       $ tar xf dpdk-17.05.1.tar.xz
    +       $ export DPDK_DIR=/usr/src/dpdk-stable-17.05.1
            $ cd $DPDK_DIR
     
     #. (Optional) Configure DPDK as a shared library
    @@ -187,8 +187,8 @@ to the VFIO driver::
         $ modprobe vfio-pci
         $ /usr/bin/chmod a+x /dev/vfio
         $ /usr/bin/chmod 0666 /dev/vfio/*
    -    $ $DPDK_DIR/tools/dpdk-devbind.py --bind=vfio-pci eth1
    -    $ $DPDK_DIR/tools/dpdk-devbind.py --status
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci eth1
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py --status
     
     Setup OVS
     ~~~~~~~~~
    @@ -569,7 +569,7 @@ Limitations
       The latest list of validated firmware versions can be found in the `DPDK
       release notes`_.
     
    -.. _DPDK release notes: https://urldefense.proofpoint.com/v2/url?u=http-3A__dpdk.org_doc_guides_rel-5Fnotes_release-5F16-5F11.html&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=uw1pYUVE7Qnihq-7TAAFR9r9HMSdL2yzngjzsGsKoJU&e= 
    +.. _DPDK release notes: https://urldefense.proofpoint.com/v2/url?u=http-3A__dpdk.org_doc_guides_rel-5Fnotes_release-5F17-5F05.html&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=OhIAq2Irg3Wp6bSBdFXP7izvHmzjJNN7zaMYYDat5t0&e= 
     
     Reporting Bugs
     --------------
    diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
    index e76da5f..a3d5de3 100644
    --- a/Documentation/topics/dpdk/vhost-user.rst
    +++ b/Documentation/topics/dpdk/vhost-user.rst
    @@ -292,9 +292,9 @@ To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or
     DPDK sources to VM and build DPDK::
     
         $ cd /root/dpdk/
    -    $ wget https://urldefense.proofpoint.com/v2/url?u=http-3A__fast.dpdk.org_rel_dpdk-2D16.11.2.tar.xz&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=MP_pr-aH-lrKfYN45gHDyPQ6aLBg5TGAW1UPDDHkAN4&e= 
    -    $ tar xf dpdk-16.11.2.tar.xz
    -    $ export DPDK_DIR=/root/dpdk/dpdk-stable-16.11.2
    +    $ wget https://urldefense.proofpoint.com/v2/url?u=http-3A__fast.dpdk.org_rel_dpdk-2D17.05.1.tar.xz&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=f_ilq_XNBOLxaVzU1zrEm3tSh6IUZ3RVzXBuLrVpE6Y&e= 
    +    $ tar xf dpdk-17.05.1.tar.xz
    +    $ export DPDK_DIR=/root/dpdk/dpdk-stable-17.05.1
         $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
         $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
         $ cd $DPDK_DIR
    @@ -314,8 +314,8 @@ Setup huge pages and DPDK devices using UIO::
         $ mount -t hugetlbfs hugetlbfs /dev/hugepages  # only if not already mounted
         $ modprobe uio
         $ insmod $DPDK_BUILD/kmod/igb_uio.ko
    -    $ $DPDK_DIR/tools/dpdk-devbind.py --status
    -    $ $DPDK_DIR/tools/dpdk-devbind.py -b igb_uio 00:03.0 00:04.0
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py --status
    +    $ $DPDK_DIR/usertools/dpdk-devbind.py -b igb_uio 00:03.0 00:04.0
     
     .. note::
     
    @@ -378,7 +378,7 @@ Sample XML
             </disk>
             <disk type='dir' device='disk'>
               <driver name='qemu' type='fat'/>
    -          <source dir='/usr/src/dpdk-stable-16.11.2'/>
    +          <source dir='/usr/src/dpdk-stable-17.05.1'/>
               <target dev='vdb' bus='virtio'/>
               <readonly/>
             </disk>
    diff --git a/NEWS b/NEWS
    index d61fc5f..3f58e8b 100644
    --- a/NEWS
    +++ b/NEWS
    @@ -21,6 +21,7 @@ Post-v2.7.0
            still can be configured via extra arguments for DPDK EAL.
          * dpdkvhostuser ports are marked as deprecated.  They will be removed
            in an upcoming release.
    +     * Support for DPDK v17.05.1.
        - IPFIX now provides additional counters:
          * Total counters since metering process startup.
          * Per-flow TCP flag counters.
    diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
    index ea17b97..5e767e1 100644
    --- a/lib/netdev-dpdk.c
    +++ b/lib/netdev-dpdk.c
    @@ -22,6 +22,9 @@
     #include <stdlib.h>
     #include <errno.h>
     #include <unistd.h>
    +#include <linux/virtio_net.h>
    +#include <sys/socket.h>
    +#include <linux/if.h>
     
     #include <rte_config.h>
     #include <rte_cycles.h>
    @@ -31,7 +34,7 @@
     #include <rte_malloc.h>
     #include <rte_mbuf.h>
     #include <rte_meter.h>
    -#include <rte_virtio_net.h>
    +#include <rte_vhost.h>
     
     #include "dirs.h"
     #include "dp-packet.h"
    @@ -56,6 +59,8 @@
     #include "timeval.h"
     #include "unixctl.h"
     
    +enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
    +
     VLOG_DEFINE_THIS_MODULE(netdev_dpdk);
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
     
    @@ -171,6 +176,21 @@ static const struct rte_eth_conf port_conf = {
         },
     };
     
    +/*
    + * These callbacks allow virtio-net devices to be added to vhost ports when
    + * configuration has been fully completed.
    + */
    +static int new_device(int vid);
    +static void destroy_device(int vid);
    +static int vring_state_changed(int vid, uint16_t queue_id, int enable);
    +static const struct vhost_device_ops virtio_net_device_ops =
    +{
    +    .new_device =  new_device,
    +    .destroy_device = destroy_device,
    +    .vring_state_changed = vring_state_changed,
    +    .features_changed = NULL
    +};
    +
     enum { DPDK_RING_SIZE = 256 };
     BUILD_ASSERT_DECL(IS_POW2(DPDK_RING_SIZE));
     enum { DRAIN_TSC = 200000ULL };
    @@ -412,8 +432,8 @@ struct netdev_rxq_dpdk {
         dpdk_port_t port_id;
     };
     
    -static int netdev_dpdk_class_init(void);
    -static int netdev_dpdk_vhost_class_init(void);
    +static void netdev_dpdk_destruct(struct netdev *netdev);
    +static void netdev_dpdk_vhost_destruct(struct netdev *netdev);
     
     int netdev_dpdk_get_vid(const struct netdev_dpdk *dev);
     
    @@ -423,8 +443,8 @@ netdev_dpdk_get_ingress_policer(const struct netdev_dpdk *dev);
     static bool
     is_dpdk_class(const struct netdev_class *class)
     {
    -    return class->init == netdev_dpdk_class_init
    -           || class->init == netdev_dpdk_vhost_class_init;
    +    return class->destruct == netdev_dpdk_destruct
    +           || class->destruct == netdev_dpdk_vhost_destruct;
     }
     
     /* DPDK NIC drivers allocate RX buffers at a particular granularity, typically
    @@ -948,13 +968,45 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
         if (err) {
             VLOG_ERR("vhost-user socket device setup failure for socket %s\n",
                      dev->vhost_id);
    +        goto out;
         } else {
             fatal_signal_add_file_to_unlink(dev->vhost_id);
             VLOG_INFO("Socket %s created for vhost-user port %s\n",
                       dev->vhost_id, name);
         }
    +
    +    err = rte_vhost_driver_callback_register(dev->vhost_id,
    +                                                &virtio_net_device_ops);
    +    if (err) {
    +        VLOG_ERR("rte_vhost_driver_callback_register failed for vhost user "
    +                 "port: %s\n", name);
    +        goto out;
    +    }
    +
    +    err = rte_vhost_driver_disable_features(dev->vhost_id,
    +                                1ULL << VIRTIO_NET_F_HOST_TSO4
    +                                | 1ULL << VIRTIO_NET_F_HOST_TSO6
    +                                | 1ULL << VIRTIO_NET_F_CSUM);
    +    if (err) {
    +        VLOG_ERR("rte_vhost_driver_disable_features failed for vhost user "
    +                 "port: %s\n", name);
    +        goto out;
    +    }
    +
    +    err = rte_vhost_driver_start(dev->vhost_id);
    +    if (err) {
    +        VLOG_ERR("rte_vhost_driver_start failed for vhost user "
    +                 "port: %s\n", name);
    +        goto out;
    +    }
    +
         err = vhost_common_construct(netdev);
    +    if (err) {
    +        VLOG_ERR("vhost_common_construct failed for vhost user "
    +                 "port: %s\n", name);
    +    }
     
    +out:
         ovs_mutex_unlock(&dpdk_mutex);
         VLOG_WARN_ONCE("dpdkvhostuser ports are considered deprecated;  "
                        "please migrate to dpdkvhostuserclient ports.");
    @@ -968,6 +1020,10 @@ netdev_dpdk_vhost_client_construct(struct netdev *netdev)
     
         ovs_mutex_lock(&dpdk_mutex);
         err = vhost_common_construct(netdev);
    +    if (err) {
    +        VLOG_ERR("vhost_common_construct failed for vhost user client"
    +                 "port: %s\n", netdev->name);
    +    }
         ovs_mutex_unlock(&dpdk_mutex);
         return err;
     }
    @@ -2456,12 +2512,9 @@ static void
     set_irq_status(int vid)
     {
         uint32_t i;
    -    uint64_t idx;
     
    -    for (i = 0; i < rte_vhost_get_queue_num(vid); i++) {
    -        idx = i * VIRTIO_QNUM;
    -        rte_vhost_enable_guest_notification(vid, idx + VIRTIO_RXQ, 0);
    -        rte_vhost_enable_guest_notification(vid, idx + VIRTIO_TXQ, 0);
    +    for (i = 0; i < rte_vhost_get_vring_num(vid); i++) {
    +        rte_vhost_enable_guest_notification(vid, i, 0);
         }
     }
     
    @@ -2524,7 +2577,7 @@ new_device(int vid)
         LIST_FOR_EACH(dev, list_node, &dpdk_list) {
             ovs_mutex_lock(&dev->mutex);
             if (strncmp(ifname, dev->vhost_id, IF_NAME_SZ) == 0) {
    -            uint32_t qp_num = rte_vhost_get_queue_num(vid);
    +            uint32_t qp_num = rte_vhost_get_vring_num(vid)/VIRTIO_QNUM;
     
                 /* Get NUMA information */
                 newnode = rte_vhost_get_numa_node(vid);
    @@ -2691,27 +2744,6 @@ netdev_dpdk_get_ingress_policer(const struct netdev_dpdk *dev)
         return ovsrcu_get(struct ingress_policer *, &dev->ingress_policer);
     }
     
    -/*
    - * These callbacks allow virtio-net devices to be added to vhost ports when
    - * configuration has been fully complete.
    - */
    -static const struct virtio_net_device_ops virtio_net_device_ops =
    -{
    -    .new_device =  new_device,
    -    .destroy_device = destroy_device,
    -    .vring_state_changed = vring_state_changed
    -};
    -
    -static void *
    -start_vhost_loop(void *dummy OVS_UNUSED)
    -{
    -     pthread_detach(pthread_self());
    -     /* Put the vhost thread into quiescent state. */
    -     ovsrcu_quiesce_start();
    -     rte_vhost_driver_session_start();
    -     return NULL;
    -}
    -
     static int
     netdev_dpdk_class_init(void)
     {
    @@ -2731,25 +2763,6 @@ netdev_dpdk_class_init(void)
         return 0;
     }
     
    -static int
    -netdev_dpdk_vhost_class_init(void)
    -{
    -    static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
    -
    -    /* This function can be called for different classes.  The initialization
    -     * needs to be done only once */
    -    if (ovsthread_once_start(&once)) {
    -        rte_vhost_driver_callback_register(&virtio_net_device_ops);
    -        rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4
    -                                  | 1ULL << VIRTIO_NET_F_HOST_TSO6
    -                                  | 1ULL << VIRTIO_NET_F_CSUM);
    -        ovs_thread_create("vhost_thread", start_vhost_loop, NULL);
    -
    -        ovsthread_once_done(&once);
    -    }
    -
    -    return 0;
    -}
     
     /* Client Rings */
     
    @@ -3204,6 +3217,31 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev)
                           "using client socket '%s'",
                           dev->up.name, dev->vhost_id);
             }
    +
    +        err = rte_vhost_driver_callback_register(dev->vhost_id,
    +                                                 &virtio_net_device_ops);
    +        if (err) {
    +            VLOG_ERR("rte_vhost_driver_callback_register failed for "
    +                     "vhost user client port: %s\n", dev->up.name);
    +            goto unlock;
    +        }
    +
    +        err = rte_vhost_driver_disable_features(dev->vhost_id,
    +                                    1ULL << VIRTIO_NET_F_HOST_TSO4
    +                                    | 1ULL << VIRTIO_NET_F_HOST_TSO6
    +                                    | 1ULL << VIRTIO_NET_F_CSUM);
    +        if (err) {
    +            VLOG_ERR("rte_vhost_driver_disable_features failed for vhost user "
    +                     "client port: %s\n", dev->up.name);
    +            goto unlock;
    +        }
    +
    +        err = rte_vhost_driver_start(dev->vhost_id);
    +        if (err) {
    +            VLOG_ERR("rte_vhost_driver_start failed for vhost user "
    +                     "client port: %s\n", dev->up.name);
    +            goto unlock;
    +        }
         }
     
         err = dpdk_vhost_reconfigure_helper(dev);
    @@ -3324,7 +3362,7 @@ static const struct netdev_class dpdk_ring_class =
     static const struct netdev_class dpdk_vhost_class =
         NETDEV_DPDK_CLASS(
             "dpdkvhostuser",
    -        netdev_dpdk_vhost_class_init,
    +        NULL,
             netdev_dpdk_vhost_construct,
             netdev_dpdk_vhost_destruct,
             NULL,
    @@ -3339,7 +3377,7 @@ static const struct netdev_class dpdk_vhost_class =
     static const struct netdev_class dpdk_vhost_client_class =
         NETDEV_DPDK_CLASS(
             "dpdkvhostuserclient",
    -        netdev_dpdk_vhost_class_init,
    +        NULL,
             netdev_dpdk_vhost_client_construct,
             netdev_dpdk_vhost_destruct,
             netdev_dpdk_vhost_client_set_config,
    diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in
    index 3a045d3..2bb7102 100644
    --- a/rhel/openvswitch-fedora.spec.in
    +++ b/rhel/openvswitch-fedora.spec.in
    @@ -84,7 +84,7 @@ BuildRequires: libcap-ng libcap-ng-devel
     %endif
     %if %{with dpdk}
     BuildRequires: libpcap-devel numactl-devel
    -BuildRequires: dpdk-devel >= 16.11
    +BuildRequires: dpdk-devel >= 17.05.1
     Provides: %{name}-dpdk = %{version}-%{release}
     %endif
     
    diff --git a/tests/dpdk/ring_client.c b/tests/dpdk/ring_client.c
    index b153713..8cc3fb5 100644
    --- a/tests/dpdk/ring_client.c
    +++ b/tests/dpdk/ring_client.c
    @@ -185,15 +185,15 @@ main(int argc, char *argv[])
             /* Try dequeuing max possible packets first, if that fails, get the
              * most we can. Loop body should only execute once, maximum.
              */
    -        while (unlikely(rte_ring_dequeue_bulk(rx_ring, pkts, rx_pkts) != 0) &&
    -            rx_pkts > 0) {
    +        while (unlikely(rte_ring_dequeue_bulk(rx_ring, pkts,
    +                        rx_pkts, NULL) != 0) && rx_pkts > 0) {
                 rx_pkts = (uint16_t)RTE_MIN(rte_ring_count(rx_ring), PKT_READ_SIZE);
             }
     
             if (rx_pkts > 0) {
                 /* blocking enqueue */
                 do {
    -                rslt = rte_ring_enqueue_bulk(tx_ring, pkts, rx_pkts);
    +                rslt = rte_ring_enqueue_bulk(tx_ring, pkts, rx_pkts, NULL);
                 } while (rslt == -ENOBUFS);
             }
         }
    -- 
    1.8.3.1
    
    _______________________________________________
    dev mailing list
    dev at openvswitch.org
    https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=1y2ctE1whdC2J1_P88hUEbLvRvKEC-C8osVeldZgdj4&s=NRh9tIHfSupitemjr2ORp8ymj_X_AUj4NAoJwv9LL_s&e= 
    



More information about the dev mailing list