>From: [email protected] [mailto:[email protected]] 
>On Behalf Of
>mweglicx
>Sent: Tuesday, May 30, 2017 11:02 AM
>To: [email protected]
>Subject: [ovs-dev] [PATCH] Update relevant artifacts to add support for DPDK 
>17.05.
>
>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.
>- rhel/openvswitch-fedora.spec.in: DPDK version change
>  from 16.11 to 17.05.
>
>Signed-off-by: Michal Weglicki <[email protected]>


Hi Michal,

Thanks for the patch - please find comments inline.
Also, as a general comment, please disable the copyright trailer in your email 
client before posting.

Thanks,
Mark

>---
> .travis/linux-build.sh                   |   2 +-
> Documentation/faq/releases.rst           |   2 +-
> Documentation/intro/install/dpdk.rst     |   8 +-
> Documentation/topics/dpdk/vhost-user.rst |   8 +-
> lib/netdev-dpdk.c                        | 122 ++++++++++++++++---------------
> rhel/openvswitch-fedora.spec.in          |   2 +-
> tests/dpdk/ring_client.c                 |   6 +-
> 7 files changed, 78 insertions(+), 72 deletions(-)
>
>diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
>index 8750d68..ec15fd8 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.1"
>+        DPDK_VER="17.05"
>     fi
>     install_dpdk $DPDK_VER
>     if [ "$CC" = "clang" ]; then
>diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst
>index c85eff8..4fe46bc 100644
>--- a/Documentation/faq/releases.rst
>+++ b/Documentation/faq/releases.rst
>@@ -160,7 +160,7 @@ Q: What DPDK version does each Open vSwitch release work 
>with?
>     2.4.x        2.0
>     2.5.x        2.2
>     2.6.x        16.07.2
>-    2.7.x        16.11.1

I'd also add an entry here for 2.7.0 itself, since 17.05 wasn't available when 
it was released:
=>      2.7.0           16.11.1

>+    2.7.0+       17.05
>     ============ =======
>
> Q: I get an error like this when I configure Open vSwitch:
>diff --git a/Documentation/intro/install/dpdk.rst 
>b/Documentation/intro/install/dpdk.rst
>index e83f852..536450b 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
>
> - 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 http://fast.dpdk.org/rel/dpdk-16.11.1.tar.xz
>-       $ tar xf dpdk-16.11.1.tar.xz
>-       $ export DPDK_DIR=/usr/src/dpdk-stable-16.11.1
>+       $ wget http://fast.dpdk.org/rel/dpdk-17.05.tar.xz
>+       $ tar xf dpdk-17.05.tar.xz
>+       $ export DPDK_DIR=/usr/src/dpdk-17.05
>        $ cd $DPDK_DIR
>
> #. (Optional) Configure DPDK as a shared library
>diff --git a/Documentation/topics/dpdk/vhost-user.rst 
>b/Documentation/topics/dpdk/vhost-
>user.rst
>index ba22684..71098fd 100644
>--- a/Documentation/topics/dpdk/vhost-user.rst
>+++ b/Documentation/topics/dpdk/vhost-user.rst
>@@ -278,9 +278,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 http://fast.dpdk.org/rel/dpdk-16.11.1.tar.xz
>-    $ tar xf dpdk-16.11.1.tar.xz
>-    $ export DPDK_DIR=/root/dpdk/dpdk-stable-16.11.1
>+    $ wget http://fast.dpdk.org/rel/dpdk-17.05.tar.xz
>+    $ tar xf dpdk-17.05.tar.xz
>+    $ export DPDK_DIR=/root/dpdk/dpdk-17.05
>     $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
>     $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
>     $ cd $DPDK_DIR
>@@ -364,7 +364,7 @@ Sample XML
>         </disk>
>         <disk type='dir' device='disk'>
>           <driver name='qemu' type='fat'/>
>-          <source dir='/usr/src/dpdk-stable-16.11.1'/>
>+          <source dir='/usr/src/dpdk-17.05'/>
>           <target dev='vdb' bus='virtio'/>
>           <readonly/>
>         </disk>
>diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>index 609b8da..813a59d 100644
>--- a/lib/netdev-dpdk.c
>+++ b/lib/netdev-dpdk.c
>@@ -31,7 +31,10 @@
> #include <rte_malloc.h>
> #include <rte_mbuf.h>
> #include <rte_meter.h>
>-#include <rte_virtio_net.h>
>+#include <rte_vhost.h>
>+#include <linux/virtio_net.h>
>+#include <sys/socket.h>
>+#include <linux/if.h>

