diff --git a/0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch b/0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch new file mode 100644 index 0000000..b43c066 --- /dev/null +++ b/0001-netdev-dpdk-replace-uint8_t-with-dpdk_port_t.patch @@ -0,0 +1,34 @@ +From 9a20eb387a578575400dd266cf64bebc323a5e7a Mon Sep 17 00:00:00 2001 +From: Mark Kavanagh +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 +Signed-off-by: Mark Kavanagh +Acked-by: Ilya Maximets +Signed-off-by: Ian Stokes +Signed-off-by: Markos Chandras +--- + 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 + diff --git a/0002-netdev-dpdk-DPDK-v17.11-upgrade.patch b/0002-netdev-dpdk-DPDK-v17.11-upgrade.patch new file mode 100644 index 0000000..58aa8db --- /dev/null +++ b/0002-netdev-dpdk-DPDK-v17.11-upgrade.patch @@ -0,0 +1,40 @@ +From 48d294a05d4c0723aba6d7bae2e8a7bb56921736 Mon Sep 17 00:00:00 2001 +From: Markos Chandras +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 +--- + 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 + #include + ++#include + #include + #include + #include +@@ -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 + diff --git a/0003-netdev-dpdk-vHost-IOMMU-support.patch b/0003-netdev-dpdk-vHost-IOMMU-support.patch new file mode 100644 index 0000000..30b4dcd --- /dev/null +++ b/0003-netdev-dpdk-vHost-IOMMU-support.patch @@ -0,0 +1,217 @@ +From 99aa592dd03c15e9857cfc9c93cc31a8a660af7e Mon Sep 17 00:00:00 2001 +From: Mark Kavanagh +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 +Acked-by: Kevin Traynor +Signed-off-by: Ian Stokes +--- + 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 ++ + #ifdef DPDK_NETDEV + + #include +@@ -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 @@ +

+ + ++ ++

++ 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 true enables vHost IOMMU support for vHost User ++ Client ports in OvS-DPDK, starting from DPDK v17.11. ++

++

++ Changing this value requires restarting the daemon. ++

++
++ + +

+-- +2.15.1 + diff --git a/openvswitch.changes b/openvswitch.changes index 5d4aead..970385f 100644 --- a/openvswitch.changes +++ b/openvswitch.changes @@ -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 diff --git a/openvswitch.spec b/openvswitch.spec index 39e8d03..b8f8366 100644 --- a/openvswitch.spec +++ b/openvswitch.spec @@ -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