forked from pool/openvswitch
Accepting request 563105 from home:markoschandras:branches:network
- Add upstream patches to support DPDK 17.11 (fate#322609) * 0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch * 0002-netdev-dpdk-DPDK-v17.11-upgrade.patch * 0003-netdev-dpdk-vHost-IOMMU-support.patch OBS-URL: https://build.opensuse.org/request/show/563105 OBS-URL: https://build.opensuse.org/package/show/network/openvswitch?expand=0&rev=134
This commit is contained in:
parent
f850461846
commit
93fd217d23
34
0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch
Normal file
34
0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
From 9a20eb387a578575400dd266cf64bebc323a5e7a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Kavanagh <mark.b.kavanagh@intel.com>
|
||||||
|
Date: Fri, 20 Oct 2017 13:37:00 +0100
|
||||||
|
Subject: [PATCH 1/3] netdev-dpdk: replace uint8_t with dpdk_port_t
|
||||||
|
|
||||||
|
netdev_dpdk_detach() declares a 'port_id' variable, of type uint8_t.
|
||||||
|
This variable should instead be of type dpdk_port_t.
|
||||||
|
|
||||||
|
Fixes: bb37956ac ("netdev-dpdk: Use uint8_t for port_id.")
|
||||||
|
CC: Ilya Maximets <i.maximets@samsung.com>
|
||||||
|
Signed-off-by: Mark Kavanagh <mark.b.kavanagh@intel.com>
|
||||||
|
Acked-by: Ilya Maximets <i.maximets@samsung.com>
|
||||||
|
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
|
||||||
|
Signed-off-by: Markos Chandras <mchandras@suse.de>
|
||||||
|
---
|
||||||
|
lib/netdev-dpdk.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
|
||||||
|
index 41acb5b62..dc96d7ce3 100644
|
||||||
|
--- a/lib/netdev-dpdk.c
|
||||||
|
+++ b/lib/netdev-dpdk.c
|
||||||
|
@@ -2521,7 +2521,7 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *response;
|
||||||
|
- uint8_t port_id;
|
||||||
|
+ dpdk_port_t port_id;
|
||||||
|
char devname[RTE_ETH_NAME_MAX_LEN];
|
||||||
|
struct netdev_dpdk *dev;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.15.1
|
||||||
|
|
40
0002-netdev-dpdk-DPDK-v17.11-upgrade.patch
Normal file
40
0002-netdev-dpdk-DPDK-v17.11-upgrade.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 48d294a05d4c0723aba6d7bae2e8a7bb56921736 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Markos Chandras <mchandras@suse.de>
|
||||||
|
Date: Tue, 9 Jan 2018 15:55:34 +0000
|
||||||
|
Subject: [PATCH 2/3] netdev-dpdk: DPDK v17.11 upgrade
|
||||||
|
|
||||||
|
API changes for DPDK v17.11 (taken from upstream commit
|
||||||
|
5e925ccc2a6f569f1b32365e3660671b8e7d36b3 "netdev-dpdk: DPDK v17.11
|
||||||
|
upgrade")
|
||||||
|
|
||||||
|
Signed-off-by: Markos Chandras <mchandras@suse.de>
|
||||||
|
---
|
||||||
|
lib/netdev-dpdk.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
|
||||||
|
index dc96d7ce3..b93aa2354 100644
|
||||||
|
--- a/lib/netdev-dpdk.c
|
||||||
|
+++ b/lib/netdev-dpdk.c
|
||||||
|
@@ -26,6 +26,7 @@
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <linux/if.h>
|
||||||
|
|
||||||
|
+#include <rte_bus_pci.h>
|
||||||
|
#include <rte_config.h>
|
||||||
|
#include <rte_cycles.h>
|
||||||
|
#include <rte_errno.h>
|
||||||
|
@@ -150,8 +151,8 @@ BUILD_ASSERT_DECL((MAX_NB_MBUF / ROUND_DOWN_POW2(MAX_NB_MBUF/MIN_NB_MBUF))
|
||||||
|
|
||||||
|
#define DPDK_ETH_PORT_ID_INVALID RTE_MAX_ETHPORTS
|
||||||
|
|
||||||
|
-/* DPDK library uses uint8_t for port_id. */
|
||||||
|
-typedef uint8_t dpdk_port_t;
|
||||||
|
+/* DPDK library uses uint16_t for port_id. */
|
||||||
|
+typedef uint16_t dpdk_port_t;
|
||||||
|
|
||||||
|
#define VHOST_ENQ_RETRY_NUM 8
|
||||||
|
#define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
|
||||||
|
--
|
||||||
|
2.15.1
|
||||||
|
|
217
0003-netdev-dpdk-vHost-IOMMU-support.patch
Normal file
217
0003-netdev-dpdk-vHost-IOMMU-support.patch
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
From 99aa592dd03c15e9857cfc9c93cc31a8a660af7e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Kavanagh <mark.b.kavanagh@intel.com>
|
||||||
|
Date: Fri, 8 Dec 2017 10:53:47 +0000
|
||||||
|
Subject: [PATCH 3/3] netdev-dpdk: vHost IOMMU support
|
||||||
|
|
||||||
|
DPDK v17.11 introduces support for the vHost IOMMU feature.
|
||||||
|
This is a security feature, which restricts the vhost memory
|
||||||
|
that a virtio device may access.
|
||||||
|
|
||||||
|
This feature also enables the vhost REPLY_ACK protocol, the
|
||||||
|
implementation of which is known to work in newer versions of
|
||||||
|
QEMU (i.e. v2.10.0), but is buggy in older versions (v2.7.0 -
|
||||||
|
v2.9.0, inclusive). As such, the feature is disabled by default
|
||||||
|
in (and should remain so), for the aforementioned older QEMU
|
||||||
|
verions. Starting with QEMU v2.9.1, vhost-iommu-support can
|
||||||
|
safely be enabled, even without having an IOMMU device, with
|
||||||
|
no performance penalty.
|
||||||
|
|
||||||
|
This patch adds a new global config option, vhost-iommu-support,
|
||||||
|
that controls enablement of the vhost IOMMU feature:
|
||||||
|
|
||||||
|
ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
|
||||||
|
|
||||||
|
This value defaults to false; to enable IOMMU support, this field
|
||||||
|
should be set to true when setting other global parameters on init
|
||||||
|
(such as "dpdk-socket-mem", for example). Changing the value at
|
||||||
|
runtime is not supported, and requires restarting the vswitch daemon.
|
||||||
|
|
||||||
|
Signed-off-by: Mark Kavanagh <mark.b.kavanagh@intel.com>
|
||||||
|
Acked-by: Kevin Traynor <ktraynor@redhat.com>
|
||||||
|
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
|
||||||
|
---
|
||||||
|
Documentation/topics/dpdk/vhost-user.rst | 28 ++++++++++++++++++++++++++++
|
||||||
|
lib/dpdk-stub.c | 6 ++++++
|
||||||
|
lib/dpdk.c | 12 ++++++++++++
|
||||||
|
lib/dpdk.h | 3 +++
|
||||||
|
lib/netdev-dpdk.c | 14 ++++++++++----
|
||||||
|
vswitchd/vswitch.xml | 15 +++++++++++++++
|
||||||
|
6 files changed, 74 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
|
||||||
|
index d383a16e3..9286f8ac6 100644
|
||||||
|
--- a/Documentation/topics/dpdk/vhost-user.rst
|
||||||
|
+++ b/Documentation/topics/dpdk/vhost-user.rst
|
||||||
|
@@ -273,6 +273,34 @@ One benefit of using this mode is the ability for vHost ports to 'reconnect' in
|
||||||
|
event of the switch crashing or being brought down. Once it is brought back up,
|
||||||
|
the vHost ports will reconnect automatically and normal service will resume.
|
||||||
|
|
||||||
|
+vhost-user-client IOMMU Support
|
||||||
|
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
+
|
||||||
|
+vhost IOMMU is a feature which restricts the vhost memory that a virtio device
|
||||||
|
+can access, and as such is useful in deployments in which security is a
|
||||||
|
+concern.
|
||||||
|
+
|
||||||
|
+IOMMU support may be enabled via a global config value,
|
||||||
|
+```vhost-iommu-support```. Setting this to true enables vhost IOMMU support for
|
||||||
|
+all vhost ports when/where available::
|
||||||
|
+
|
||||||
|
+ $ ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
|
||||||
|
+
|
||||||
|
+The default value is false.
|
||||||
|
+
|
||||||
|
+.. important::
|
||||||
|
+
|
||||||
|
+ Changing this value requires restarting the daemon.
|
||||||
|
+
|
||||||
|
+.. important::
|
||||||
|
+
|
||||||
|
+ Enabling the IOMMU feature also enables the vhost user reply-ack protocol;
|
||||||
|
+ this is known to work on QEMU v2.10.0, but is buggy on older versions
|
||||||
|
+ (2.7.0 - 2.9.0, inclusive). Consequently, the IOMMU feature is disabled by
|
||||||
|
+ default (and should remain so if using the aforementioned versions of
|
||||||
|
+ QEMU). Starting with QEMU v2.9.1, vhost-iommu-support can safely be
|
||||||
|
+ enabled, even without having an IOMMU device, with no performance penalty.
|
||||||
|
+
|
||||||
|
.. _dpdk-testpmd:
|
||||||
|
|
||||||
|
DPDK in the Guest
|
||||||
|
diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
|
||||||
|
index daef7291f..36021807c 100644
|
||||||
|
--- a/lib/dpdk-stub.c
|
||||||
|
+++ b/lib/dpdk-stub.c
|
||||||
|
@@ -48,3 +48,9 @@ dpdk_get_vhost_sock_dir(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+bool
|
||||||
|
+dpdk_vhost_iommu_enabled(void)
|
||||||
|
+{
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
diff --git a/lib/dpdk.c b/lib/dpdk.c
|
||||||
|
index 8da6c3244..6710d10fc 100644
|
||||||
|
--- a/lib/dpdk.c
|
||||||
|
+++ b/lib/dpdk.c
|
||||||
|
@@ -41,6 +41,7 @@ VLOG_DEFINE_THIS_MODULE(dpdk);
|
||||||
|
static FILE *log_stream = NULL; /* Stream for DPDK log redirection */
|
||||||
|
|
||||||
|
static char *vhost_sock_dir = NULL; /* Location of vhost-user sockets */
|
||||||
|
+static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU support */
|
||||||
|
|
||||||
|
static int
|
||||||
|
process_vhost_flags(char *flag, const char *default_val, int size,
|
||||||
|
@@ -345,6 +346,11 @@ dpdk_init__(const struct smap *ovs_other_config)
|
||||||
|
vhost_sock_dir = sock_dir_subcomponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ vhost_iommu_enabled = smap_get_bool(ovs_other_config,
|
||||||
|
+ "vhost-iommu-support", false);
|
||||||
|
+ VLOG_INFO("IOMMU support for vhost-user-client %s.",
|
||||||
|
+ vhost_iommu_enabled ? "enabled" : "disabled");
|
||||||
|
+
|
||||||
|
argv = grow_argv(&argv, 0, 1);
|
||||||
|
argc = 1;
|
||||||
|
argv[0] = xstrdup(ovs_get_program_name());
|
||||||
|
@@ -482,6 +488,12 @@ dpdk_get_vhost_sock_dir(void)
|
||||||
|
return vhost_sock_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool
|
||||||
|
+dpdk_vhost_iommu_enabled(void)
|
||||||
|
+{
|
||||||
|
+ return vhost_iommu_enabled;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
dpdk_set_lcore_id(unsigned cpu)
|
||||||
|
{
|
||||||
|
diff --git a/lib/dpdk.h b/lib/dpdk.h
|
||||||
|
index 673a1f17e..dc58d968a 100644
|
||||||
|
--- a/lib/dpdk.h
|
||||||
|
+++ b/lib/dpdk.h
|
||||||
|
@@ -17,6 +17,8 @@
|
||||||
|
#ifndef DPDK_H
|
||||||
|
#define DPDK_H
|
||||||
|
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+
|
||||||
|
#ifdef DPDK_NETDEV
|
||||||
|
|
||||||
|
#include <rte_config.h>
|
||||||
|
@@ -35,5 +37,6 @@ struct smap;
|
||||||
|
void dpdk_init(const struct smap *ovs_other_config);
|
||||||
|
void dpdk_set_lcore_id(unsigned cpu);
|
||||||
|
const char *dpdk_get_vhost_sock_dir(void);
|
||||||
|
+bool dpdk_vhost_iommu_enabled(void);
|
||||||
|
|
||||||
|
#endif /* dpdk.h */
|
||||||
|
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
|
||||||
|
index b93aa2354..3082fd668 100644
|
||||||
|
--- a/lib/netdev-dpdk.c
|
||||||
|
+++ b/lib/netdev-dpdk.c
|
||||||
|
@@ -3259,6 +3259,7 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev)
|
||||||
|
{
|
||||||
|
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
|
||||||
|
int err;
|
||||||
|
+ uint64_t vhost_flags = 0;
|
||||||
|
|
||||||
|
ovs_mutex_lock(&dev->mutex);
|
||||||
|
|
||||||
|
@@ -3269,16 +3270,21 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev)
|
||||||
|
*/
|
||||||
|
if (!(dev->vhost_driver_flags & RTE_VHOST_USER_CLIENT)
|
||||||
|
&& strlen(dev->vhost_id)) {
|
||||||
|
- /* Register client-mode device */
|
||||||
|
- err = rte_vhost_driver_register(dev->vhost_id,
|
||||||
|
- RTE_VHOST_USER_CLIENT);
|
||||||
|
+ /* Register client-mode device. */
|
||||||
|
+ vhost_flags |= RTE_VHOST_USER_CLIENT;
|
||||||
|
+
|
||||||
|
+ /* Enable IOMMU support, if explicitly requested. */
|
||||||
|
+ if (dpdk_vhost_iommu_enabled()) {
|
||||||
|
+ vhost_flags |= RTE_VHOST_USER_IOMMU_SUPPORT;
|
||||||
|
+ }
|
||||||
|
+ err = rte_vhost_driver_register(dev->vhost_id, vhost_flags);
|
||||||
|
if (err) {
|
||||||
|
VLOG_ERR("vhost-user device setup failure for device %s\n",
|
||||||
|
dev->vhost_id);
|
||||||
|
goto unlock;
|
||||||
|
} else {
|
||||||
|
/* Configuration successful */
|
||||||
|
- dev->vhost_driver_flags |= RTE_VHOST_USER_CLIENT;
|
||||||
|
+ dev->vhost_driver_flags |= vhost_flags;
|
||||||
|
VLOG_INFO("vHost User device '%s' created in 'client' mode, "
|
||||||
|
"using client socket '%s'",
|
||||||
|
dev->up.name, dev->vhost_id);
|
||||||
|
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
|
||||||
|
index 074535b58..8f646059f 100644
|
||||||
|
--- a/vswitchd/vswitch.xml
|
||||||
|
+++ b/vswitchd/vswitch.xml
|
||||||
|
@@ -344,6 +344,21 @@
|
||||||
|
</p>
|
||||||
|
</column>
|
||||||
|
|
||||||
|
+ <column name="other_config" key="vhost-iommu-support"
|
||||||
|
+ type='{"type": "boolean"}'>
|
||||||
|
+ <p>
|
||||||
|
+ vHost IOMMU is a security feature, which restricts the vhost memory
|
||||||
|
+ that a virtio device may access. vHost IOMMU support is disabled by
|
||||||
|
+ default, due to a bug in QEMU implementations of the vhost REPLY_ACK
|
||||||
|
+ protocol, (on which vHost IOMMU relies) prior to v2.9.1. Setting this
|
||||||
|
+ value to <code>true</code> enables vHost IOMMU support for vHost User
|
||||||
|
+ Client ports in OvS-DPDK, starting from DPDK v17.11.
|
||||||
|
+ </p>
|
||||||
|
+ <p>
|
||||||
|
+ Changing this value requires restarting the daemon.
|
||||||
|
+ </p>
|
||||||
|
+ </column>
|
||||||
|
+
|
||||||
|
<column name="other_config" key="n-handler-threads"
|
||||||
|
type='{"type": "integer", "minInteger": 1}'>
|
||||||
|
<p>
|
||||||
|
--
|
||||||
|
2.15.1
|
||||||
|
|
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jan 9 16:25:48 UTC 2018 - mchandras@suse.de
|
||||||
|
|
||||||
|
- Add upstream patches to support DPDK 17.11 (fate#322609)
|
||||||
|
* 0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch
|
||||||
|
* 0002-netdev-dpdk-DPDK-v17.11-upgrade.patch
|
||||||
|
* 0003-netdev-dpdk-vHost-IOMMU-support.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Dec 27 17:05:35 UTC 2017 - mchandras@suse.de
|
Wed Dec 27 17:05:35 UTC 2017 - mchandras@suse.de
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package openvswitch
|
# spec file for package openvswitch
|
||||||
#
|
#
|
||||||
# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
|
# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -48,6 +48,12 @@ Url: http://openvswitch.org/
|
|||||||
Source0: http://openvswitch.org/releases/openvswitch-%{version}.tar.gz
|
Source0: http://openvswitch.org/releases/openvswitch-%{version}.tar.gz
|
||||||
Source1: preamble
|
Source1: preamble
|
||||||
Source89: Module.supported.updates
|
Source89: Module.supported.updates
|
||||||
|
# PATCH-FIX-UPSTREAM: 0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch
|
||||||
|
Patch0: 0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch
|
||||||
|
# PATCH-FIX-UPSTREAM: 0002-netdev-dpdk-DPDK-v17.11-upgrade.patch
|
||||||
|
Patch1: 0002-netdev-dpdk-DPDK-v17.11-upgrade.patch
|
||||||
|
# PATCH-FIX-UPSTREAM: 0003-netdev-dpdk-vHost-IOMMU-support.patch
|
||||||
|
Patch2: 0003-netdev-dpdk-vHost-IOMMU-support.patch
|
||||||
Patch99: 0001-utilities-Add-script-to-support-DPDK-option-migratio.patch
|
Patch99: 0001-utilities-Add-script-to-support-DPDK-option-migratio.patch
|
||||||
BuildRequires: %{python_module devel}
|
BuildRequires: %{python_module devel}
|
||||||
BuildRequires: %{python_module six}
|
BuildRequires: %{python_module six}
|
||||||
@ -323,6 +329,9 @@ performance and connectivity issues in Open vSwitch setup.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n openvswitch-%{version}
|
%setup -q -n openvswitch-%{version}
|
||||||
|
%patch0 -p1
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
%patch99 -p1
|
%patch99 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
Loading…
Reference in New Issue
Block a user