By convention, the Linux includes should precede the DPDK includes.

>
> #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);
>
>@@ -164,6 +169,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 };
>@@ -402,8 +422,8 @@ struct netdev_rxq_dpdk {
>     int 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);
>
>@@ -413,8 +433,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
>@@ -922,7 +942,7 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
> {
>     struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>     const char *name = netdev->name;
>-    int err;
>+    int ret_value, result;

Personally, I think the code is clearer if these variables are renamed:
        s/ret_value/err
        s/result/ret

EDIT: given the code changes that I've suggested below, only one return 
variable is required here.

>
>     /* 'name' is appended to 'vhost_sock_dir' and used to create a socket in
>      * the file system. '/' or '\' would traverse directories, so they're not
>@@ -942,8 +962,9 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
>              dpdk_get_vhost_sock_dir(), name);
>
>     dev->vhost_driver_flags &= ~RTE_VHOST_USER_CLIENT;
>-    err = rte_vhost_driver_register(dev->vhost_id, dev->vhost_driver_flags);
>-    if (err) {
>+    ret_value = rte_vhost_driver_register(dev->vhost_id,
>+                                          dev->vhost_driver_flags);
>+    if (ret_value) {
>         VLOG_ERR("vhost-user socket device setup failure for socket %s\n",
>                  dev->vhost_id);

Shouldn't we exit if rte_vhost_driver_register fails? I know that wasn't the 
case in the previous code, but it might be a good idea to address it here.
Alternatively, I can push a separate patch to fix that issue.


>     } else {
>@@ -951,10 +972,38 @@ netdev_dpdk_vhost_construct(struct netdev *netdev)
>         VLOG_INFO("Socket %s created for vhost-user port %s\n",
>                   dev->vhost_id, name);
>     }
>-    err = vhost_common_construct(netdev);
>+
>+    result = rte_vhost_driver_callback_register(dev->vhost_id,
>+                                                &virtio_net_device_ops);
>+    if (result) {

We should exit here if rte_vhost_driver_callback_register fails, since there's 
no point in continuing further.


>+        VLOG_ERR("vhost-user callback register failed.");
>+        ret_value = result;
>+    }
>+
>+    result =
>+            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 (result) {
>+        VLOG_ERR("vhost-user disable features failed!");
>+        return result;
>+    }
>+
>+    result = vhost_common_construct(netdev);
>+    if (result) {
>+        VLOG_ERR("vhost-user common construct failed.");
>+        ret_value = result;

We should exit if vhost_common_construct fails (this indicates that there is 
insufficient memory available to create the device's txq).

>+    }
>+
>+    result = rte_vhost_driver_start(dev->vhost_id);
>+    if (result) {
>+        VLOG_ERR("vhost-user driver start failed.");
>+        ret_value = result;
>+    }
>
>     ovs_mutex_unlock(&dpdk_mutex);
>-    return err;
>+    return ret_value;
> }
>
> static int
>@@ -2483,12 +2532,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);
>     }
> }
>
>@@ -2551,7 +2597,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)/2;
>
>             /* Get NUMA information */
>             newnode = rte_vhost_get_numa_node(vid);
>@@ -2718,27 +2764,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)
> {
>@@ -2761,25 +2786,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 */
>
>@@ -3351,7 +3357,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,
>@@ -3366,7 +3372,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 3200040..596a4b3 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
> 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
>
>--------------------------------------------------------------
>Intel Research and Development Ireland Limited
>Registered in Ireland
>Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
>Registered Number: 308263
>
>
>This e-mail and any attachments may contain confidential material for the sole
>use of the intended recipient(s). Any review or distribution by others is
>strictly prohibited. If you are not the intended recipient, please contact the
>sender and delete all copies.
>
>_______________________________________________
>dev mailing list
>[email protected]
>https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to