Message ID | 1496138547-23769-1-git-send-email-michalx.weglicki@intel.com |
---|---|
State | Changes Requested |
Headers | show |
>From: ovs-dev-bounces@openvswitch.org [mailto:ovs-dev-bounces@openvswitch.org] On Behalf Of >mweglicx >Sent: Tuesday, May 30, 2017 11:02 AM >To: dev@openvswitch.org >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 <michalx.weglicki@intel.com> 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 >dev@openvswitch.org >https://mail.openvswitch.org/mailman/listinfo/ovs-dev
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 + 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> #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; /* '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); } 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) { + 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; + } + + 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); } }
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 <michalx.weglicki@intel.com> --- .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(-)