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
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
Source1: preamble
|
||||
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
|
||||
BuildRequires: %{python_module devel}
|
||||
BuildRequires: %{python_module six}
|
||||
@ -323,6 +329,9 @@ performance and connectivity issues in Open vSwitch setup.
|
||||
|
||||
%prep
|
||||
%setup -q -n openvswitch-%{version}
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch99 -p1
|
||||
|
||||
%build
|
||||
|
Loading…
Reference in New Issue
Block a user