[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#961212: marked as done (buster-pu: package dpdk/18.11.8-1~deb10u1)



Your message dated Sat, 01 Aug 2020 12:51:28 +0100
with message-id <43535efb498a168cf81452ca0c326f004f46adc6.camel@adam-barratt.org.uk>
and subject line Closing bugs for fixes included in 10.5 point release
has caused the Debian Bug report #961212,
regarding buster-pu: package dpdk/18.11.8-1~deb10u1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
961212: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=961212
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: buster
User: release.debian.org@packages.debian.org
Usertags: pu
X-Debbugs-CC: pkg-dpdk-devel@lists.alioth.debian.org

Dear release team,

We would like to upload a new LTS release version of DPDK to Buster.
We have already done this previously, and it was approved, for 18.11.2-
2+deb10u1, 18.11.5-1~deb10u1 and 18.11.8-1~deb10u1, therefore I already
proceeded to upload to buster-pu in accordance with the new workflow.

As before, the LTS point release has only bug fixes and no API changes
and has been tested with regression tests.

The source debdiff is attached. Patches merged upstream have been
dropped and a missing symbols file for librte-cfgfile18.11 was added.

-- 
Kind regards,
Luca Boccassi
diff -Nru dpdk-18.11.6/app/pdump/main.c dpdk-18.11.8/app/pdump/main.c
--- dpdk-18.11.6/app/pdump/main.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/pdump/main.c	2020-05-18 15:00:53.000000000 +0100
@@ -556,7 +556,7 @@
 	if (ret != 0)
 		rte_exit(EXIT_FAILURE, "dev config failed\n");
 
-	 for (q = 0; q < txRings; q++) {
+	for (q = 0; q < txRings; q++) {
 		ret = rte_eth_tx_queue_setup(port_id, q, TX_DESC_PER_QUEUE,
 				rte_eth_dev_socket_id(port_id), NULL);
 		if (ret < 0)
diff -Nru dpdk-18.11.6/app/test-eventdev/meson.build dpdk-18.11.8/app/test-eventdev/meson.build
--- dpdk-18.11.6/app/test-eventdev/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-eventdev/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -11,5 +11,8 @@
 		'test_order_queue.c',
 		'test_perf_common.c',
 		'test_perf_atq.c',
-		'test_perf_queue.c')
+		'test_perf_queue.c',
+		'test_pipeline_common.c',
+		'test_pipeline_atq.c',
+		'test_pipeline_queue.c')
 deps += 'eventdev'
diff -Nru dpdk-18.11.6/app/test-pmd/cmdline.c dpdk-18.11.8/app/test-pmd/cmdline.c
--- dpdk-18.11.6/app/test-pmd/cmdline.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/cmdline.c	2020-05-18 15:00:53.000000000 +0100
@@ -1410,7 +1410,7 @@
 struct cmd_operate_attach_port_result {
 	cmdline_fixed_string_t port;
 	cmdline_fixed_string_t keyword;
-	cmdline_fixed_string_t identifier;
+	cmdline_multi_string_t identifier;
 };
 
 static void cmd_operate_attach_port_parsed(void *parsed_result,
@@ -1433,7 +1433,7 @@
 			keyword, "attach");
 cmdline_parse_token_string_t cmd_operate_attach_port_identifier =
 	TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result,
-			identifier, NULL);
+			identifier, TOKEN_STRING_MULTI);
 
 cmdline_parse_inst_t cmd_operate_attach_port = {
 	.f = cmd_operate_attach_port_parsed,
@@ -6899,9 +6899,10 @@
 	 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side.
 	 */
 	static enum rte_eth_fc_mode rx_tx_onoff_2_pfc_mode[2][2] = {
-			{RTE_FC_NONE, RTE_FC_RX_PAUSE}, {RTE_FC_TX_PAUSE, RTE_FC_FULL}
+		{RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL}
 	};
 
+	memset(&pfc_conf, 0, sizeof(struct rte_eth_pfc_conf));
 	rx_fc_enable = (!strncmp(res->rx_pfc_mode, "on",2)) ? 1 : 0;
 	tx_fc_enable = (!strncmp(res->tx_pfc_mode, "on",2)) ? 1 : 0;
 	pfc_conf.fc.mode       = rx_tx_onoff_2_pfc_mode[rx_fc_enable][tx_fc_enable];
diff -Nru dpdk-18.11.6/app/test-pmd/cmdline_flow.c dpdk-18.11.8/app/test-pmd/cmdline_flow.c
--- dpdk-18.11.6/app/test-pmd/cmdline_flow.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/cmdline_flow.c	2020-05-18 15:00:53.000000000 +0100
@@ -3856,7 +3856,9 @@
 	struct rte_flow_item_gre gre = {
 		.protocol = rte_cpu_to_be_16(ETHER_TYPE_MPLS_UNICAST),
 	};
-	struct rte_flow_item_mpls mpls;
+	struct rte_flow_item_mpls mpls = {
+		.ttl = 0,
+	};
 	uint8_t *header;
 	int ret;
 
diff -Nru dpdk-18.11.6/app/test-pmd/config.c dpdk-18.11.8/app/test-pmd/config.c
--- dpdk-18.11.6/app/test-pmd/config.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/config.c	2020-05-18 15:00:53.000000000 +0100
@@ -3490,6 +3490,14 @@
 }
 
 static void
+mcast_addr_pool_append(struct rte_port *port, struct ether_addr *mc_addr)
+{
+	if (mcast_addr_pool_extend(port) != 0)
+		return;
+	ether_addr_copy(mc_addr, &port->mc_addr_pool[port->mc_addr_nb - 1]);
+}
+
+static void
 mcast_addr_pool_remove(struct rte_port *port, uint32_t addr_idx)
 {
 	port->mc_addr_nb--;
@@ -3507,7 +3515,7 @@
 		sizeof(struct ether_addr) * (port->mc_addr_nb - addr_idx));
 }
 
-static void
+static int
 eth_port_multicast_addr_list_set(portid_t port_id)
 {
 	struct rte_port *port;
@@ -3516,10 +3524,11 @@
 	port = &ports[port_id];
 	diag = rte_eth_dev_set_mc_addr_list(port_id, port->mc_addr_pool,
 					    port->mc_addr_nb);
-	if (diag == 0)
-		return;
-	printf("rte_eth_dev_set_mc_addr_list(port=%d, nb=%u) failed. diag=%d\n",
-	       port->mc_addr_nb, port_id, -diag);
+	if (diag < 0)
+		printf("rte_eth_dev_set_mc_addr_list(port=%d, nb=%u) failed. diag=%d\n",
+			port_id, port->mc_addr_nb, diag);
+
+	return diag;
 }
 
 void
@@ -3544,10 +3553,10 @@
 		}
 	}
 
-	if (mcast_addr_pool_extend(port) != 0)
-		return;
-	ether_addr_copy(mc_addr, &port->mc_addr_pool[i]);
-	eth_port_multicast_addr_list_set(port_id);
+	mcast_addr_pool_append(port, mc_addr);
+	if (eth_port_multicast_addr_list_set(port_id) < 0)
+		/* Rollback on failure, remove the address from the pool */
+		mcast_addr_pool_remove(port, i);
 }
 
 void
@@ -3574,7 +3583,9 @@
 	}
 
 	mcast_addr_pool_remove(port, i);
-	eth_port_multicast_addr_list_set(port_id);
+	if (eth_port_multicast_addr_list_set(port_id) < 0)
+		/* Rollback on failure, add the address back into the pool */
+		mcast_addr_pool_append(port, mc_addr);
 }
 
 void
diff -Nru dpdk-18.11.6/app/test-pmd/flowgen.c dpdk-18.11.8/app/test-pmd/flowgen.c
--- dpdk-18.11.6/app/test-pmd/flowgen.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/flowgen.c	2020-05-18 15:00:53.000000000 +0100
@@ -1,35 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2013 Tilera Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Tilera Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2014-2020 Mellanox Technologies, Ltd
  */
 
 #include <stdarg.h>
diff -Nru dpdk-18.11.6/app/test-pmd/macswap.c dpdk-18.11.8/app/test-pmd/macswap.c
--- dpdk-18.11.6/app/test-pmd/macswap.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/macswap.c	2020-05-18 15:00:53.000000000 +0100
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2014 Tilera Corporation. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Tilera Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2014-2020 Mellanox Technologies, Ltd
  */
 
 #include <stdarg.h>
diff -Nru dpdk-18.11.6/app/test-pmd/testpmd.c dpdk-18.11.8/app/test-pmd/testpmd.c
--- dpdk-18.11.6/app/test-pmd/testpmd.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/testpmd.c	2020-05-18 15:00:53.000000000 +0100
@@ -2342,32 +2342,17 @@
 	printf("Done\n");
 }
 
-void
-detach_port_device(portid_t port_id)
+static void
+detach_device(struct rte_device *dev)
 {
-	struct rte_device *dev;
 	portid_t sibling;
 
-	printf("Removing a device...\n");
-
-	if (port_id_is_invalid(port_id, ENABLED_WARN))
-		return;
-
-	dev = rte_eth_devices[port_id].device;
 	if (dev == NULL) {
 		printf("Device already removed\n");
 		return;
 	}
 
-	if (ports[port_id].port_status != RTE_PORT_CLOSED) {
-		if (ports[port_id].port_status != RTE_PORT_STOPPED) {
-			printf("Port not stopped\n");
-			return;
-		}
-		printf("Port was not closed\n");
-		if (ports[port_id].flow_list)
-			port_flow_flush(port_id);
-	}
+	printf("Removing a device...\n");
 
 	if (rte_dev_remove(dev) < 0) {
 		TESTPMD_LOG(ERR, "Failed to detach device %s\n", dev->name);
@@ -2388,13 +2373,32 @@
 
 	remove_invalid_ports();
 
-	printf("Device of port %u is detached\n", port_id);
+	printf("Device is detached\n");
 	printf("Now total ports is %d\n", nb_ports);
 	printf("Done\n");
 	return;
 }
 
 void
+detach_port_device(portid_t port_id)
+{
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	if (ports[port_id].port_status != RTE_PORT_CLOSED) {
+		if (ports[port_id].port_status != RTE_PORT_STOPPED) {
+			printf("Port not stopped\n");
+			return;
+		}
+		printf("Port was not closed\n");
+		if (ports[port_id].flow_list)
+			port_flow_flush(port_id);
+	}
+
+	detach_device(rte_eth_devices[port_id].device);
+}
+
+void
 pmd_test_exit(void)
 {
 	struct rte_device *device;
@@ -2538,6 +2542,7 @@
 	int need_to_start = 0;
 	int org_no_link_check = no_link_check;
 	portid_t port_id = (intptr_t)arg;
+	struct rte_device *dev;
 
 	RTE_ETH_VALID_PORTID_OR_RET(port_id);
 
@@ -2548,8 +2553,12 @@
 	no_link_check = 1;
 	stop_port(port_id);
 	no_link_check = org_no_link_check;
+
+	/* Save rte_device pointer before closing ethdev port */
+	dev = rte_eth_devices[port_id].device;
 	close_port(port_id);
-	detach_port_device(port_id);
+	detach_device(dev); /* might be already removed or have more ports */
+
 	if (need_to_start)
 		start_packet_forwarding(0);
 }
@@ -3296,5 +3305,10 @@
 			return 1;
 	}
 
-	return 0;
+	ret = rte_eal_cleanup();
+	if (ret != 0)
+		rte_exit(EXIT_FAILURE,
+			 "EAL cleanup failed: %s\n", strerror(-ret));
+
+	return EXIT_SUCCESS;
 }
diff -Nru dpdk-18.11.6/app/test-pmd/util.c dpdk-18.11.8/app/test-pmd/util.c
--- dpdk-18.11.6/app/test-pmd/util.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/app/test-pmd/util.c	2020-05-18 15:00:53.000000000 +0100
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(c) 2010-2014 Intel Corporation
- * Copyright(c) 2018 Mellanox Technology
+ * Copyright 2018 Mellanox Technologies, Ltd
  */
 
 #include <stdio.h>
diff -Nru dpdk-18.11.6/config/x86/meson.build dpdk-18.11.8/config/x86/meson.build
--- dpdk-18.11.6/config/x86/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/config/x86/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -15,11 +15,9 @@
 endif
 
 # we require SSE4.2 for DPDK
-sse_errormsg = '''SSE4.2 instruction set is required for DPDK.
-Please set the machine type to "nehalem" or "corei7" or higher value'''
-
 if cc.get_define('__SSE4_2__', args: machine_args) == ''
-	error(sse_errormsg)
+	message('SSE 4.2 not enabled by default, explicitly enabling')
+	machine_args += '-msse4'
 endif
 
 base_flags = ['SSE', 'SSE2', 'SSE3','SSSE3', 'SSE4_1', 'SSE4_2']
diff -Nru dpdk-18.11.6/debian/changelog dpdk-18.11.8/debian/changelog
--- dpdk-18.11.6/debian/changelog	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/changelog	2020-05-21 11:12:16.000000000 +0100
@@ -1,3 +1,16 @@
+dpdk (18.11.8-1~deb10u1) buster; urgency=medium
+
+  * New upstream version 18.11.8; For a list of changes see
+    http://doc.dpdk.org/guides-18.11/rel_notes/release_18_11.html
+  * Drop CVE patches, merged upstream
+  * Drop 0008-Revert-common-octeontx-add-missing-public-symbol.patch,
+    merged upstream
+  * Refresh 0004-build-bump-minimum-Meson-version-to-0.47.1.patch for
+    18.11.8
+  * Add missing symbol from mapfile in librte-cfgfile
+
+ -- Luca Boccassi <bluca@debian.org>  Thu, 21 May 2020 11:12:16 +0100
+
 dpdk (18.11.6-1~deb10u2) buster-security; urgency=high
 
   * Backport patches to fix CVE-2020-10722, CVE-2020-10723, CVE-2020-10724
diff -Nru dpdk-18.11.6/debian/librte-cfgfile18.11.symbols dpdk-18.11.8/debian/librte-cfgfile18.11.symbols
--- dpdk-18.11.6/debian/librte-cfgfile18.11.symbols	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/librte-cfgfile18.11.symbols	2020-05-21 11:12:16.000000000 +0100
@@ -17,5 +17,6 @@
  rte_cfgfile_section_entries@DPDK_2.0 16.04
  rte_cfgfile_section_entries_by_index@DPDK_16.04 16.04
  rte_cfgfile_section_num_entries@DPDK_2.0 16.04
+ rte_cfgfile_section_num_entries_by_index@DPDK_2.0 18.11.8
  rte_cfgfile_sections@DPDK_2.0 16.04
  rte_cfgfile_set_entry@DPDK_17.11 17.11
diff -Nru dpdk-18.11.6/debian/patches/0004-build-bump-minimum-Meson-version-to-0.47.1.patch dpdk-18.11.8/debian/patches/0004-build-bump-minimum-Meson-version-to-0.47.1.patch
--- dpdk-18.11.6/debian/patches/0004-build-bump-minimum-Meson-version-to-0.47.1.patch	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/0004-build-bump-minimum-Meson-version-to-0.47.1.patch	2020-05-21 11:12:16.000000000 +0100
@@ -35,7 +35,7 @@
 --- a/meson.build
 +++ b/meson.build
 @@ -5,7 +5,7 @@
- 	version: '18.11.6',
+ 	version: '18.11.8',
  	license: 'BSD',
  	default_options: ['buildtype=release', 'default_library=static'],
 -	meson_version: '>= 0.41'
diff -Nru dpdk-18.11.6/debian/patches/0008-Revert-common-octeontx-add-missing-public-symbol.patch dpdk-18.11.8/debian/patches/0008-Revert-common-octeontx-add-missing-public-symbol.patch
--- dpdk-18.11.6/debian/patches/0008-Revert-common-octeontx-add-missing-public-symbol.patch	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/0008-Revert-common-octeontx-add-missing-public-symbol.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-Author: Luca Boccassi <luca.boccassi@microsoft.com>
-Description: Revert "common/octeontx: add missing public symbol"
- This reverts commit bd979fff652326e042c21aaaf3df1f515ffdff6e.
- It changed the version of the symbol from @Base to @DPDK_18.05
- which breaks ABI compatibility.
-Forwarded: yes
---- a/drivers/common/octeontx/rte_common_octeontx_version.map
-+++ b/drivers/common/octeontx/rte_common_octeontx_version.map
-@@ -1,7 +1,6 @@
- DPDK_18.05 {
- 	global:
- 
--	octeontx_logtype_mbox;
- 	octeontx_mbox_set_ram_mbox_base;
- 	octeontx_mbox_set_reg;
- 	octeontx_mbox_send;
diff -Nru dpdk-18.11.6/debian/patches/0009-vhost-check-log-mmap-offset-and-size-overflow.patch dpdk-18.11.8/debian/patches/0009-vhost-check-log-mmap-offset-and-size-overflow.patch
--- dpdk-18.11.6/debian/patches/0009-vhost-check-log-mmap-offset-and-size-overflow.patch	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/0009-vhost-check-log-mmap-offset-and-size-overflow.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-Author: Maxime Coquelin <maxime.coquelin@redhat.com>
-Description: vhost: check log mmap offset and size overflow
- vhost_user_set_log_base() is a message handler that is
- called to handle the VHOST_USER_SET_LOG_BASE message.
- Its payload contains a 64 bit size and offset. Both are
- added up and used as a size when calling mmap().
- 
- There is no integer overflow check. If an integer overflow
- occurs a smaller memory map would be created than
- requested. Since the returned mapping is mapped as writable
- and used for logging, a memory corruption could occur.
- 
- This issue has been assigned CVE-2020-10722
-Upstream: yes
---- a/lib/librte_vhost/vhost_user.c
-+++ b/lib/librte_vhost/vhost_user.c
-@@ -1602,10 +1602,10 @@
- 	size = msg->payload.log.mmap_size;
- 	off  = msg->payload.log.mmap_offset;
- 
--	/* Don't allow mmap_offset to point outside the mmap region */
--	if (off > size) {
-+	/* Check for mmap size and offset overflow. */
-+	if (off >= -size) {
- 		RTE_LOG(ERR, VHOST_CONFIG,
--			"log offset %#"PRIx64" exceeds log size %#"PRIx64"\n",
-+			"log offset %#"PRIx64" and log size %#"PRIx64" overflow\n",
- 			off, size);
- 		return VH_RESULT_ERR;
- 	}
diff -Nru dpdk-18.11.6/debian/patches/0010-vhost-fix-vring-index-check.patch dpdk-18.11.8/debian/patches/0010-vhost-fix-vring-index-check.patch
--- dpdk-18.11.6/debian/patches/0010-vhost-fix-vring-index-check.patch	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/0010-vhost-fix-vring-index-check.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-Author: Maxime Coquelin <maxime.coquelin@redhat.com>
-Description: vhost: fix vring index check
- vhost_user_check_and_alloc_queue_pair() is used to extract
- a vring index from a payload. This function validates the
- index and is called early on in when performing message
- handling. Most message handlers depend on it correctly
- validating the vring index.
- 
- Depending on the message type the vring index is in
- different parts of the payload. The function contains a
- switch/case for each type and copies the index. This is
- stored in a uint16. This index is then validated. Depending
- on the message, the source index is an unsigned int. If
- integer truncation occurs (uint->uint16) the top 16 bits
- of the index are never validated.
- 
- When they are used later on  (e.g. in
- vhost_user_set_vring_num() or vhost_user_set_vring_addr())
- it can lead to out of bound indexing. The out of bound
- indexed data gets written to, and hence this can cause
- memory corruption.
- 
- This patch fixes this vulnerability by declaring vring
- index as an unsigned int in
- vhost_user_check_and_alloc_queue_pair().
- 
- This issue has been assigned CVE-2020-10723
-Upstream: yes
---- a/lib/librte_vhost/vhost_user.c
-+++ b/lib/librte_vhost/vhost_user.c
-@@ -2049,7 +2049,7 @@
- vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev,
- 			struct VhostUserMsg *msg)
- {
--	uint16_t vring_idx;
-+	uint32_t vring_idx;
- 
- 	switch (msg->request.master) {
- 	case VHOST_USER_SET_VRING_KICK:
diff -Nru dpdk-18.11.6/debian/patches/0011-vhost-crypto-validate-keys-lengths.patch dpdk-18.11.8/debian/patches/0011-vhost-crypto-validate-keys-lengths.patch
--- dpdk-18.11.6/debian/patches/0011-vhost-crypto-validate-keys-lengths.patch	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/0011-vhost-crypto-validate-keys-lengths.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,58 +0,0 @@
-Author: Maxime Coquelin <maxime.coquelin@redhat.com>
-Description: vhost/crypto: validate keys lengths
- transform_cipher_param() and transform_chain_param() handle
- the payload data for the VHOST_USER_CRYPTO_CREATE_SESS
- message. These payloads have to be validated, since it
- could come from untrusted sources.
- 
- Two buffers and their lenghts are defined in this payload,
- one the the auth key and one for the cipher key. But above
- functions do not validate the key length inputs, which could
- lead to read out of bounds, as buffers have static sizes of
- 64 bytes for the cipher key and 512 bytes for the auth key.
- 
- This patch adds necessary checks on the key length field
- before being used.
- 
- This issue has been assigned CVE-2020-10724
-Upstream: yes
---- a/lib/librte_vhost/vhost_crypto.c
-+++ b/lib/librte_vhost/vhost_crypto.c
-@@ -236,6 +236,11 @@
- 	if (unlikely(ret < 0))
- 		return ret;
- 
-+	if (param->cipher_key_len > VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH) {
-+		VC_LOG_DBG("Invalid cipher key length\n");
-+		return -VIRTIO_CRYPTO_BADMSG;
-+	}
-+
- 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
- 	xform->cipher.key.length = param->cipher_key_len;
- 	if (xform->cipher.key.length > 0)
-@@ -286,6 +291,12 @@
- 			&xform_cipher->cipher.algo);
- 	if (unlikely(ret < 0))
- 		return ret;
-+
-+	if (param->cipher_key_len > VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH) {
-+		VC_LOG_DBG("Invalid cipher key length\n");
-+		return -VIRTIO_CRYPTO_BADMSG;
-+	}
-+
- 	xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
- 	xform_cipher->cipher.key.length = param->cipher_key_len;
- 	xform_cipher->cipher.key.data = param->cipher_key_buf;
-@@ -300,6 +311,12 @@
- 	ret = auth_algo_transform(param->hash_algo, &xform_auth->auth.algo);
- 	if (unlikely(ret < 0))
- 		return ret;
-+
-+	if (param->auth_key_len > VHOST_USER_CRYPTO_MAX_HMAC_KEY_LENGTH) {
-+		VC_LOG_DBG("Invalid auth key length\n");
-+		return -VIRTIO_CRYPTO_BADMSG;
-+	}
-+
- 	xform_auth->auth.digest_length = param->digest_len;
- 	xform_auth->auth.key.length = param->auth_key_len;
- 	xform_auth->auth.key.data = param->auth_key_buf;
diff -Nru dpdk-18.11.6/debian/patches/series dpdk-18.11.8/debian/patches/series
--- dpdk-18.11.6/debian/patches/series	2020-05-15 11:59:24.000000000 +0100
+++ dpdk-18.11.8/debian/patches/series	2020-05-21 11:12:16.000000000 +0100
@@ -2,7 +2,3 @@
 0005-build-use-dependency-instead-of-find_library.patch
 0006-build-reorder-libraries-and-build-eal-before-cmdline.patch
 0007-build-use-dependency-for-libbsd-instead-of-manual-ap.patch
-0008-Revert-common-octeontx-add-missing-public-symbol.patch
-0009-vhost-check-log-mmap-offset-and-size-overflow.patch
-0010-vhost-fix-vring-index-check.patch
-0011-vhost-crypto-validate-keys-lengths.patch
diff -Nru dpdk-18.11.6/devtools/cocci.sh dpdk-18.11.8/devtools/cocci.sh
--- dpdk-18.11.6/devtools/cocci.sh	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/devtools/cocci.sh	2020-05-18 15:00:53.000000000 +0100
@@ -1,34 +1,6 @@
 #! /bin/sh
-
-# BSD LICENSE
-#
-# Copyright 2015 EZchip Semiconductor Ltd.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-#   * Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer.
-#   * Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in
-#     the documentation and/or other materials provided with the
-#     distribution.
-#   * Neither the name of EZchip Semiconductor nor the names of its
-#     contributors may be used to endorse or promote products derived
-#     from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright 2015-2020 Mellanox Technologies, Ltd
 
 # Apply coccinelle transforms.
 
diff -Nru dpdk-18.11.6/doc/api/meson.build dpdk-18.11.8/doc/api/meson.build
--- dpdk-18.11.6/doc/api/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/api/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -3,53 +3,54 @@
 
 doxygen = find_program('doxygen', required: get_option('enable_docs'))
 
-if doxygen.found()
-	# due to the CSS customisation script, which needs to run on a file that
-	# is in a subdirectory that is created at build time and thus it cannot
-	# be an individual custom_target, we need to wrap the doxygen call in a
-	# script to run the CSS modification afterwards
-	generate_doxygen = find_program('generate_doxygen.sh')
-	generate_examples = find_program('generate_examples.sh')
-	generate_css = find_program('doxy-html-custom.sh')
-
-	inputdir = join_paths(meson.source_root(), 'examples')
-	htmldir = join_paths('share', 'doc', 'dpdk')
-
-	# due to the following bug: https://github.com/mesonbuild/meson/issues/4107
-	# if install is set to true it will override build_by_default and it will
-	# cause the target to always be built. If install were to be always set to
-	# false it would be impossible to install the docs.
-	# So use a configure option for now.
-	example = custom_target('examples.dox',
-		input: inputdir,
-		output: 'examples.dox',
-		command: [generate_examples, '@INPUT@', '@OUTPUT@'],
-		install: get_option('enable_docs'),
-		install_dir: htmldir,
-		build_by_default: get_option('enable_docs'))
-
-	cdata = configuration_data()
-	cdata.set('VERSION', meson.project_version())
-	cdata.set('API_EXAMPLES', join_paths(meson.build_root(), 'doc', 'api', 'examples.dox'))
-	cdata.set('OUTPUT', join_paths(meson.build_root(), 'doc', 'api'))
-	cdata.set('HTML_OUTPUT', 'api')
-	cdata.set('TOPDIR', meson.source_root())
-	cdata.set('STRIP_FROM_PATH', meson.source_root())
-
-	doxy_conf = configure_file(input: 'doxy-api.conf.in',
-		output: 'doxy-api.conf',
-		configuration: cdata,
-		install: false)
-
-	doxy_build = custom_target('doxygen',
-		depends: example,
-		input: doxy_conf,
-		output: 'api',
-		command: [generate_doxygen, '@INPUT@', '@OUTPUT@', generate_css],
-		install: get_option('enable_docs'),
-		install_dir: htmldir,
-		build_by_default: get_option('enable_docs'))
-
-	doc_targets += doxy_build
-	doc_target_names += 'Doxygen_API'
+if not doxygen.found()
+  subdir_done()
 endif
+
+# due to the CSS customisation script, which needs to run on a file that
+# is in a subdirectory that is created at build time and thus it cannot
+# be an individual custom_target, we need to wrap the doxygen call in a
+# script to run the CSS modification afterwards
+generate_doxygen = find_program('generate_doxygen.sh')
+generate_examples = find_program('generate_examples.sh')
+generate_css = find_program('doxy-html-custom.sh')
+
+inputdir = join_paths(meson.source_root(), 'examples')
+htmldir = join_paths('share', 'doc', 'dpdk')
+
+# due to the following bug: https://github.com/mesonbuild/meson/issues/4107
+# if install is set to true it will override build_by_default and it will
+# cause the target to always be built. If install were to be always set to
+# false it would be impossible to install the docs.
+# So use a configure option for now.
+example = custom_target('examples.dox',
+	input: inputdir,
+	output: 'examples.dox',
+	command: [generate_examples, '@INPUT@', '@OUTPUT@'],
+	install: get_option('enable_docs'),
+	install_dir: htmldir,
+	build_by_default: get_option('enable_docs'))
+
+cdata = configuration_data()
+cdata.set('VERSION', meson.project_version())
+cdata.set('API_EXAMPLES', join_paths(meson.build_root(), 'doc', 'api', 'examples.dox'))
+cdata.set('OUTPUT', join_paths(meson.build_root(), 'doc', 'api'))
+cdata.set('HTML_OUTPUT', 'api')
+cdata.set('TOPDIR', meson.source_root())
+cdata.set('STRIP_FROM_PATH', meson.source_root())
+
+doxy_conf = configure_file(input: 'doxy-api.conf.in',
+	output: 'doxy-api.conf',
+	configuration: cdata)
+
+doxy_build = custom_target('doxygen',
+	depends: example,
+	input: doxy_conf,
+	output: 'api',
+	command: [generate_doxygen, '@INPUT@', '@OUTPUT@', generate_css],
+	install: get_option('enable_docs'),
+	install_dir: htmldir,
+	build_by_default: get_option('enable_docs'))
+
+doc_targets += doxy_build
+doc_target_names += 'Doxygen_API'
diff -Nru dpdk-18.11.6/doc/guides/conf.py dpdk-18.11.8/doc/guides/conf.py
--- dpdk-18.11.6/doc/guides/conf.py	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/guides/conf.py	2020-05-18 15:00:53.000000000 +0100
@@ -241,7 +241,7 @@
                                                                 ini_filename))
                 continue
 
-            if value is not '':
+            if value:
                 # Get the first letter only.
                 ini_data[ini_filename][name] = value[0]
 
diff -Nru dpdk-18.11.6/doc/guides/meson.build dpdk-18.11.8/doc/guides/meson.build
--- dpdk-18.11.6/doc/guides/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/guides/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -3,26 +3,28 @@
 
 sphinx = find_program('sphinx-build', required: get_option('enable_docs'))
 
-if sphinx.found()
-	htmldir = join_paths('share', 'doc', 'dpdk')
-	html_guides_build = custom_target('html_guides_build',
-		input: meson.current_source_dir(),
-		output: 'guides',
-		command: [sphinx, '-b', 'html',
-			'-d', meson.current_build_dir() + '/.doctrees',
-			'@INPUT@', meson.current_build_dir() + '/guides'],
-		build_by_default: get_option('enable_docs'),
-		install: get_option('enable_docs'),
-		install_dir: htmldir)
+if not sphinx.found()
+	subdir_done()
+endif
 
-	doc_targets += html_guides_build
-	doc_target_names += 'HTML_Guides'
+htmldir = join_paths('share', 'doc', 'dpdk')
+html_guides = custom_target('html_guides',
+	input: meson.current_source_dir(),
+	output: 'guides',
+	command: [sphinx, '-b', 'html',
+		'-d', meson.current_build_dir() + '/.doctrees',
+		'@INPUT@', meson.current_build_dir() + '/guides'],
+	build_by_default: get_option('enable_docs'),
+	install: get_option('enable_docs'),
+	install_dir: htmldir)
 
-	# sphinx leaves a .buildinfo in the target directory, which we don't
-	# want to install. Note that sh -c has to be used, otherwise the
-	# env var does not get expanded if calling rm/install directly.
-	meson.add_install_script('sh', '-c',
-		'rm -f $MESON_INSTALL_DESTDIR_PREFIX/share/doc/dpdk/guides/.buildinfo')
-	meson.add_install_script('sh', '-c',
-		'install -D -m0644 $MESON_SOURCE_ROOT/doc/guides/custom.css $MESON_INSTALL_DESTDIR_PREFIX/share/doc/dpdk/guides/_static/css/custom.css')
-endif
+doc_targets += html_guides
+doc_target_names += 'HTML_Guides'
+
+# sphinx leaves a .buildinfo in the target directory, which we don't
+# want to install. Note that sh -c has to be used, otherwise the
+# env var does not get expanded if calling rm/install directly.
+meson.add_install_script('sh', '-c',
+	'rm -f $MESON_INSTALL_DESTDIR_PREFIX/share/doc/dpdk/guides/.buildinfo')
+meson.add_install_script('sh', '-c',
+	'install -D -m0644 $MESON_SOURCE_ROOT/doc/guides/custom.css $MESON_INSTALL_DESTDIR_PREFIX/share/doc/dpdk/guides/_static/css/custom.css')
diff -Nru dpdk-18.11.6/doc/guides/nics/mlx5.rst dpdk-18.11.8/doc/guides/nics/mlx5.rst
--- dpdk-18.11.6/doc/guides/nics/mlx5.rst	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/guides/nics/mlx5.rst	2020-05-18 15:00:53.000000000 +0100
@@ -92,21 +92,18 @@
     process. If the external memory is registered by primary process but has
     different virtual address in secondary process, unexpected error may happen.
 
-- Flow pattern without any specific vlan will match for vlan packets as well:
+- When using Verbs flow engine (``dv_flow_en`` = 0), flow pattern without any
+  specific VLAN will match for VLAN packets as well:
 
   When VLAN spec is not specified in the pattern, the matching rule will be created with VLAN as a wild card.
   Meaning, the flow rule::
 
         flow create 0 ingress pattern eth / vlan vid is 3 / ipv4 / end ...
 
-  Will only match vlan packets with vid=3. and the flow rules::
+  Will only match vlan packets with vid=3. and the flow rule::
 
         flow create 0 ingress pattern eth / ipv4 / end ...
 
-  Or::
-
-        flow create 0 ingress pattern eth / vlan / ipv4 / end ...
-
   Will match any ipv4 packet (VLAN included).
 
 - A multi segment packet must have less than 6 segments in case the Tx burst function
diff -Nru dpdk-18.11.6/doc/guides/prog_guide/img/ring-mp-enqueue3.svg dpdk-18.11.8/doc/guides/prog_guide/img/ring-mp-enqueue3.svg
--- dpdk-18.11.6/doc/guides/prog_guide/img/ring-mp-enqueue3.svg	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/guides/prog_guide/img/ring-mp-enqueue3.svg	2020-05-18 15:00:53.000000000 +0100
@@ -16,7 +16,7 @@
    height="403.06647"
    id="svg3388"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)"
    sodipodi:docname="ring-mp-enqueue3.svg">
   <defs
      id="defs3390">
@@ -359,15 +359,15 @@
      inkscape:pageshadow="2"
      inkscape:zoom="1.4"
      inkscape:cx="201.35119"
-     inkscape:cy="221.79811"
+     inkscape:cy="107.5124"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="958"
-     inkscape:window-height="1002"
-     inkscape:window-x="223"
-     inkscape:window-y="22"
-     inkscape:window-maximized="0"
+     inkscape:window-width="1313"
+     inkscape:window-height="713"
+     inkscape:window-x="53"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
      inkscape:snap-grids="false"
      inkscape:snap-to-guides="true"
      showguides="false"
@@ -382,8 +382,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="-162.97143px"
-       originy="-370.03525px" />
+       originx="-162.97143"
+       originy="-370.03525"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata3393">
@@ -393,7 +395,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -490,37 +492,37 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="313.90488"
        y="495.49646"
-       id="text4269"
-       sodipodi:linespacing="125%"><tspan
+       id="text4269"><tspan
          sodipodi:role="line"
          id="tspan4271"
          x="313.90488"
-         y="495.49646">obj1</tspan></text>
+         y="495.49646"
+         style="font-size:14px;line-height:1.25">obj1</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="368.95203"
        y="495.49646"
-       id="text4269-4"
-       sodipodi:linespacing="125%"><tspan
+       id="text4269-4"><tspan
          sodipodi:role="line"
          id="tspan4271-5"
          x="368.95203"
-         y="495.49646">obj2</tspan></text>
+         y="495.49646"
+         style="font-size:14px;line-height:1.25">obj2</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="422.99518"
        y="495.49646"
-       id="text4269-5"
-       sodipodi:linespacing="125%"><tspan
+       id="text4269-5"><tspan
          sodipodi:role="line"
          id="tspan4271-4"
          x="422.99518"
-         y="495.49646">obj3</tspan></text>
+         y="495.49646"
+         style="font-size:14px;line-height:1.25">obj3</tspan></text>
     <path
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
        d="m 323.57143,578.07647 0,-42.14286"
@@ -533,48 +535,48 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="289.85715"
        y="589.505"
-       id="text4787"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787"><tspan
          sodipodi:role="line"
          id="tspan4789"
          x="289.85715"
-         y="589.505">cons_head</tspan></text>
+         y="589.505"
+         style="font-size:14px;line-height:1.25">cons_head</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="293.45334"
        y="603.41034"
-       id="text4787-3"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3"><tspan
          sodipodi:role="line"
          id="tspan4789-0"
          x="293.45334"
-         y="603.41034">cons_tail</tspan></text>
+         y="603.41034"
+         style="font-size:14px;line-height:1.25">cons_tail</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
-       x="527.01239"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+       x="567.01239"
        y="587.9577"
-       id="text4787-7"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-7"><tspan
          sodipodi:role="line"
          id="tspan4789-8"
-         x="527.01239"
-         y="587.9577">prod_head</tspan></text>
+         x="567.01239"
+         y="587.9577"
+         style="font-size:14px;line-height:1.25">prod_head</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="460.7514"
        y="602.57739"
-       id="text4787-3-6"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3-6"><tspan
          sodipodi:role="line"
          id="tspan4789-0-8"
          x="460.7514"
-         y="602.57739">prod_tail</tspan></text>
+         y="602.57739"
+         style="font-size:14px;line-height:1.25">prod_tail</tspan></text>
     <rect
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial"
        id="rect4889"
@@ -586,19 +588,20 @@
        ry="11.631636" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="174.28571"
        y="328.93362"
-       id="text4891"
-       sodipodi:linespacing="125%"><tspan
+       id="text4891"><tspan
          sodipodi:role="line"
          id="tspan4893"
          x="174.28571"
-         y="328.93362">local variables</tspan><tspan
+         y="328.93362"
+         style="font-size:14px;line-height:1.25">local variables</tspan><tspan
          sodipodi:role="line"
          x="174.28571"
          y="346.43362"
-         id="tspan4150">core 2</tspan></text>
+         id="tspan4150"
+         style="font-size:14px;line-height:1.25">core 2</tspan></text>
     <rect
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial"
        id="rect4889-8"
@@ -610,15 +613,15 @@
        ry="11.631636" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="170.89287"
-       y="682.09021"
-       id="text4891-4"
-       sodipodi:linespacing="125%"><tspan
+       y="664.09021"
+       id="text4891-4"><tspan
          sodipodi:role="line"
          id="tspan4893-3"
          x="170.89287"
-         y="682.09021">structure state</tspan></text>
+         y="664.09021"
+         style="font-size:14px;line-height:1.25">structure state</tspan></text>
     <path
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
        d="m 325.25296,407.43361 0,42.14286"
@@ -631,37 +634,37 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="296.992"
        y="401.48123"
-       id="text4787-3-64"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3-64"><tspan
          sodipodi:role="line"
          id="tspan4789-0-9"
          x="296.992"
-         y="401.48123">cons_tail</tspan></text>
+         y="401.48123"
+         style="font-size:14px;line-height:1.25">cons_tail</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="440.26532"
        y="401.48123"
-       id="text4787-7-5"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-7-5"><tspan
          sodipodi:role="line"
          id="tspan4789-8-0"
          x="440.26532"
-         y="401.48123">prod_head</tspan></text>
+         y="401.48123"
+         style="font-size:14px;line-height:1.25">prod_head</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="522.43298"
        y="401.48123"
-       id="text4787-3-6-4"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3-6-4"><tspan
          sodipodi:role="line"
          id="tspan4789-0-8-8"
          x="522.43298"
-         y="401.48123">prod_next</tspan></text>
+         y="401.48123"
+         style="font-size:14px;line-height:1.25">prod_next</tspan></text>
     <path
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
        d="m 537.14285,407.43361 0,42.14286"
@@ -678,19 +681,20 @@
        ry="11.631636" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="174.65646"
        y="398.23306"
-       id="text4891-3"
-       sodipodi:linespacing="125%"><tspan
+       id="text4891-3"><tspan
          sodipodi:role="line"
          id="tspan4893-1"
          x="174.65646"
-         y="398.23306">local variables</tspan><tspan
+         y="398.23306"
+         style="font-size:14px;line-height:1.25">local variables</tspan><tspan
          sodipodi:role="line"
          x="174.65646"
          y="415.73306"
-         id="tspan4152">core 1</tspan></text>
+         id="tspan4152"
+         style="font-size:14px;line-height:1.25">core 1</tspan></text>
     <path
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
        d="m 326.73097,334.53006 0,42.14286"
@@ -703,37 +707,37 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="298.47"
        y="328.57767"
-       id="text4787-3-64-5"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3-64-5"><tspan
          sodipodi:role="line"
          id="tspan4789-0-9-0"
          x="298.47"
-         y="328.57767">cons_tail</tspan></text>
+         y="328.57767"
+         style="font-size:14px;line-height:1.25">cons_tail</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="489.02905"
        y="328.57767"
-       id="text4787-7-5-3"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-7-5-3"><tspan
          sodipodi:role="line"
          id="tspan4789-8-0-6"
          x="489.02905"
-         y="328.57767">prod_head</tspan></text>
+         y="328.57767"
+         style="font-size:14px;line-height:1.25">prod_head</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="571.19672"
        y="328.57767"
-       id="text4787-3-6-4-1"
-       sodipodi:linespacing="125%"><tspan
+       id="text4787-3-6-4-1"><tspan
          sodipodi:role="line"
          id="tspan4789-0-8-8-0"
          x="571.19672"
-         y="328.57767">prod_next</tspan></text>
+         y="328.57767"
+         style="font-size:14px;line-height:1.25">prod_next</tspan></text>
     <path
        style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
        d="m 587.90657,334.53006 0,42.14286"
@@ -741,45 +745,46 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="447.85715"
        y="289.505"
-       id="text3320"
-       sodipodi:linespacing="125%"><tspan
+       id="text3320"><tspan
          sodipodi:role="line"
          id="tspan3322"
          x="447.85715"
-         y="289.505">compare and swap succeeds</tspan><tspan
+         y="289.505"
+         style="font-size:14px;line-height:1.25">compare and swap succeeds</tspan><tspan
          sodipodi:role="line"
          x="447.85715"
          y="307.005"
-         id="tspan3324">on core 2</tspan></text>
+         id="tspan3324"
+         style="font-size:14px;line-height:1.25">on core 2</tspan></text>
     <path
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial"
-       d="m 542.85715,575.57647 0,-42.14286"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14px;line-height:125%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 602.85715,575.57647 V 533.43361"
        id="path4309-4-0"
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="477.22983"
        y="495.49646"
-       id="text4269-5-5"
-       sodipodi:linespacing="125%"><tspan
+       id="text4269-5-5"><tspan
          sodipodi:role="line"
          id="tspan4271-4-5"
          x="477.22983"
-         y="495.49646">obj4</tspan></text>
+         y="495.49646"
+         style="font-size:14px;line-height:1.25">obj4</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="531.27301"
        y="496.00156"
-       id="text4269-5-7"
-       sodipodi:linespacing="125%"><tspan
+       id="text4269-5-7"><tspan
          sodipodi:role="line"
          id="tspan4271-4-6"
          x="531.27301"
-         y="496.00156">obj5</tspan></text>
+         y="496.00156"
+         style="font-size:14px;line-height:1.25">obj5</tspan></text>
   </g>
 </svg>
diff -Nru dpdk-18.11.6/doc/guides/rel_notes/release_18_11.rst dpdk-18.11.8/doc/guides/rel_notes/release_18_11.rst
--- dpdk-18.11.6/doc/guides/rel_notes/release_18_11.rst	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/doc/guides/rel_notes/release_18_11.rst	2020-05-18 15:00:53.000000000 +0100
@@ -2704,3 +2704,356 @@
 * dcfbc594f7  net/iavf: fix queue interrupt for ice
 * 6977f14517  app/testpmd: fix missing GENEVE item in raw encap
 * e6d3c0928   eal/freebsd: fix config creation
+
+18.11.7 Release Notes
+---------------------
+
+18.11.7 Fixes
+~~~~~~~~~~~~~
+
+* acl: fix 32-bit match for range field
+* app/eventdev: fix pipeline test with meson build
+* app/pdump: fix build with clang
+* app/testpmd: call cleanup on exit
+* app/testpmd: fix device mcast list error handling
+* app/testpmd: fix hot-unplug detaching
+* app/testpmd: fix identifier size for port attach
+* app/testpmd: fix initial value when setting PFC
+* app/testpmd: fix uninitialized members of MPLS
+* app/testpmd: fix uninitialized members when setting PFC
+* bpf: fix headers install with meson
+* build: explicitly enable sse4 for meson
+* bus/fslmc: remove conflicting memory barrier macro
+* cfgfile: fix symbols map
+* common/cpt: check cipher and auth keys are set
+* common/cpt: fix component for empty IOV buffer
+* common/cpt: remove redundant code in datapath
+* crypto/armv8: fix clang build
+* crypto/ccp: fix queue alignment
+* doc: fix build with python 3.8
+* doc: fix multi-producer enqueue figure in ring guide
+* doc: fix warning with meson
+* doc: reduce indentation in meson build file
+* doc: reduce whitespace in meson build file
+* doc: remove temporary files and directories
+* drivers/crypto: fix session-less mode
+* eal/linux: fix build error on RHEL 7.6
+* eal/linux: fix uninitialized data valgrind warning
+* ethdev: fix callback unregister with wildcard argument list
+* ethdev: fix secondary process memory overwrite
+* ethdev: fix switching domain allocation
+* event/dsw: avoid credit leak on oversized enqueue bursts
+* event/dsw: flush buffers immediately on zero-sized enqueue
+* examples/ethtool: fix unchecked return value
+* examples/fips_validation: fix AES-GCM cipher length parsing
+* examples/fips_validation: fix cipher length for AES-GCM
+* examples/fips_validation: fix string token for CT length
+* examples/ipsec-secgw: fix crash on unsupported algo
+* examples/l3fwd-power: fix a typo
+* examples/l3fwd-power: fix interrupt disable
+* examples/tep_term: remove redundant info get
+* fix Mellanox copyright and SPDX tag
+* kni: fix build with Linux 5.6
+* kni: fix ethtool build for kernel 5.5
+* kni: fix meson warning about console keyword
+* kni: fix not contiguous FIFO
+* kni: rename variable with namespace prefix
+* latency: fix calculation for multi-thread
+* lib: fix unnecessary double negation
+* maintainers: resign from flow API maintenance
+* maintainers: update for failsafe and PCI library
+* maintainers: update for stable branches
+* mem: fix munmap in error unwind
+* mempool: fix anonymous populate
+* mk: avoid combining -r and -export-dynamic linker options
+* net/bnx2x: fix reset of scan FP flag
+* net/bnx2x: fix to sync fastpath Rx queue access
+* net/bnx2x: fix VLAN stripped flag
+* net/bnxt: do not log error if stats queried before start
+* net/bnxt: fix alloc filter to use a common routine
+* net/bnxt: fix buffer allocation reattempt
+* net/bnxt: fix crash in secondary process
+* net/bnxt: fix default timeout for getting FW version
+* net/bnxt: fix flow creation
+* net/bnxt: fix IOVA mapping
+* net/bnxt: fix link during port toggle
+* net/bnxt: fix probe in FreeBSD
+* net/bnxt: remove redundant if statement
+* net/bnxt: remove unnecessary memset
+* net/bnxt: use macro for PCI log format
+* net/cxgbe: announce Tx multi-segments offload
+* net/dpaa: fix Rx offload flags on jumbo MTU set
+* net/failsafe: fix reported hash key size in device info
+* net/fm10k: fix descriptor VLAN field filling in Tx
+* net/fm10k: fix non-x86 build
+* net/i40e/base: fix buffer address
+* net/i40e/base: fix error message
+* net/i40e/base: fix retrying logic
+* net/i40e/base: fix Tx descriptors number
+* net/i40e: fix Tx when TSO is enabled
+* net/i40e: fix unchecked Tx cleanup error
+* net/iavf: add TSO offload use basic path
+* net/iavf/base: fix adminq return
+* net/iavf/base: fix command buffer memory leak
+* net/iavf: fix Rx total stats
+* net/iavf: fix virtual channel return
+* net/ixgbe: check for illegal Tx packets
+* net/ixgbe: fix flow control mode setting
+* net/ixgbe: fix link status
+* net/ixgbe: fix link up in FreeBSD
+* net/ixgbe: remove dead code
+* net/ixgbe: remove duplicate function declaration
+* net/mlx5: cache associated network device index
+* net/mlx5: fix L3 VXLAN RSS expansion
+* net/mlx5: fix match on ethertype and CVLAN tag
+* net/mlx5: fix VLAN match for DV mode
+* net/mlx5: fix VXLAN-GPE item translation
+* net/netvsc: fix crash in secondary process
+* net/netvsc: initialize link state
+* net/octeontx: fix memory leak of MAC address table
+* net/qede: do not stop vport if not started
+* net/qede: fix VF reload
+* net/sfc: fix log format specifiers
+* net/tap: fix memory leak when unregister intr handler
+* net/vhost: allocate interface name from heap
+* net/vhost: check creation failure
+* net/vhost: delay driver setup
+* net/vhost: fix probing in secondary process
+* net/vhost: fix setup error path
+* net/vhost: prevent multiple setups on reconfiguration
+* net/virtio: cleanup on demand when in-order Tx
+* net/virtio: fix mbuf data and packet length mismatch
+* net/virtio-user: check file descriptor before closing
+* net/virtio-user: check tap offload setting failure
+* net/virtio-user: do not close tap when disabling queue pairs
+* Revert "common/octeontx: add missing public symbol"
+* Revert "net/mlx5: fix VXLAN-GPE item translation"
+* Revert "net/vhost: delay driver setup"
+* Revert "net/vhost: fix setup error path"
+* Revert "net/vhost: prevent multiple setups on reconfiguration"
+* service: avoid false sharing on core state
+* service: don't walk out of bounds when checking services
+* test/compress: replace test vector
+* test/crypto: fix missing operation status check
+* usertools: fix syntax warning in python 3.8
+* usertools: fix telemetry client with python 3
+* version: 18.11.7-rc1
+* vhost: catch overflow causing mmap of size 0
+* vhost: check message header size read
+* vhost/crypto: fix fetch size
+* vhost: do not treat empty socket message as error
+* vhost: fix crash on port deletion
+* vhost: fix deadlock on port deletion
+* vhost: fix packed virtqueue ready condition
+* vhost: fix socket initial value
+* vhost: protect log address translation in IOTLB update
+
+18.11.7 Validation
+~~~~~~~~~~~~~~~~~~
+
+* Red Hat(R) Testing
+
+   * RHEL 8
+   * Functionality
+
+      * PF assignment
+      * VF assignment
+      * vhost single/multi queues and cross-NUMA
+      * vhostclient reconnect
+      * vhost live migration with single/multi queues and cross-NUMA
+      * OVS PVP
+
+   * Tested NICs
+
+      * X540-AT2 NIC(ixgbe, 10G)
+
+* Intel(R) Testing
+
+   * Basic Intel(R) NIC(ixgbe and i40e) testing
+
+      * PF (i40e)
+      * PF (ixgbe)
+      * VF
+      * Compile Testing
+      * Intel NIC single core/NIC performance
+
+   * Basic cryptodev and virtio testing
+
+      * cryptodev
+      * vhost/virtio basic loopback, PVP and performance test
+
+* Mellanox(R) Testing
+
+   * Basic functionality with testpmd
+
+      * Tx/Rx
+      * xstats
+      * Timestamps
+      * Link status
+      * RTE flow and flow_director
+      * RSS
+      * VLAN stripping and insertion
+      * Checksum/TSO
+      * ptype
+      * Multi-process
+
+   * ConnectX-5
+
+      * RHEL 7.4
+      * Kernel 3.10.0-693.el7.x86_64
+      * Driver MLNX_OFED_LINUX-5.0-1.0.0.0
+      * fw 16.27.1016
+
+   * ConnectX-4 Lx
+
+      * RHEL 7.4
+      * Kernel 3.10.0-693.el7.x86_64
+      * Driver MLNX_OFED_LINUX-5.0-1.0.0.0
+      * fw 14.27.1016
+
+* Intel(R) Testing with Open vSwitch
+
+   * OVS testing with OVS branches 2.12 and 2.11 with VSPERF
+
+   * Tested NICs
+
+      * i40e (X710)
+      * ixgbe (82599ES)
+
+   * Functionality
+
+      * P2P
+      * PVP
+      * Hotplug
+      * Multiqueue
+      * Vhostuserclient reconnect
+      * Vhost cross-NUMA awareness
+      * Jumbo frames
+      * Flow Control
+
+18.11.7 Known Issues
+~~~~~~~~~~~~~~~~~~~~
+
+* DPDK 18.11.7 contains fixes up to DPDK v20.02. Issues identified/fixed in DPDK master branch after DPDK v20.02 may be present in DPDK 18.11.7
+
+18.11.7 Fixes skipped and status unresolved
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* dcfbc594f  net/iavf: fix queue interrupt for ice
+* b149a7064  eal/freebsd: add config reattach in secondary process
+* a135e050a  examples/ipsec-secgw: fix packet length
+* 9d10f53e4  test/metrics: fix second run
+* ea81c1b81  net/mlx5: fix NVGRE matching
+* 721c95301  net/mlx5: fix Rx scatter mode validation
+* be048a1aa  net/virtio: fix descriptor addressed in Tx
+* 6080796f6  mem: make base address hint OS specific
+* 6d3f9917f  eal: fix memory config allocation for multi-process
+* 1526dd053  net/virtio: fix Tx checksum offloads
+* f0617163b  mempool/dpaa2: report error on endless loop in mbuf release
+* 05817057f  net/ena: fix indication of bad L4 Rx checksums
+* 9e0d81c1a  net/mlx5: fix selection between encap and decap
+* 7392ad06f  app/testpmd: use better randomness for Tx split
+* e6d3c0928  eal/freebsd: fix config creation
+* dcd05da0a  app/testpmd: fix GENEVE flow item
+* 2e02a2aff  ethdev: fix VLAN offloads set if no driver callback
+* ec8615607  crypto/dpaa_sec: fix IOVA conversions
+* 06387be8e  net/mlx5: fix encap/decap validation
+* 7593cf1d3  net/mlx5: fix legacy multi-packet write session
+* e21492a51  net/mlx: fix overlinking with meson and glue dlopen
+* 150c9ac2d  app/testpmd: update Rx offload after setting MTU
+* 207b1c813  test: fix build without ring PMD
+* 819d0d1d5  net/ixgbe: fix blocking system events
+* 050bfe033  net/mlx5: fix tunnel flow priority
+
+18.11.8 Release Notes
+---------------------
+
+18.11.8 Fixes
+~~~~~~~~~~~~~
+
+* vhost: check log mmap offset and size overflow
+* vhost/crypto: validate keys lengths
+* vhost: fix vring index check
+
+18.11.8 Validation
+~~~~~~~~~~~~~~~~~~
+
+* Red Hat(R) Testing
+
+   * RHEL 8
+   * Functionality
+
+      * PF assignment
+      * VF assignment
+      * vhost single/multi queues and cross-NUMA
+      * vhostclient reconnect
+      * vhost live migration with single/multi queues and cross-NUMA
+      * OVS PVP
+
+   * Tested NICs
+
+      * X540-AT2 NIC(ixgbe, 10G)
+
+* Intel(R) Testing
+
+   * Virtio features
+
+      * vhost/virtio loopback test with virtio user as server mode
+      * loopback multi queues
+      * loopback multi paths port restart
+      * vhost/virtio pvp multi-paths performance
+      * pvp multi-queues and port restart
+      * vhost dequeue zero copy
+      * pvp share lib
+      * pvp vhost user reconnect
+      * pvp test with 4k pages
+      * pvp test with 2M hugepages
+      * pvp virtio bonding
+      * pvp test with diff qemu version
+      * vhost enqueue interrupt
+      * vhost event idx interrupt
+      * vhost virtio pmd interrupt
+      * vhost virtio user interrupt
+      * virtio event idx interrupt
+      * virtio user for container networking
+      * virtio user as exceptional path
+      * vhost xstats
+      * virtio-pmd multi-process
+      * vm2vm virtio pmd
+      * vm2vm virtio-net iperf
+      * vm2vm virtio-user
+      * vhost user live migration
+
+18.11.8 Known Issues
+~~~~~~~~~~~~~~~~~~~~
+
+* DPDK 18.11.8 contains fixes up to DPDK v20.02 and fixes for CVE-2020-10722, CVE-2020-10723 and CVE-2020-10724
+* Issues identified/fixed in DPDK master branch after DPDK v20.02 may be present in DPDK 18.11.8
+
+18.11.8 Fixes skipped and status unresolved
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* dcfbc594f  net/iavf: fix queue interrupt for ice
+* b149a7064  eal/freebsd: add config reattach in secondary process
+* a135e050a  examples/ipsec-secgw: fix packet length
+* 9d10f53e4  test/metrics: fix second run
+* ea81c1b81  net/mlx5: fix NVGRE matching
+* 721c95301  net/mlx5: fix Rx scatter mode validation
+* be048a1aa  net/virtio: fix descriptor addressed in Tx
+* 6080796f6  mem: make base address hint OS specific
+* 6d3f9917f  eal: fix memory config allocation for multi-process
+* 1526dd053  net/virtio: fix Tx checksum offloads
+* f0617163b  mempool/dpaa2: report error on endless loop in mbuf release
+* 05817057f  net/ena: fix indication of bad L4 Rx checksums
+* 9e0d81c1a  net/mlx5: fix selection between encap and decap
+* 7392ad06f  app/testpmd: use better randomness for Tx split
+* dcd05da0a  app/testpmd: fix GENEVE flow item
+* 2e02a2aff  ethdev: fix VLAN offloads set if no driver callback
+* ec8615607  crypto/dpaa_sec: fix IOVA conversions
+* 06387be8e  net/mlx5: fix encap/decap validation
+* 7593cf1d3  net/mlx5: fix legacy multi-packet write session
+* e21492a51  net/mlx: fix overlinking with meson and glue dlopen
+* 150c9ac2d  app/testpmd: update Rx offload after setting MTU
+* 207b1c813  test: fix build without ring PMD
+* 819d0d1d5  net/ixgbe: fix blocking system events
+* 050bfe033  net/mlx5: fix tunnel flow priority
diff -Nru dpdk-18.11.6/drivers/bus/fslmc/mc/fsl_mc_sys.h dpdk-18.11.8/drivers/bus/fslmc/mc/fsl_mc_sys.h
--- dpdk-18.11.6/drivers/bus/fslmc/mc/fsl_mc_sys.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/bus/fslmc/mc/fsl_mc_sys.h	2020-05-18 15:00:53.000000000 +0100
@@ -32,11 +32,10 @@
 #include <sys/uio.h>
 #include <linux/byteorder/little_endian.h>
 
-#ifndef dmb
-#define dmb() {__asm__ __volatile__("" : : : "memory"); }
-#endif
-#define __iormb()	dmb()
-#define __iowmb()	dmb()
+#include <rte_atomic.h>
+
+#define __iormb()	rte_io_rmb()
+#define __iowmb()	rte_io_wmb()
 #define __arch_getq(a)		(*(volatile uint64_t *)(a))
 #define __arch_putq(v, a)	(*(volatile uint64_t *)(a) = (v))
 #define __arch_putq32(v, a)	(*(volatile uint32_t *)(a) = (v))
diff -Nru dpdk-18.11.6/drivers/common/cpt/cpt_ucode.h dpdk-18.11.8/drivers/common/cpt/cpt_ucode.h
--- dpdk-18.11.6/drivers/common/cpt/cpt_ucode.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/common/cpt/cpt_ucode.h	2020-05-18 15:00:53.000000000 +0100
@@ -89,8 +89,7 @@
 }
 
 static __rte_always_inline int
-cpt_fc_ciph_validate_key(cipher_type_t type, struct cpt_ctx *cpt_ctx,
-		uint16_t key_len)
+cpt_fc_ciph_set_type(cipher_type_t type, struct cpt_ctx *ctx, uint16_t key_len)
 {
 	int fc_type = 0;
 	switch (type) {
@@ -125,7 +124,7 @@
 		if (unlikely(key_len != 16))
 			return -1;
 		/* No support for AEAD yet */
-		if (unlikely(cpt_ctx->hash_type))
+		if (unlikely(ctx->hash_type))
 			return -1;
 		fc_type = ZUC_SNOW3G;
 		break;
@@ -134,14 +133,16 @@
 		if (unlikely(key_len != 16))
 			return -1;
 		/* No support for AEAD yet */
-		if (unlikely(cpt_ctx->hash_type))
+		if (unlikely(ctx->hash_type))
 			return -1;
 		fc_type = KASUMI;
 		break;
 	default:
 		return -1;
 	}
-	return fc_type;
+
+	ctx->fc_type = fc_type;
+	return 0;
 }
 
 static __rte_always_inline void
@@ -181,7 +182,6 @@
 	cpt_ctx->snow3g = 1;
 	gen_key_snow3g(key, keyx);
 	memcpy(cpt_ctx->zs_ctx.ci_key, keyx, key_len);
-	cpt_ctx->fc_type = ZUC_SNOW3G;
 	cpt_ctx->zsk_flags = 0;
 }
 
@@ -192,7 +192,6 @@
 	cpt_ctx->snow3g = 0;
 	memcpy(cpt_ctx->zs_ctx.ci_key, key, key_len);
 	memcpy(cpt_ctx->zs_ctx.zuc_const, zuc_d, 32);
-	cpt_ctx->fc_type = ZUC_SNOW3G;
 	cpt_ctx->zsk_flags = 0;
 }
 
@@ -203,7 +202,6 @@
 	cpt_ctx->k_ecb = 1;
 	memcpy(cpt_ctx->k_ctx.ci_key, key, key_len);
 	cpt_ctx->zsk_flags = 0;
-	cpt_ctx->fc_type = KASUMI;
 }
 
 static __rte_always_inline void
@@ -212,7 +210,6 @@
 {
 	memcpy(cpt_ctx->k_ctx.ci_key, key, key_len);
 	cpt_ctx->zsk_flags = 0;
-	cpt_ctx->fc_type = KASUMI;
 }
 
 static __rte_always_inline int
@@ -222,15 +219,13 @@
 	struct cpt_ctx *cpt_ctx = ctx;
 	mc_fc_context_t *fctx = &cpt_ctx->fctx;
 	uint64_t *ctrl_flags = NULL;
-	int fc_type;
+	int ret;
 
-	/* Validate key before proceeding */
-	fc_type = cpt_fc_ciph_validate_key(type, cpt_ctx, key_len);
-	if (unlikely(fc_type == -1))
+	ret = cpt_fc_ciph_set_type(type, cpt_ctx, key_len);
+	if (unlikely(ret))
 		return -1;
 
-	if (fc_type == FC_GEN) {
-		cpt_ctx->fc_type = FC_GEN;
+	if (cpt_ctx->fc_type == FC_GEN) {
 		ctrl_flags = (uint64_t *)&(fctx->enc.enc_ctrl.flags);
 		*ctrl_flags = rte_be_to_cpu_64(*ctrl_flags);
 		/*
@@ -303,7 +298,7 @@
 		cpt_fc_ciph_set_key_kasumi_f8_cbc(cpt_ctx, key, key_len);
 		goto success;
 	default:
-		break;
+		return -1;
 	}
 
 	/* Only for FC_GEN case */
@@ -382,7 +377,7 @@
 {
 	int32_t j;
 	uint32_t extra_len = extra_buf ? extra_buf->size : 0;
-	uint32_t size = *psize - extra_len;
+	uint32_t size = *psize;
 	buf_ptr_t *bufs;
 
 	bufs = from->bufs;
@@ -391,9 +386,6 @@
 		uint32_t e_len;
 		sg_comp_t *to = &list[i >> 2];
 
-		if (!bufs[j].size)
-			continue;
-
 		if (unlikely(from_offset)) {
 			if (from_offset >= bufs[j].size) {
 				from_offset -= bufs[j].size;
@@ -425,18 +417,19 @@
 				to->u.s.len[i % 4] = rte_cpu_to_be_16(e_len);
 			}
 
+			extra_len = RTE_MIN(extra_len, size);
 			/* Insert extra data ptr */
 			if (extra_len) {
 				i++;
 				to = &list[i >> 2];
 				to->u.s.len[i % 4] =
-					rte_cpu_to_be_16(extra_buf->size);
+					rte_cpu_to_be_16(extra_len);
 				to->ptr[i % 4] =
 					rte_cpu_to_be_64(extra_buf->dma_addr);
-
-				/* size already decremented by extra len */
+				size -= extra_len;
 			}
 
+			next_len = RTE_MIN(next_len, size);
 			/* insert the rest of the data */
 			if (next_len) {
 				i++;
@@ -468,7 +461,6 @@
 {
 	struct cpt_request_info *req;
 	uint32_t size, i;
-	int32_t m_size;
 	uint16_t data_len, mac_len, key_len;
 	auth_type_t hash_type;
 	buf_ptr_t *meta_p;
@@ -498,7 +490,6 @@
 
 	m_vaddr = meta_p->vaddr;
 	m_dma = meta_p->dma_addr;
-	m_size = meta_p->size;
 
 	/*
 	 * Save initial space that followed app data for completion code &
@@ -514,14 +505,12 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	req = m_vaddr;
 
 	size = sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	hash_type = ctx->hash_type;
 	mac_len = ctx->mac_len;
@@ -634,7 +623,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* cpt alternate completion address saved earlier */
 	req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -692,13 +680,11 @@
 	vq_cmd_word3_t vq_cmd_w3;
 	void *c_vaddr;
 	uint64_t c_dma;
-	int32_t m_size;
 	opcode_info_t opcode;
 
 	meta_p = &fc_params->meta_buf;
 	m_vaddr = meta_p->vaddr;
 	m_dma = meta_p->dma_addr;
-	m_size = meta_p->size;
 
 	encr_offset = ENCR_OFFSET(d_offs);
 	auth_offset = AUTH_OFFSET(d_offs);
@@ -734,7 +720,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* start cpt request info struct at 8 byte boundary */
 	size = (uint8_t *)RTE_PTR_ALIGN(m_vaddr, 8) -
@@ -745,7 +730,6 @@
 	size += sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	if (hash_type == GMAC_TYPE)
 		encr_data_len = 0;
@@ -865,7 +849,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		opcode.s.major |= CPT_DMA_MODE;
 
@@ -1013,7 +996,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		/* cpt alternate completion address saved earlier */
 		req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -1063,7 +1045,7 @@
 	uint32_t iv_offset = 0, size;
 	int32_t inputlen, outputlen, enc_dlen, auth_dlen;
 	struct cpt_ctx *cpt_ctx;
-	int32_t hash_type, mac_len, m_size;
+	int32_t hash_type, mac_len;
 	uint8_t iv_len = 16;
 	struct cpt_request_info *req;
 	buf_ptr_t *meta_p, *aad_buf = NULL;
@@ -1081,7 +1063,6 @@
 	meta_p = &fc_params->meta_buf;
 	m_vaddr = meta_p->vaddr;
 	m_dma = meta_p->dma_addr;
-	m_size = meta_p->size;
 
 	encr_offset = ENCR_OFFSET(d_offs);
 	auth_offset = AUTH_OFFSET(d_offs);
@@ -1147,7 +1128,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* start cpt request info structure at 8 byte alignment */
 	size = (uint8_t *)RTE_PTR_ALIGN(m_vaddr, 8) -
@@ -1158,7 +1138,6 @@
 	size += sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* Decryption */
 	opcode.s.major = CPT_MAJOR_OP_FC;
@@ -1245,7 +1224,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		opcode.s.major |= CPT_DMA_MODE;
 
@@ -1394,7 +1372,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		/* cpt alternate completion address saved earlier */
 		req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -1451,7 +1428,7 @@
 	buf_ptr_t *buf_p;
 	uint32_t encr_offset = 0, auth_offset = 0;
 	uint32_t encr_data_len = 0, auth_data_len = 0;
-	int flags, iv_len = 16, m_size;
+	int flags, iv_len = 16;
 	void *m_vaddr, *c_vaddr;
 	uint64_t m_dma, c_dma, offset_ctrl;
 	uint64_t *offset_vaddr, offset_dma;
@@ -1463,7 +1440,6 @@
 	buf_p = &params->meta_buf;
 	m_vaddr = buf_p->vaddr;
 	m_dma = buf_p->dma_addr;
-	m_size = buf_p->size;
 
 	cpt_ctx = params->ctx_buf.vaddr;
 	flags = cpt_ctx->zsk_flags;
@@ -1485,7 +1461,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* Reserve memory for cpt request info */
 	req = m_vaddr;
@@ -1493,7 +1468,6 @@
 	size = sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	opcode.s.major = CPT_MAJOR_OP_ZUC_SNOW3G;
 
@@ -1617,7 +1591,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + OFF_CTRL_LEN + iv_len;
 		m_dma += OFF_CTRL_LEN + iv_len;
-		m_size -= OFF_CTRL_LEN + iv_len;
 
 		opcode.s.major |= CPT_DMA_MODE;
 
@@ -1718,7 +1691,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		/* cpt alternate completion address saved earlier */
 		req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -1772,7 +1744,7 @@
 	buf_ptr_t *buf_p;
 	uint32_t encr_offset;
 	uint32_t encr_data_len;
-	int flags, m_size;
+	int flags;
 	void *m_vaddr, *c_vaddr;
 	uint64_t m_dma, c_dma;
 	uint64_t *offset_vaddr, offset_dma;
@@ -1784,7 +1756,6 @@
 	buf_p = &params->meta_buf;
 	m_vaddr = buf_p->vaddr;
 	m_dma = buf_p->dma_addr;
-	m_size = buf_p->size;
 
 	/*
 	 * Microcode expects offsets in bytes
@@ -1811,7 +1782,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* Reserve memory for cpt request info */
 	req = m_vaddr;
@@ -1819,7 +1789,6 @@
 	size = sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	opcode.s.major = CPT_MAJOR_OP_ZUC_SNOW3G;
 
@@ -1909,7 +1878,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + OFF_CTRL_LEN + iv_len;
 		m_dma += OFF_CTRL_LEN + iv_len;
-		m_size -= OFF_CTRL_LEN + iv_len;
 
 		opcode.s.major |= CPT_DMA_MODE;
 
@@ -1986,7 +1954,6 @@
 
 		m_vaddr = (uint8_t *)m_vaddr + size;
 		m_dma += size;
-		m_size -= size;
 
 		/* cpt alternate completion address saved earlier */
 		req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -2041,7 +2008,7 @@
 	buf_ptr_t *buf_p;
 	uint32_t encr_offset, auth_offset;
 	uint32_t encr_data_len, auth_data_len;
-	int flags, m_size;
+	int flags;
 	uint8_t *iv_s, *iv_d, iv_len = 8;
 	uint8_t dir = 0;
 	void *m_vaddr, *c_vaddr;
@@ -2059,7 +2026,6 @@
 	buf_p = &params->meta_buf;
 	m_vaddr = buf_p->vaddr;
 	m_dma = buf_p->dma_addr;
-	m_size = buf_p->size;
 
 	encr_offset = ENCR_OFFSET(d_offs) / 8;
 	auth_offset = AUTH_OFFSET(d_offs) / 8;
@@ -2092,7 +2058,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* Reserve memory for cpt request info */
 	req = m_vaddr;
@@ -2100,7 +2065,6 @@
 	size = sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	opcode.s.major = CPT_MAJOR_OP_KASUMI | CPT_DMA_MODE;
 
@@ -2128,7 +2092,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + OFF_CTRL_LEN + iv_len;
 	m_dma += OFF_CTRL_LEN + iv_len;
-	m_size -= OFF_CTRL_LEN + iv_len;
 
 	/* DPTR has SG list */
 	in_buffer = m_vaddr;
@@ -2236,7 +2199,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* cpt alternate completion address saved earlier */
 	req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -2288,7 +2250,7 @@
 	buf_ptr_t *buf_p;
 	uint32_t encr_offset;
 	uint32_t encr_data_len;
-	int flags, m_size;
+	int flags;
 	uint8_t dir = 0;
 	void *m_vaddr, *c_vaddr;
 	uint64_t m_dma, c_dma;
@@ -2305,7 +2267,6 @@
 	buf_p = &params->meta_buf;
 	m_vaddr = buf_p->vaddr;
 	m_dma = buf_p->dma_addr;
-	m_size = buf_p->size;
 
 	encr_offset = ENCR_OFFSET(d_offs) / 8;
 	encr_data_len = ENCR_DLEN(d_lens);
@@ -2327,7 +2288,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* Reserve memory for cpt request info */
 	req = m_vaddr;
@@ -2335,7 +2295,6 @@
 	size = sizeof(struct cpt_request_info);
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	opcode.s.major = CPT_MAJOR_OP_KASUMI | CPT_DMA_MODE;
 
@@ -2362,7 +2321,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + OFF_CTRL_LEN + iv_len;
 	m_dma += OFF_CTRL_LEN + iv_len;
-	m_size -= OFF_CTRL_LEN + iv_len;
 
 	/* DPTR has SG list */
 	in_buffer = m_vaddr;
@@ -2431,7 +2389,6 @@
 
 	m_vaddr = (uint8_t *)m_vaddr + size;
 	m_dma += size;
-	m_size -= size;
 
 	/* cpt alternate completion address saved earlier */
 	req->alternate_caddr = (uint64_t *)((uint8_t *)c_vaddr - 8);
@@ -2628,9 +2585,9 @@
 	cipher_type_t enc_type = 0; /* NULL Cipher type */
 	auth_type_t auth_type = 0; /* NULL Auth type */
 	uint32_t cipher_key_len = 0;
-	uint8_t zsk_flag = 0, aes_gcm = 0;
+	uint8_t aes_gcm = 0;
 	aead_form = &xform->aead;
-	void *ctx;
+	void *ctx = SESS_PRIV(sess);
 
 	if (aead_form->op == RTE_CRYPTO_AEAD_OP_ENCRYPT &&
 	   aead_form->algo == RTE_CRYPTO_AEAD_AES_GCM) {
@@ -2664,18 +2621,20 @@
 			       (unsigned int long)aead_form->key.length);
 		return -1;
 	}
-	sess->zsk_flag = zsk_flag;
+	sess->zsk_flag = 0;
 	sess->aes_gcm = aes_gcm;
 	sess->mac_len = aead_form->digest_length;
 	sess->iv_offset = aead_form->iv.offset;
 	sess->iv_length = aead_form->iv.length;
 	sess->aad_length = aead_form->aad_length;
-	ctx = (void *)((uint8_t *)sess + sizeof(struct cpt_sess_misc)),
 
-	cpt_fc_ciph_set_key(ctx, enc_type, aead_form->key.data,
-			aead_form->key.length, NULL);
+	if (unlikely(cpt_fc_ciph_set_key(ctx, enc_type, aead_form->key.data,
+			aead_form->key.length, NULL)))
+		return -1;
 
-	cpt_fc_auth_set_key(ctx, auth_type, NULL, 0, aead_form->digest_length);
+	if (unlikely(cpt_fc_auth_set_key(ctx, auth_type, NULL, 0,
+			aead_form->digest_length)))
+		return -1;
 
 	return 0;
 }
@@ -2687,10 +2646,7 @@
 	struct rte_crypto_cipher_xform *c_form;
 	cipher_type_t enc_type = 0; /* NULL Cipher type */
 	uint32_t cipher_key_len = 0;
-	uint8_t zsk_flag = 0, aes_gcm = 0, aes_ctr = 0, is_null = 0;
-
-	if (xform->type != RTE_CRYPTO_SYM_XFORM_CIPHER)
-		return -1;
+	uint8_t zsk_flag = 0, aes_ctr = 0, is_null = 0;
 
 	c_form = &xform->cipher;
 
@@ -2772,14 +2728,15 @@
 	}
 
 	sess->zsk_flag = zsk_flag;
-	sess->aes_gcm = aes_gcm;
+	sess->aes_gcm = 0;
 	sess->aes_ctr = aes_ctr;
 	sess->iv_offset = c_form->iv.offset;
 	sess->iv_length = c_form->iv.length;
 	sess->is_null = is_null;
 
-	cpt_fc_ciph_set_key(SESS_PRIV(sess), enc_type, c_form->key.data,
-			    c_form->key.length, NULL);
+	if (unlikely(cpt_fc_ciph_set_key(SESS_PRIV(sess), enc_type,
+			c_form->key.data, c_form->key.length, NULL)))
+		return -1;
 
 	return 0;
 }
@@ -2792,9 +2749,6 @@
 	auth_type_t auth_type = 0; /* NULL Auth type */
 	uint8_t zsk_flag = 0, aes_gcm = 0, is_null = 0;
 
-	if (xform->type != RTE_CRYPTO_SYM_XFORM_AUTH)
-		goto error_out;
-
 	a_form = &xform->auth;
 
 	if (a_form->op == RTE_CRYPTO_AUTH_OP_VERIFY)
@@ -2866,11 +2820,11 @@
 	case RTE_CRYPTO_AUTH_AES_CBC_MAC:
 		CPT_LOG_DP_ERR("Crypto: Unsupported hash algo %u",
 			       a_form->algo);
-		goto error_out;
+		return -1;
 	default:
 		CPT_LOG_DP_ERR("Crypto: Undefined Hash algo %u specified",
 			       a_form->algo);
-		goto error_out;
+		return -1;
 	}
 
 	sess->zsk_flag = zsk_flag;
@@ -2881,13 +2835,12 @@
 		sess->auth_iv_offset = a_form->iv.offset;
 		sess->auth_iv_length = a_form->iv.length;
 	}
-	cpt_fc_auth_set_key(SESS_PRIV(sess), auth_type, a_form->key.data,
-			    a_form->key.length, a_form->digest_length);
+	if (unlikely(cpt_fc_auth_set_key(SESS_PRIV(sess), auth_type,
+			a_form->key.data, a_form->key.length,
+			a_form->digest_length)))
+		return -1;
 
 	return 0;
-
-error_out:
-	return -1;
 }
 
 static __rte_always_inline int
@@ -2897,11 +2850,7 @@
 	struct rte_crypto_auth_xform *a_form;
 	cipher_type_t enc_type = 0; /* NULL Cipher type */
 	auth_type_t auth_type = 0; /* NULL Auth type */
-	uint8_t zsk_flag = 0, aes_gcm = 0;
-	void *ctx;
-
-	if (xform->type != RTE_CRYPTO_SYM_XFORM_AUTH)
-		return -1;
+	void *ctx = SESS_PRIV(sess);
 
 	a_form = &xform->auth;
 
@@ -2925,17 +2874,20 @@
 		return -1;
 	}
 
-	sess->zsk_flag = zsk_flag;
-	sess->aes_gcm = aes_gcm;
+	sess->zsk_flag = 0;
+	sess->aes_gcm = 0;
 	sess->is_gmac = 1;
 	sess->iv_offset = a_form->iv.offset;
 	sess->iv_length = a_form->iv.length;
 	sess->mac_len = a_form->digest_length;
-	ctx = (void *)((uint8_t *)sess + sizeof(struct cpt_sess_misc)),
 
-	cpt_fc_ciph_set_key(ctx, enc_type, a_form->key.data,
-			a_form->key.length, NULL);
-	cpt_fc_auth_set_key(ctx, auth_type, NULL, 0, a_form->digest_length);
+	if (unlikely(cpt_fc_ciph_set_key(ctx, enc_type, a_form->key.data,
+			a_form->key.length, NULL)))
+		return -1;
+
+	if (unlikely(cpt_fc_auth_set_key(ctx, auth_type, NULL, 0,
+			a_form->digest_length)))
+		return -1;
 
 	return 0;
 }
@@ -3131,9 +3083,6 @@
 	void *prep_req = NULL;
 	struct rte_mbuf *m_src, *m_dst;
 	uint8_t cpt_op = sess_misc->cpt_op;
-	uint8_t zsk_flag = sess_misc->zsk_flag;
-	uint8_t aes_gcm = sess_misc->aes_gcm;
-	uint16_t mac_len = sess_misc->mac_len;
 #ifdef CPT_ALWAYS_USE_SG_MODE
 	uint8_t inplace = 0;
 #else
@@ -3160,21 +3109,17 @@
 		}
 	}
 
-	if (zsk_flag) {
+	if (sess_misc->zsk_flag) {
 		fc_params.auth_iv_buf = rte_crypto_op_ctod_offset(cop,
 					uint8_t *,
 					sess_misc->auth_iv_offset);
-		if (zsk_flag == K_F9) {
-			CPT_LOG_DP_ERR("Should not reach here for "
-			"kasumi F9\n");
-		}
-		if (zsk_flag != ZS_EA)
+		if (sess_misc->zsk_flag != ZS_EA)
 			inplace = 0;
 	}
 	m_src = sym_op->m_src;
 	m_dst = sym_op->m_dst;
 
-	if (aes_gcm) {
+	if (sess_misc->aes_gcm) {
 		uint8_t *salt;
 		uint8_t *aad_data;
 		uint16_t aad_len;
@@ -3208,7 +3153,7 @@
 			sess_misc->salt = *(uint32_t *)salt;
 		}
 		fc_params.iv_buf = salt + 4;
-		if (likely(mac_len)) {
+		if (likely(sess_misc->mac_len)) {
 			struct rte_mbuf *m = (cpt_op & CPT_OP_ENCODE) ? m_dst :
 					     m_src;
 
@@ -3251,7 +3196,7 @@
 			}
 			fc_params.iv_buf = salt + 4;
 		}
-		if (likely(mac_len)) {
+		if (likely(sess_misc->mac_len)) {
 			struct rte_mbuf *m;
 
 			m = (cpt_op & CPT_OP_ENCODE) ? m_dst : m_src;
@@ -3310,7 +3255,6 @@
 			uint32_t pkt_len;
 
 			/* Try to make room as much as src has */
-			m_dst = sym_op->m_dst;
 			pkt_len = rte_pktmbuf_pkt_len(m_dst);
 
 			if (unlikely(pkt_len < rte_pktmbuf_pkt_len(m_src))) {
@@ -3494,7 +3438,6 @@
 	void *prep_req = NULL;
 	struct rte_mbuf *m_src, *m_dst;
 	uint16_t auth_op = sess->cpt_op & CPT_OP_AUTH_MASK;
-	uint8_t zsk_flag = sess->zsk_flag;
 	uint16_t mac_len = sess->mac_len;
 	fc_params_t params;
 	char src[SRC_IOV_SIZE];
@@ -3526,7 +3469,7 @@
 
 	flags = VALID_MAC_BUF;
 	params.src_iov = (void *)src;
-	if (unlikely(zsk_flag)) {
+	if (unlikely(sess->zsk_flag)) {
 		/*
 		 * Since for Zuc, Kasumi, Snow3g offsets are in bits
 		 * we will send pass through even for auth only case,
@@ -3536,10 +3479,9 @@
 		auth_range_off = 0;
 		params.auth_iv_buf = rte_crypto_op_ctod_offset(cop,
 					uint8_t *, sess->auth_iv_offset);
-		if (zsk_flag == K_F9) {
+		if (sess->zsk_flag == K_F9) {
 			uint32_t length_in_bits, num_bytes;
 			uint8_t *src, direction = 0;
-			uint32_t counter_num_bytes;
 
 			memcpy(iv_buf, rte_pktmbuf_mtod(cop->sym->m_src,
 							uint8_t *), 8);
@@ -3549,10 +3491,9 @@
 			 */
 			length_in_bits = cop->sym->auth.data.length;
 			num_bytes = (length_in_bits >> 3);
-			counter_num_bytes = num_bytes;
 			src = rte_pktmbuf_mtod(cop->sym->m_src, uint8_t *);
 			find_kasumif9_direction_and_length(src,
-						counter_num_bytes,
+						num_bytes,
 						&length_in_bits,
 						&direction);
 			length_in_bits -= 64;
diff -Nru dpdk-18.11.6/drivers/common/octeontx/rte_common_octeontx_version.map dpdk-18.11.8/drivers/common/octeontx/rte_common_octeontx_version.map
--- dpdk-18.11.6/drivers/common/octeontx/rte_common_octeontx_version.map	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/common/octeontx/rte_common_octeontx_version.map	2020-05-18 15:00:53.000000000 +0100
@@ -1,7 +1,6 @@
 DPDK_18.05 {
 	global:
 
-	octeontx_logtype_mbox;
 	octeontx_mbox_set_ram_mbox_base;
 	octeontx_mbox_set_reg;
 	octeontx_mbox_send;
diff -Nru dpdk-18.11.6/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c dpdk-18.11.8/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
--- dpdk-18.11.6/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c	2020-05-18 15:00:53.000000000 +0100
@@ -662,10 +662,10 @@
 					op->sym->session,
 					cryptodev_driver_id);
 	} else {
-		void *_sess = NULL;
+		void *_sess = rte_cryptodev_sym_session_create(qp->sess_mp);
 		void *_sess_private_data = NULL;
 
-		if (rte_mempool_get(qp->sess_mp, (void **)&_sess))
+		if (_sess == NULL)
 			return NULL;
 
 		if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data))
diff -Nru dpdk-18.11.6/drivers/crypto/armv8/rte_armv8_pmd.c dpdk-18.11.8/drivers/crypto/armv8/rte_armv8_pmd.c
--- dpdk-18.11.6/drivers/crypto/armv8/rte_armv8_pmd.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/crypto/armv8/rte_armv8_pmd.c	2020-05-18 15:00:53.000000000 +0100
@@ -84,12 +84,12 @@
 
 static const crypto_func_tbl_t
 crypto_op_ca_decrypt = {
-	NULL
+	{ {NULL} }
 };
 
 static const crypto_func_tbl_t
 crypto_op_ac_encrypt = {
-	NULL
+	{ {NULL} }
 };
 
 static const crypto_func_tbl_t
@@ -369,7 +369,16 @@
 	/* Select cipher key */
 	sess->cipher.key.length = cipher_xform->cipher.key.length;
 	/* Set cipher direction */
-	cop = sess->cipher.direction;
+	switch (sess->cipher.direction) {
+	case RTE_CRYPTO_CIPHER_OP_ENCRYPT:
+		cop = ARMV8_CRYPTO_CIPHER_OP_ENCRYPT;
+		break;
+	case RTE_CRYPTO_CIPHER_OP_DECRYPT:
+		cop = ARMV8_CRYPTO_CIPHER_OP_DECRYPT;
+		break;
+	default:
+		return -ENOTSUP;
+	}
 	/* Set cipher algorithm */
 	calg = cipher_xform->cipher.algo;
 
diff -Nru dpdk-18.11.6/drivers/crypto/ccp/ccp_dev.h dpdk-18.11.8/drivers/crypto/ccp/ccp_dev.h
--- dpdk-18.11.6/drivers/crypto/ccp/ccp_dev.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/crypto/ccp/ccp_dev.h	2020-05-18 15:00:53.000000000 +0100
@@ -220,7 +220,7 @@
 	/**< lsb assigned for sha ctx */
 	uint32_t sb_hmac;
 	/**< lsb assigned for hmac ctx */
-} ____cacheline_aligned;
+} __rte_cache_aligned;
 
 /**
  * A structure describing a CCP device.
diff -Nru dpdk-18.11.6/drivers/crypto/openssl/rte_openssl_pmd.c dpdk-18.11.8/drivers/crypto/openssl/rte_openssl_pmd.c
--- dpdk-18.11.6/drivers/crypto/openssl/rte_openssl_pmd.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/crypto/openssl/rte_openssl_pmd.c	2020-05-18 15:00:53.000000000 +0100
@@ -762,10 +762,10 @@
 			return NULL;
 
 		/* provide internal session */
-		void *_sess = NULL;
+		void *_sess = rte_cryptodev_sym_session_create(qp->sess_mp);
 		void *_sess_private_data = NULL;
 
-		if (rte_mempool_get(qp->sess_mp, (void **)&_sess))
+		if (_sess == NULL)
 			return NULL;
 
 		if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data))
diff -Nru dpdk-18.11.6/drivers/event/dsw/dsw_event.c dpdk-18.11.8/drivers/event/dsw/dsw_event.c
--- dpdk-18.11.6/drivers/event/dsw/dsw_event.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/event/dsw/dsw_event.c	2020-05-18 15:00:53.000000000 +0100
@@ -1018,12 +1018,12 @@
 }
 
 static __rte_always_inline uint16_t
-dsw_event_enqueue_burst_generic(void *port, const struct rte_event events[],
+dsw_event_enqueue_burst_generic(struct dsw_port *source_port,
+				const struct rte_event events[],
 				uint16_t events_len, bool op_types_known,
 				uint16_t num_new, uint16_t num_release,
 				uint16_t num_non_release)
 {
-	struct dsw_port *source_port = port;
 	struct dsw_evdev *dsw = source_port->dsw;
 	bool enough_credits;
 	uint16_t i;
@@ -1047,12 +1047,10 @@
 	 */
 	if (unlikely(events_len == 0)) {
 		dsw_port_note_op(source_port, DSW_MAX_PORT_OPS_PER_BG_TASK);
+		dsw_port_flush_out_buffers(dsw, source_port);
 		return 0;
 	}
 
-	if (unlikely(events_len > source_port->enqueue_depth))
-		events_len = source_port->enqueue_depth;
-
 	dsw_port_note_op(source_port, events_len);
 
 	if (!op_types_known)
@@ -1108,24 +1106,41 @@
 dsw_event_enqueue_burst(void *port, const struct rte_event events[],
 			uint16_t events_len)
 {
-	return dsw_event_enqueue_burst_generic(port, events, events_len, false,
-					       0, 0, 0);
+	struct dsw_port *source_port = port;
+
+	if (unlikely(events_len > source_port->enqueue_depth))
+		events_len = source_port->enqueue_depth;
+
+	return dsw_event_enqueue_burst_generic(source_port, events,
+					       events_len, false, 0, 0, 0);
 }
 
 uint16_t
 dsw_event_enqueue_new_burst(void *port, const struct rte_event events[],
 			    uint16_t events_len)
 {
-	return dsw_event_enqueue_burst_generic(port, events, events_len, true,
-					       events_len, 0, events_len);
+	struct dsw_port *source_port = port;
+
+	if (unlikely(events_len > source_port->enqueue_depth))
+		events_len = source_port->enqueue_depth;
+
+	return dsw_event_enqueue_burst_generic(source_port, events,
+					       events_len, true, events_len,
+					       0, events_len);
 }
 
 uint16_t
 dsw_event_enqueue_forward_burst(void *port, const struct rte_event events[],
 				uint16_t events_len)
 {
-	return dsw_event_enqueue_burst_generic(port, events, events_len, true,
-					       0, 0, events_len);
+	struct dsw_port *source_port = port;
+
+	if (unlikely(events_len > source_port->enqueue_depth))
+		events_len = source_port->enqueue_depth;
+
+	return dsw_event_enqueue_burst_generic(source_port, events,
+					       events_len, true, 0, 0,
+					       events_len);
 }
 
 uint16_t
diff -Nru dpdk-18.11.6/drivers/net/avf/avf_ethdev.c dpdk-18.11.8/drivers/net/avf/avf_ethdev.c
--- dpdk-18.11.6/drivers/net/avf/avf_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/avf/avf_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -987,7 +987,7 @@
 	ret = avf_query_stats(adapter, &pstats);
 	if (ret == 0) {
 		stats->ipackets = pstats->rx_unicast + pstats->rx_multicast +
-						pstats->rx_broadcast;
+				pstats->rx_broadcast - pstats->rx_discards;
 		stats->opackets = pstats->tx_broadcast + pstats->tx_multicast +
 						pstats->tx_unicast;
 		stats->imissed = pstats->rx_discards;
diff -Nru dpdk-18.11.6/drivers/net/avf/avf.h dpdk-18.11.8/drivers/net/avf/avf.h
--- dpdk-18.11.6/drivers/net/avf/avf.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/avf/avf.h	2020-05-18 15:00:53.000000000 +0100
@@ -167,6 +167,17 @@
 	uint32_t out_size;      /* buffer size for response */
 };
 
+/* notify current command done. Only call in case execute
+ * _atomic_set_cmd successfully.
+ */
+static inline void
+_notify_cmd(struct avf_info *vf, uint32_t msg_ret)
+{
+	vf->cmd_retval = msg_ret;
+	rte_wmb();
+	vf->pend_cmd = VIRTCHNL_OP_UNKNOWN;
+}
+
 /* clear current command. Only call in case execute
  * _atomic_set_cmd successfully.
  */
diff -Nru dpdk-18.11.6/drivers/net/avf/avf_rxtx.h dpdk-18.11.8/drivers/net/avf/avf_rxtx.h
--- dpdk-18.11.6/drivers/net/avf/avf_rxtx.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/avf/avf_rxtx.h	2020-05-18 15:00:53.000000000 +0100
@@ -27,6 +27,7 @@
 		DEV_TX_OFFLOAD_VLAN_INSERT |		 \
 		DEV_TX_OFFLOAD_SCTP_CKSUM |		 \
 		DEV_TX_OFFLOAD_UDP_CKSUM |		 \
+		DEV_TX_OFFLOAD_TCP_TSO |		 \
 		DEV_TX_OFFLOAD_TCP_CKSUM)
 
 #define DEFAULT_TX_RS_THRESH     32
diff -Nru dpdk-18.11.6/drivers/net/avf/avf_vchnl.c dpdk-18.11.8/drivers/net/avf/avf_vchnl.c
--- dpdk-18.11.6/drivers/net/avf/avf_vchnl.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/avf/avf_vchnl.c	2020-05-18 15:00:53.000000000 +0100
@@ -210,12 +210,9 @@
 							info.msg_len);
 			} else {
 				/* read message and it's expected one */
-				if (msg_opc == vf->pend_cmd) {
-					vf->cmd_retval = msg_ret;
-					/* prevent compiler reordering */
-					rte_compiler_barrier();
-					_clear_cmd(vf);
-				} else
+				if (msg_opc == vf->pend_cmd)
+					_notify_cmd(vf, msg_ret);
+				else
 					PMD_DRV_LOG(ERR, "command mismatch,"
 						    "expect %u, get %u",
 						    vf->pend_cmd, msg_opc);
diff -Nru dpdk-18.11.6/drivers/net/avf/base/avf_adminq.c dpdk-18.11.8/drivers/net/avf/base/avf_adminq.c
--- dpdk-18.11.6/drivers/net/avf/base/avf_adminq.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/avf/base/avf_adminq.c	2020-05-18 15:00:53.000000000 +0100
@@ -113,6 +113,7 @@
  **/
 void avf_free_adminq_asq(struct avf_hw *hw)
 {
+	avf_free_virt_mem(hw, &hw->aq.asq.cmd_buf);
 	avf_free_dma_mem(hw, &hw->aq.asq.desc_buf);
 }
 
@@ -396,7 +397,7 @@
 	/* initialize base registers */
 	ret_code = avf_config_asq_regs(hw);
 	if (ret_code != AVF_SUCCESS)
-		goto init_adminq_free_rings;
+		goto init_config_regs;
 
 	/* success! */
 	hw->aq.asq.count = hw->aq.num_asq_entries;
@@ -404,6 +405,10 @@
 
 init_adminq_free_rings:
 	avf_free_adminq_asq(hw);
+	return ret_code;
+
+init_config_regs:
+	avf_free_asq_bufs(hw);
 
 init_adminq_exit:
 	return ret_code;
@@ -846,6 +851,8 @@
 		cmd_completed = true;
 		if ((enum avf_admin_queue_err)retval == AVF_AQ_RC_OK)
 			status = AVF_SUCCESS;
+		else if ((enum avf_admin_queue_err)retval == AVF_AQ_RC_EBUSY)
+			status = AVF_ERR_NOT_READY;
 		else
 			status = AVF_ERR_ADMIN_QUEUE_ERROR;
 		hw->aq.asq_last_status = (enum avf_admin_queue_err)retval;
diff -Nru dpdk-18.11.6/drivers/net/bnx2x/bnx2x.c dpdk-18.11.8/drivers/net/bnx2x/bnx2x.c
--- dpdk-18.11.6/drivers/net/bnx2x/bnx2x.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnx2x/bnx2x.c	2020-05-18 15:00:53.000000000 +0100
@@ -1167,6 +1167,10 @@
 	if (unlikely((rx_cq_cons_sb & MAX_RCQ_ENTRIES(rxq)) ==
 		     MAX_RCQ_ENTRIES(rxq)))
 		rx_cq_cons_sb++;
+
+	PMD_RX_LOG(DEBUG, "hw CQ cons = %d, sw CQ cons = %d",
+		   rx_cq_cons_sb, rxq->rx_cq_head);
+
 	return rxq->rx_cq_head != rx_cq_cons_sb;
 }
 
@@ -1249,9 +1253,12 @@
 	uint16_t bd_cons, bd_prod, bd_prod_fw, comp_ring_cons;
 	uint16_t hw_cq_cons, sw_cq_cons, sw_cq_prod;
 
+	rte_spinlock_lock(&(fp)->rx_mtx);
+
 	rxq = sc->rx_queues[fp->index];
 	if (!rxq) {
 		PMD_RX_LOG(ERR, "RX queue %d is NULL", fp->index);
+		rte_spinlock_unlock(&(fp)->rx_mtx);
 		return 0;
 	}
 
@@ -1321,9 +1328,14 @@
 	rxq->rx_cq_head = sw_cq_cons;
 	rxq->rx_cq_tail = sw_cq_prod;
 
+	PMD_RX_LOG(DEBUG, "BD prod = %d, sw CQ prod = %d",
+		   bd_prod_fw, sw_cq_prod);
+
 	/* Update producers */
 	bnx2x_update_rx_prod(sc, fp, bd_prod_fw, sw_cq_prod);
 
+	rte_spinlock_unlock(&(fp)->rx_mtx);
+
 	return sw_cq_cons != hw_cq_cons;
 }
 
@@ -4575,10 +4587,10 @@
 			bnx2x_handle_fp_tq(fp);
 			return;
 		}
+		/* We have completed slow path completion, clear the flag */
+		rte_atomic32_set(&sc->scan_fp, 0);
 	}
 
-	/* Assuming we have completed slow path completion, clear the flag */
-	rte_atomic32_set(&sc->scan_fp, 0);
 	bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
 		   le16toh(fp->fp_hc_idx), IGU_INT_ENABLE, 1);
 }
diff -Nru dpdk-18.11.6/drivers/net/bnx2x/bnx2x.h dpdk-18.11.8/drivers/net/bnx2x/bnx2x.h
--- dpdk-18.11.6/drivers/net/bnx2x/bnx2x.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnx2x/bnx2x.h	2020-05-18 15:00:53.000000000 +0100
@@ -374,6 +374,9 @@
 	/* pointer back to parent structure */
 	struct bnx2x_softc *sc;
 
+	/* Used to synchronize fastpath Rx access */
+	rte_spinlock_t rx_mtx;
+
 	/* status block */
 	struct bnx2x_dma                 sb_dma;
 	union bnx2x_host_hc_status_block status_block;
diff -Nru dpdk-18.11.6/drivers/net/bnx2x/bnx2x_rxtx.c dpdk-18.11.8/drivers/net/bnx2x/bnx2x_rxtx.c
--- dpdk-18.11.6/drivers/net/bnx2x/bnx2x_rxtx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnx2x/bnx2x_rxtx.c	2020-05-18 15:00:53.000000000 +0100
@@ -344,6 +344,8 @@
 	uint16_t len, pad;
 	struct rte_mbuf *rx_mb = NULL;
 
+	rte_spinlock_lock(&(fp)->rx_mtx);
+
 	hw_cq_cons = le16toh(*fp->rx_cq_cons_sb);
 	if ((hw_cq_cons & USABLE_RCQ_ENTRIES_PER_PAGE) ==
 			USABLE_RCQ_ENTRIES_PER_PAGE) {
@@ -355,8 +357,10 @@
 	sw_cq_cons = rxq->rx_cq_head;
 	sw_cq_prod = rxq->rx_cq_tail;
 
-	if (sw_cq_cons == hw_cq_cons)
+	if (sw_cq_cons == hw_cq_cons) {
+		rte_spinlock_unlock(&(fp)->rx_mtx);
 		return 0;
+	}
 
 	while (nb_rx < nb_pkts && sw_cq_cons != hw_cq_cons) {
 
@@ -412,7 +416,7 @@
 		 */
 		if (cqe_fp->pars_flags.flags & PARSING_FLAGS_VLAN) {
 			rx_mb->vlan_tci = cqe_fp->vlan_tag;
-			rx_mb->ol_flags |= PKT_RX_VLAN;
+			rx_mb->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		}
 
 		rx_pkts[nb_rx] = rx_mb;
@@ -437,6 +441,8 @@
 
 	bnx2x_upd_rx_prod_fast(sc, fp, bd_prod, sw_cq_prod);
 
+	rte_spinlock_unlock(&(fp)->rx_mtx);
+
 	return nb_rx;
 }
 
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_cpr.c dpdk-18.11.8/drivers/net/bnxt/bnxt_cpr.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_cpr.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_cpr.c	2020-05-18 15:00:53.000000000 +0100
@@ -26,7 +26,7 @@
 	case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
 	case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE:
 		/* FALLTHROUGH */
-		bnxt_link_update_op(bp->eth_dev, 0);
+		bnxt_link_update(bp->eth_dev, 0, ETH_LINK_UP);
 		break;
 	case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD:
 		PMD_DRV_LOG(INFO, "Async event: PF driver unloaded\n");
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_ethdev.c dpdk-18.11.8/drivers/net/bnxt/bnxt_ethdev.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -342,8 +342,11 @@
 
 	/* enable uio/vfio intr/eventfd mapping */
 	rc = rte_intr_enable(intr_handle);
+#ifndef RTE_EXEC_ENV_FREEBSD
+	/* In FreeBSD OS, nic_uio driver does not support interrupts */
 	if (rc)
 		goto err_free;
+#endif
 
 	rc = bnxt_get_hwrm_link_config(bp, &new);
 	if (rc) {
@@ -404,6 +407,7 @@
 static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 				  struct rte_eth_dev_info *dev_info)
 {
+	struct rte_pci_device *pdev = RTE_DEV_TO_PCI(eth_dev->device);
 	struct bnxt *bp = eth_dev->data->dev_private;
 	uint16_t max_vnics, i, j, vpool, vrxq;
 	unsigned int max_rx_rings;
@@ -414,7 +418,7 @@
 
 	/* PF/VF specifics */
 	if (BNXT_PF(bp))
-		dev_info->max_vfs = bp->pdev->max_vfs;
+		dev_info->max_vfs = pdev->max_vfs;
 	max_rx_rings = RTE_MIN(bp->max_rx_rings, bp->max_stat_ctx);
 	/* For the sake of symmetry, max_rx_queues = max_tx_queues */
 	dev_info->max_rx_queues = max_rx_rings;
@@ -604,7 +608,7 @@
 	if (rc)
 		goto error;
 
-	bnxt_link_update_op(eth_dev, 1);
+	bnxt_link_update(eth_dev, 1, ETH_LINK_UP);
 
 	if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
 		vlan_mask |= ETH_VLAN_FILTER_MASK;
@@ -663,13 +667,12 @@
 	rte_intr_disable(intr_handle);
 
 	bp->flags &= ~BNXT_FLAG_INIT_DONE;
-	if (bp->eth_dev->data->dev_started) {
-		/* TBD: STOP HW queues DMA */
-		eth_dev->data->dev_link.link_status = 0;
-	}
 	bnxt_dev_set_link_down_op(eth_dev);
-	/* Wait for link to be reset and the async notification to process. */
-	rte_delay_ms(BNXT_LINK_WAIT_INTERVAL * 2);
+
+	/* Wait for link to be reset and the async notification to process.
+	 * During reset recovery, there is no need to wait
+	 */
+	bnxt_link_update(eth_dev, 1, ETH_LINK_DOWN);
 
 	/* Clean queue intr-vector mapping */
 	rte_intr_efd_disable(intr_handle);
@@ -788,12 +791,14 @@
 	return rc;
 }
 
-int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
+int bnxt_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete,
+		     bool exp_link_status)
 {
 	int rc = 0;
 	struct bnxt *bp = eth_dev->data->dev_private;
 	struct rte_eth_link new;
-	unsigned int cnt = BNXT_LINK_WAIT_CNT;
+	int cnt = exp_link_status ? BNXT_LINK_UP_WAIT_CNT :
+		  BNXT_LINK_DOWN_WAIT_CNT;
 
 	memset(&new, 0, sizeof(new));
 	do {
@@ -807,7 +812,7 @@
 			goto out;
 		}
 
-		if (!wait_to_complete || new.link_status)
+		if (!wait_to_complete || new.link_status == exp_link_status)
 			break;
 
 		rte_delay_ms(BNXT_LINK_WAIT_INTERVAL);
@@ -829,6 +834,12 @@
 	return rc;
 }
 
+static int bnxt_link_update_op(struct rte_eth_dev *eth_dev,
+			       int wait_to_complete)
+{
+	return bnxt_link_update(eth_dev, wait_to_complete, ETH_LINK_UP);
+}
+
 static void bnxt_promiscuous_enable_op(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
@@ -2898,9 +2909,9 @@
 	uint32_t dir_entries;
 	uint32_t entry_length;
 
-	PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x\n",
-		bp->pdev->addr.domain, bp->pdev->addr.bus,
-		bp->pdev->addr.devid, bp->pdev->addr.function);
+	PMD_DRV_LOG(INFO, PCI_PRI_FMT "\n",
+		    bp->pdev->addr.domain, bp->pdev->addr.bus,
+		    bp->pdev->addr.devid, bp->pdev->addr.function);
 
 	rc = bnxt_hwrm_nvm_get_dir_info(bp, &dir_entries, &entry_length);
 	if (rc != 0)
@@ -2917,10 +2928,10 @@
 	uint32_t index;
 	uint32_t offset;
 
-	PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x in_eeprom->offset = %d "
-		"len = %d\n", bp->pdev->addr.domain,
-		bp->pdev->addr.bus, bp->pdev->addr.devid,
-		bp->pdev->addr.function, in_eeprom->offset, in_eeprom->length);
+	PMD_DRV_LOG(INFO, PCI_PRI_FMT " in_eeprom->offset = %d len = %d\n",
+		    bp->pdev->addr.domain, bp->pdev->addr.bus,
+		    bp->pdev->addr.devid, bp->pdev->addr.function,
+		    in_eeprom->offset, in_eeprom->length);
 
 	if (in_eeprom->offset == 0) /* special offset value to get directory */
 		return bnxt_get_nvram_directory(bp, in_eeprom->length,
@@ -2988,10 +2999,10 @@
 	uint8_t index, dir_op;
 	uint16_t type, ext, ordinal, attr;
 
-	PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x in_eeprom->offset = %d "
-		"len = %d\n", bp->pdev->addr.domain,
-		bp->pdev->addr.bus, bp->pdev->addr.devid,
-		bp->pdev->addr.function, in_eeprom->offset, in_eeprom->length);
+	PMD_DRV_LOG(INFO, PCI_PRI_FMT " in_eeprom->offset = %d len = %d\n",
+		    bp->pdev->addr.domain, bp->pdev->addr.bus,
+		    bp->pdev->addr.devid, bp->pdev->addr.function,
+		    in_eeprom->offset, in_eeprom->length);
 
 	if (!BNXT_PF(bp)) {
 		PMD_DRV_LOG(ERR, "NVM write not supported from a VF\n");
@@ -3221,18 +3232,6 @@
 	}
 	memset(mz->addr, 0, mz->len);
 	mz_phys_addr = mz->iova;
-	if ((unsigned long)mz->addr == mz_phys_addr) {
-		PMD_DRV_LOG(DEBUG,
-			    "Memzone physical address same as virtual.\n");
-		PMD_DRV_LOG(DEBUG,
-			    "Using rte_mem_virt2iova()\n");
-		mz_phys_addr = rte_mem_virt2iova(mz->addr);
-		if (mz_phys_addr == RTE_BAD_IOVA) {
-			PMD_DRV_LOG(ERR,
-				    "Can't map address to physical memory\n");
-			return -ENOMEM;
-		}
-	}
 
 	bp->rx_mem_zone = (const void *)mz;
 	bp->hw_rx_port_stats = mz->addr;
@@ -3260,18 +3259,6 @@
 	}
 	memset(mz->addr, 0, mz->len);
 	mz_phys_addr = mz->iova;
-	if ((unsigned long)mz->addr == mz_phys_addr) {
-		PMD_DRV_LOG(DEBUG,
-			    "Memzone physical address same as virtual.\n");
-		PMD_DRV_LOG(DEBUG,
-			    "Using rte_mem_virt2iova()\n");
-		mz_phys_addr = rte_mem_virt2iova(mz->addr);
-		if (mz_phys_addr == RTE_BAD_IOVA) {
-			PMD_DRV_LOG(ERR,
-				    "Can't map address to physical memory\n");
-			return -ENOMEM;
-		}
-	}
 
 	bp->tx_mem_zone = (const void *)mz;
 	bp->hw_tx_port_stats = mz->addr;
@@ -3314,12 +3301,6 @@
 	if (version_printed++ == 0)
 		PMD_DRV_LOG(INFO, "%s\n", bnxt_version);
 
-	rte_eth_copy_pci_info(eth_dev, pci_dev);
-
-	bp = eth_dev->data->dev_private;
-
-	bp->dev_stopped = 1;
-
 	eth_dev->dev_ops = &bnxt_dev_ops;
 	eth_dev->rx_pkt_burst = &bnxt_recv_pkts;
 	eth_dev->tx_pkt_burst = &bnxt_xmit_pkts;
@@ -3331,6 +3312,12 @@
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
+
+	bp = eth_dev->data->dev_private;
+
+	bp->dev_stopped = 1;
+
 	if (bnxt_vf_pciid(pci_dev->id.device_id))
 		bp->flags |= BNXT_FLAG_VF;
 
@@ -3347,7 +3334,7 @@
 			"hwrm resource allocation failure rc: %x\n", rc);
 		goto error_free;
 	}
-	rc = bnxt_hwrm_ver_get(bp);
+	rc = bnxt_hwrm_ver_get(bp, DFLT_HWRM_CMD_TIMEOUT);
 	if (rc)
 		goto error_free;
 	rc = bnxt_hwrm_queue_qportcfg(bp);
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_filter.c dpdk-18.11.8/drivers/net/bnxt/bnxt_filter.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_filter.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_filter.c	2020-05-18 15:00:53.000000000 +0100
@@ -26,13 +26,11 @@
 {
 	struct bnxt_filter_info *filter;
 
-	/* Find the 1st unused filter from the free_filter_list pool*/
-	filter = STAILQ_FIRST(&bp->free_filter_list);
+	filter = bnxt_get_unused_filter(bp);
 	if (!filter) {
 		PMD_DRV_LOG(ERR, "No more free filter resources\n");
 		return NULL;
 	}
-	STAILQ_REMOVE_HEAD(&bp->free_filter_list, next);
 
 	/* Default to L2 MAC Addr filter */
 	filter->flags = HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX;
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_flow.c dpdk-18.11.8/drivers/net/bnxt/bnxt_flow.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_flow.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_flow.c	2020-05-18 15:00:53.000000000 +0100
@@ -1026,7 +1026,9 @@
 
 	filter = bnxt_get_unused_filter(bp);
 	if (filter == NULL) {
-		PMD_DRV_LOG(ERR, "Not enough resources for a new flow.\n");
+		rte_flow_error_set(error, ENOSPC,
+				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+				   "Not enough resources for a new flow");
 		goto free_flow;
 	}
 
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt.h dpdk-18.11.8/drivers/net/bnxt/bnxt.h
--- dpdk-18.11.6/drivers/net/bnxt/bnxt.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt.h	2020-05-18 15:00:53.000000000 +0100
@@ -195,9 +195,10 @@
 	uint8_t			evb_mode;
 };
 
-/* Max wait time is 10 * 100ms = 1s */
-#define BNXT_LINK_WAIT_CNT	10
-#define BNXT_LINK_WAIT_INTERVAL	100
+/* Max wait time for link up is 10s and link down is 500ms */
+#define BNXT_LINK_UP_WAIT_CNT	200
+#define BNXT_LINK_DOWN_WAIT_CNT	10
+#define BNXT_LINK_WAIT_INTERVAL	50
 struct bnxt_link_info {
 	uint32_t		phy_flags;
 	uint8_t			mac_type;
@@ -373,8 +374,8 @@
 	uint16_t			max_req_len;
 	uint16_t			max_resp_len;
 
-	/* default command timeout value of 50ms */
-#define HWRM_CMD_TIMEOUT	50000
+	/* default command timeout value of 500ms */
+#define DFLT_HWRM_CMD_TIMEOUT	500000
 	/* default HWRM request timeout value */
 	uint32_t		hwrm_cmd_timeout;
 
@@ -412,7 +413,8 @@
 };
 
 int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu);
-int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete);
+int bnxt_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete,
+		     bool exp_link_status);
 int bnxt_rcv_msg_from_vf(struct bnxt *bp, uint16_t vf_id, void *msg);
 
 bool is_bnxt_supported(struct rte_eth_dev *dev);
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_hwrm.c dpdk-18.11.8/drivers/net/bnxt/bnxt_hwrm.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_hwrm.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_hwrm.c	2020-05-18 15:00:53.000000000 +0100
@@ -82,13 +82,7 @@
 		GRCPF_REG_KONG_CHANNEL_OFFSET : GRCPF_REG_CHIMP_CHANNEL_OFFSET;
 	uint16_t mb_trigger_offset = use_kong_mb ?
 		GRCPF_REG_KONG_COMM_TRIGGER : GRCPF_REG_CHIMP_COMM_TRIGGER;
-	uint32_t timeout;
-
-	/* For VER_GET command, set timeout as 50ms */
-	if (rte_cpu_to_le_16(req->req_type) == HWRM_VER_GET)
-		timeout = HWRM_CMD_TIMEOUT;
-	else
-		timeout = bp->hwrm_cmd_timeout;
+	uint32_t timeout = bp->hwrm_cmd_timeout;
 
 	if (bp->flags & BNXT_FLAG_SHORT_CMD) {
 		void *short_cmd_req = bp->hwrm_short_cmd_req_addr;
@@ -801,7 +795,7 @@
 	return rc;
 }
 
-int bnxt_hwrm_ver_get(struct bnxt *bp)
+int bnxt_hwrm_ver_get(struct bnxt *bp, uint32_t timeout)
 {
 	int rc = 0;
 	struct hwrm_ver_get_input req = {.req_type = 0 };
@@ -812,6 +806,7 @@
 	uint32_t dev_caps_cfg;
 
 	bp->max_req_len = HWRM_MAX_REQ_LEN;
+	bp->hwrm_cmd_timeout = timeout;
 	HWRM_PREP(req, VER_GET, BNXT_USE_CHIMP_MB);
 
 	req.hwrm_intf_maj = HWRM_VERSION_MAJOR;
@@ -843,7 +838,7 @@
 	/* convert timeout to usec */
 	bp->hwrm_cmd_timeout *= 1000;
 	if (!bp->hwrm_cmd_timeout)
-		bp->hwrm_cmd_timeout = HWRM_CMD_TIMEOUT;
+		bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT;
 
 	if (resp->hwrm_intf_maj_8b != HWRM_VERSION_MAJOR) {
 		PMD_DRV_LOG(ERR, "Unsupported firmware API version\n");
@@ -871,9 +866,8 @@
 			rc = -ENOMEM;
 			goto error;
 		}
-		rte_mem_lock_page(bp->hwrm_cmd_resp_addr);
 		bp->hwrm_cmd_resp_dma_addr =
-			rte_mem_virt2iova(bp->hwrm_cmd_resp_addr);
+			rte_malloc_virt2iova(bp->hwrm_cmd_resp_addr);
 		if (bp->hwrm_cmd_resp_dma_addr == RTE_BAD_IOVA) {
 			PMD_DRV_LOG(ERR,
 			"Unable to map response buffer to physical memory.\n");
@@ -897,9 +891,8 @@
 			rc = -ENOMEM;
 			goto error;
 		}
-		rte_mem_lock_page(bp->hwrm_short_cmd_req_addr);
 		bp->hwrm_short_cmd_req_dma_addr =
-			rte_mem_virt2iova(bp->hwrm_short_cmd_req_addr);
+			rte_malloc_virt2iova(bp->hwrm_short_cmd_req_addr);
 		if (bp->hwrm_short_cmd_req_dma_addr == RTE_BAD_IOVA) {
 			rte_free(bp->hwrm_short_cmd_req_addr);
 			PMD_DRV_LOG(ERR,
@@ -2036,7 +2029,7 @@
 	if (bp->hwrm_cmd_resp_addr == NULL)
 		return -ENOMEM;
 	bp->hwrm_cmd_resp_dma_addr =
-		rte_mem_virt2iova(bp->hwrm_cmd_resp_addr);
+		rte_malloc_virt2iova(bp->hwrm_cmd_resp_addr);
 	if (bp->hwrm_cmd_resp_dma_addr == RTE_BAD_IOVA) {
 		PMD_DRV_LOG(ERR,
 			"unable to map response address to physical memory\n");
@@ -2955,7 +2948,7 @@
 			 page_getenum(bp->pf.active_vfs * HWRM_MAX_REQ_LEN));
 	req.req_buf_len = rte_cpu_to_le_16(HWRM_MAX_REQ_LEN);
 	req.req_buf_page_addr0 =
-		rte_cpu_to_le_64(rte_mem_virt2iova(bp->pf.vf_req_buf));
+		rte_cpu_to_le_64(rte_malloc_virt2iova(bp->pf.vf_req_buf));
 	if (req.req_buf_page_addr0 == RTE_BAD_IOVA) {
 		PMD_DRV_LOG(ERR,
 			"unable to map buffer address to physical memory\n");
@@ -3389,7 +3382,7 @@
 	rte_mem_lock_page(buf);
 	if (buf == NULL)
 		return -ENOMEM;
-	dma_handle = rte_mem_virt2iova(buf);
+	dma_handle = rte_malloc_virt2iova(buf);
 	if (dma_handle == RTE_BAD_IOVA) {
 		PMD_DRV_LOG(ERR,
 			"unable to map response address to physical memory\n");
@@ -3424,7 +3417,7 @@
 	if (!buf)
 		return -ENOMEM;
 
-	dma_handle = rte_mem_virt2iova(buf);
+	dma_handle = rte_malloc_virt2iova(buf);
 	if (dma_handle == RTE_BAD_IOVA) {
 		PMD_DRV_LOG(ERR,
 			"unable to map response address to physical memory\n");
@@ -3477,7 +3470,7 @@
 	if (!buf)
 		return -ENOMEM;
 
-	dma_handle = rte_mem_virt2iova(buf);
+	dma_handle = rte_malloc_virt2iova(buf);
 	if (dma_handle == RTE_BAD_IOVA) {
 		PMD_DRV_LOG(ERR,
 			"unable to map response address to physical memory\n");
@@ -3540,7 +3533,7 @@
 
 	req.vf_id = rte_cpu_to_le_16(bp->pf.first_vf_id + vf);
 	req.max_vnic_id_cnt = rte_cpu_to_le_32(bp->pf.total_vnics);
-	req.vnic_id_tbl_addr = rte_cpu_to_le_64(rte_mem_virt2iova(vnic_ids));
+	req.vnic_id_tbl_addr = rte_cpu_to_le_64(rte_malloc_virt2iova(vnic_ids));
 
 	if (req.vnic_id_tbl_addr == RTE_BAD_IOVA) {
 		HWRM_UNLOCK();
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_hwrm.h dpdk-18.11.8/drivers/net/bnxt/bnxt_hwrm.h
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_hwrm.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_hwrm.h	2020-05-18 15:00:53.000000000 +0100
@@ -90,7 +90,7 @@
 int bnxt_hwrm_ctx_qstats(struct bnxt *bp, uint32_t cid, int idx,
 			 struct rte_eth_stats *stats, uint8_t rx);
 
-int bnxt_hwrm_ver_get(struct bnxt *bp);
+int bnxt_hwrm_ver_get(struct bnxt *bp, uint32_t timeout);
 
 int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic);
 int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic);
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_irq.c dpdk-18.11.8/drivers/net/bnxt/bnxt_irq.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_irq.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_irq.c	2020-05-18 15:00:53.000000000 +0100
@@ -152,6 +152,13 @@
 		if (!rc)
 			irq->requested = 1;
 	}
+	#ifdef RTE_EXEC_ENV_FREEBSD
+	/**
+	 * In FreeBSD OS, nic_uio does not support interrupts and
+	 * interrupt register callback will fail.
+	 */
+	rc = 0;
+	#endif
 
 	return rc;
 }
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_ring.c dpdk-18.11.8/drivers/net/bnxt/bnxt_ring.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_ring.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_ring.c	2020-05-18 15:00:53.000000000 +0100
@@ -79,7 +79,6 @@
 	const struct rte_memzone *mz = NULL;
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 	rte_iova_t mz_phys_addr;
-	int sz;
 
 	int stats_len = (tx_ring_info || rx_ring_info) ?
 	    RTE_CACHE_LINE_ROUNDUP(sizeof(struct hwrm_stat_ctx_query_output) -
@@ -155,20 +154,6 @@
 	}
 	memset(mz->addr, 0, mz->len);
 	mz_phys_addr = mz->iova;
-	if ((unsigned long)mz->addr == mz_phys_addr) {
-		PMD_DRV_LOG(WARNING,
-			"Memzone physical address same as virtual.\n");
-		PMD_DRV_LOG(WARNING,
-			"Using rte_mem_virt2iova()\n");
-		for (sz = 0; sz < total_alloc_len; sz += getpagesize())
-			rte_mem_lock_page(((char *)mz->addr) + sz);
-		mz_phys_addr = rte_mem_virt2iova(mz->addr);
-		if (mz_phys_addr == RTE_BAD_IOVA) {
-			PMD_DRV_LOG(ERR,
-			"unable to map ring address to physical memory\n");
-			return -ENOMEM;
-		}
-	}
 
 	if (tx_ring_info) {
 		txq->mz = mz;
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_rxr.c dpdk-18.11.8/drivers/net/bnxt/bnxt_rxr.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_rxr.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_rxr.c	2020-05-18 15:00:53.000000000 +0100
@@ -608,10 +608,11 @@
 
 	/* Attempt to alloc Rx buf in case of a previous allocation failure. */
 	if (rc == -ENOMEM) {
-		int i;
+		int i = RING_NEXT(rxr->rx_ring_struct, prod);
+		int cnt = nb_rx_pkts;
 
-		for (i = prod; i <= nb_rx_pkts;
-			i = RING_NEXT(rxr->rx_ring_struct, i)) {
+		for (; cnt;
+			i = RING_NEXT(rxr->rx_ring_struct, i), cnt--) {
 			struct bnxt_sw_rx_bd *rx_buf = &rxr->rx_buf_ring[i];
 
 			/* Buffer already allocated for this index. */
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_stats.c dpdk-18.11.8/drivers/net/bnxt/bnxt_stats.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_stats.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_stats.c	2020-05-18 15:00:53.000000000 +0100
@@ -384,11 +384,8 @@
 	struct bnxt *bp = eth_dev->data->dev_private;
 	unsigned int num_q_stats;
 
-	memset(bnxt_stats, 0, sizeof(*bnxt_stats));
-	if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
-		PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
+	if (!(bp->flags & BNXT_FLAG_INIT_DONE))
 		return -EIO;
-	}
 
 	num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
diff -Nru dpdk-18.11.6/drivers/net/bnxt/bnxt_vnic.c dpdk-18.11.8/drivers/net/bnxt/bnxt_vnic.c
--- dpdk-18.11.6/drivers/net/bnxt/bnxt_vnic.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/bnxt/bnxt_vnic.c	2020-05-18 15:00:53.000000000 +0100
@@ -140,18 +140,6 @@
 			return -ENOMEM;
 	}
 	mz_phys_addr = mz->iova;
-	if ((unsigned long)mz->addr == mz_phys_addr) {
-		PMD_DRV_LOG(WARNING,
-			"Memzone physical address same as virtual.\n");
-		PMD_DRV_LOG(WARNING,
-			"Using rte_mem_virt2iova()\n");
-		mz_phys_addr = rte_mem_virt2iova(mz->addr);
-		if (mz_phys_addr == RTE_BAD_IOVA) {
-			PMD_DRV_LOG(ERR,
-				    "unable to map to physical memory\n");
-			return -ENOMEM;
-		}
-	}
 
 	for (i = 0; i < max_vnics; i++) {
 		vnic = &bp->vnic_info[i];
diff -Nru dpdk-18.11.6/drivers/net/cxgbe/cxgbe.h dpdk-18.11.8/drivers/net/cxgbe/cxgbe.h
--- dpdk-18.11.6/drivers/net/cxgbe/cxgbe.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/cxgbe/cxgbe.h	2020-05-18 15:00:53.000000000 +0100
@@ -39,7 +39,8 @@
 			   DEV_TX_OFFLOAD_IPV4_CKSUM | \
 			   DEV_TX_OFFLOAD_UDP_CKSUM | \
 			   DEV_TX_OFFLOAD_TCP_CKSUM | \
-			   DEV_TX_OFFLOAD_TCP_TSO)
+			   DEV_TX_OFFLOAD_TCP_TSO | \
+			   DEV_TX_OFFLOAD_MULTI_SEGS)
 
 #define CXGBE_RX_OFFLOADS (DEV_RX_OFFLOAD_VLAN_STRIP | \
 			   DEV_RX_OFFLOAD_IPV4_CKSUM | \
diff -Nru dpdk-18.11.6/drivers/net/dpaa/dpaa_ethdev.c dpdk-18.11.8/drivers/net/dpaa/dpaa_ethdev.c
--- dpdk-18.11.6/drivers/net/dpaa/dpaa_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/dpaa/dpaa_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -172,7 +172,7 @@
 	}
 
 	if (frame_size > ETHER_MAX_LEN)
-		dev->data->dev_conf.rxmode.offloads &=
+		dev->data->dev_conf.rxmode.offloads |=
 						DEV_RX_OFFLOAD_JUMBO_FRAME;
 	else
 		dev->data->dev_conf.rxmode.offloads &=
diff -Nru dpdk-18.11.6/drivers/net/failsafe/failsafe_ops.c dpdk-18.11.8/drivers/net/failsafe/failsafe_ops.c
--- dpdk-18.11.6/drivers/net/failsafe/failsafe_ops.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/failsafe/failsafe_ops.c	2020-05-18 15:00:53.000000000 +0100
@@ -827,6 +827,8 @@
 	info->rx_queue_offload_capa &= sinfo->rx_queue_offload_capa;
 	info->tx_queue_offload_capa &= sinfo->tx_queue_offload_capa;
 	info->flow_type_rss_offloads &= sinfo->flow_type_rss_offloads;
+	info->hash_key_size = RTE_MIN(info->hash_key_size,
+				      sinfo->hash_key_size);
 }
 
 /**
@@ -875,6 +877,7 @@
 	infos->max_hash_mac_addrs = UINT32_MAX;
 	infos->max_vfs = UINT16_MAX;
 	infos->max_vmdq_pools = UINT16_MAX;
+	infos->hash_key_size = UINT8_MAX;
 
 	/*
 	 * Set of capabilities that can be verified upon
diff -Nru dpdk-18.11.6/drivers/net/fm10k/fm10k_rxtx.c dpdk-18.11.8/drivers/net/fm10k/fm10k_rxtx.c
--- dpdk-18.11.6/drivers/net/fm10k/fm10k_rxtx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/fm10k/fm10k_rxtx.c	2020-05-18 15:00:53.000000000 +0100
@@ -584,6 +584,8 @@
 	/* set vlan if requested */
 	if (mb->ol_flags & PKT_TX_VLAN_PKT)
 		q->hw_ring[q->next_free].vlan = mb->vlan_tci;
+	else
+		q->hw_ring[q->next_free].vlan = 0;
 
 	q->sw_ring[q->next_free] = mb;
 	q->hw_ring[q->next_free].buffer_addr =
diff -Nru dpdk-18.11.6/drivers/net/fm10k/Makefile dpdk-18.11.8/drivers/net/fm10k/Makefile
--- dpdk-18.11.6/drivers/net/fm10k/Makefile	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/fm10k/Makefile	2020-05-18 15:00:53.000000000 +0100
@@ -74,6 +74,8 @@
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c
+ifeq ($(CONFIG_RTE_ARCH_X86), y)
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c
+endif
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff -Nru dpdk-18.11.6/drivers/net/i40e/base/i40e_adminq.c dpdk-18.11.8/drivers/net/i40e/base/i40e_adminq.c
--- dpdk-18.11.6/drivers/net/i40e/base/i40e_adminq.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/i40e/base/i40e_adminq.c	2020-05-18 15:00:53.000000000 +0100
@@ -835,7 +835,7 @@
 	if (val >= hw->aq.num_asq_entries) {
 		i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
 			   "AQTX: head overrun at %d\n", val);
-		status = I40E_ERR_QUEUE_EMPTY;
+		status = I40E_ERR_ADMIN_QUEUE_FULL;
 		goto asq_send_command_error;
 	}
 
diff -Nru dpdk-18.11.6/drivers/net/i40e/base/i40e_common.c dpdk-18.11.8/drivers/net/i40e/base/i40e_common.c
--- dpdk-18.11.6/drivers/net/i40e/base/i40e_common.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/i40e/base/i40e_common.c	2020-05-18 15:00:53.000000000 +0100
@@ -1702,19 +1702,22 @@
 		status = i40e_asq_send_command(hw, &desc, abilities,
 					       abilities_size, cmd_details);
 
-		if (status != I40E_SUCCESS)
-			break;
-
-		if (hw->aq.asq_last_status == I40E_AQ_RC_EIO) {
+		switch (hw->aq.asq_last_status) {
+		case I40E_AQ_RC_EIO:
 			status = I40E_ERR_UNKNOWN_PHY;
 			break;
-		} else if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) {
+		case I40E_AQ_RC_EAGAIN:
 			i40e_msec_delay(1);
 			total_delay++;
 			status = I40E_ERR_TIMEOUT;
+			break;
+		/* also covers I40E_AQ_RC_OK */
+		default:
+			break;
 		}
-	} while ((hw->aq.asq_last_status != I40E_AQ_RC_OK) &&
-		 (total_delay < max_delay));
+
+	} while ((hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) &&
+		(total_delay < max_delay));
 
 	if (status != I40E_SUCCESS)
 		return status;
@@ -4302,7 +4305,7 @@
 
 	cmd->type = mib_type;
 	cmd->length = CPU_TO_LE16(buff_size);
-	cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
+	cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)buff));
 	cmd->address_low =  CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
 
 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
diff -Nru dpdk-18.11.6/drivers/net/i40e/base/i40e_type.h dpdk-18.11.8/drivers/net/i40e/base/i40e_type.h
--- dpdk-18.11.6/drivers/net/i40e/base/i40e_type.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/i40e/base/i40e_type.h	2020-05-18 15:00:53.000000000 +0100
@@ -79,8 +79,8 @@
 #define I40E_HI_BYTE(x)		((u8)(((x) >> 8) & 0xFF))
 #define I40E_LO_BYTE(x)		((u8)((x) & 0xFF))
 
-/* Number of Transmit Descriptors must be a multiple of 8. */
-#define I40E_REQ_TX_DESCRIPTOR_MULTIPLE	8
+/* Number of Transmit Descriptors must be a multiple of 32. */
+#define I40E_REQ_TX_DESCRIPTOR_MULTIPLE	32
 /* Number of Receive Descriptors must be a multiple of 32 if
  * the number of descriptors is greater than 32.
  */
diff -Nru dpdk-18.11.6/drivers/net/i40e/i40e_rxtx.c dpdk-18.11.8/drivers/net/i40e/i40e_rxtx.c
--- dpdk-18.11.6/drivers/net/i40e/i40e_rxtx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/i40e/i40e_rxtx.c	2020-05-18 15:00:53.000000000 +0100
@@ -1002,6 +1002,24 @@
 	return ctx_desc;
 }
 
+/* HW requires that Tx buffer size ranges from 1B up to (16K-1)B. */
+#define I40E_MAX_DATA_PER_TXD \
+	(I40E_TXD_QW1_TX_BUF_SZ_MASK >> I40E_TXD_QW1_TX_BUF_SZ_SHIFT)
+/* Calculate the number of TX descriptors needed for each pkt */
+static inline uint16_t
+i40e_calc_pkt_desc(struct rte_mbuf *tx_pkt)
+{
+	struct rte_mbuf *txd = tx_pkt;
+	uint16_t count = 0;
+
+	while (txd != NULL) {
+		count += DIV_ROUND_UP(txd->data_len, I40E_MAX_DATA_PER_TXD);
+		txd = txd->next;
+	}
+
+	return count;
+}
+
 uint16_t
 i40e_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
@@ -1034,7 +1052,7 @@
 
 	/* Check if the descriptor ring needs to be cleaned. */
 	if (txq->nb_tx_free < txq->tx_free_thresh)
-		i40e_xmit_cleanup(txq);
+		(void)i40e_xmit_cleanup(txq);
 
 	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
 		td_cmd = 0;
@@ -1059,8 +1077,15 @@
 		 * The number of descriptors that must be allocated for
 		 * a packet equals to the number of the segments of that
 		 * packet plus 1 context descriptor if needed.
+		 * Recalculate the needed tx descs when TSO enabled in case
+		 * the mbuf data size exceeds max data size that hw allows
+		 * per tx desc.
 		 */
-		nb_used = (uint16_t)(tx_pkt->nb_segs + nb_ctx);
+		if (ol_flags & PKT_TX_TCP_SEG)
+			nb_used = (uint16_t)(i40e_calc_pkt_desc(tx_pkt) +
+					     nb_ctx);
+		else
+			nb_used = (uint16_t)(tx_pkt->nb_segs + nb_ctx);
 		tx_last = (uint16_t)(tx_id + nb_used - 1);
 
 		/* Circular ring */
@@ -1173,6 +1198,24 @@
 			slen = m_seg->data_len;
 			buf_dma_addr = rte_mbuf_data_iova(m_seg);
 
+			while ((ol_flags & PKT_TX_TCP_SEG) &&
+				unlikely(slen > I40E_MAX_DATA_PER_TXD)) {
+				txd->buffer_addr =
+					rte_cpu_to_le_64(buf_dma_addr);
+				txd->cmd_type_offset_bsz =
+					i40e_build_ctob(td_cmd,
+					td_offset, I40E_MAX_DATA_PER_TXD,
+					td_tag);
+
+				buf_dma_addr += I40E_MAX_DATA_PER_TXD;
+				slen -= I40E_MAX_DATA_PER_TXD;
+
+				txe->last_id = tx_last;
+				tx_id = txe->next_id;
+				txe = txn;
+				txd = &txr[tx_id];
+				txn = &sw_ring[txe->next_id];
+			}
 			PMD_TX_LOG(DEBUG, "mbuf: %p, TDD[%u]:\n"
 				"buf_dma_addr: %#"PRIx64";\n"
 				"td_cmd: %#x;\n"
diff -Nru dpdk-18.11.6/drivers/net/ixgbe/ixgbe_ethdev.c dpdk-18.11.8/drivers/net/ixgbe/ixgbe_ethdev.c
--- dpdk-18.11.6/drivers/net/ixgbe/ixgbe_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/ixgbe/ixgbe_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -374,6 +374,7 @@
 					 struct rte_eth_udp_tunnel *udp_tunnel);
 static int ixgbe_filter_restore(struct rte_eth_dev *dev);
 static void ixgbe_l2_tunnel_conf(struct rte_eth_dev *dev);
+static int ixgbe_wait_for_link_up(struct ixgbe_hw *hw);
 
 /*
  * Define VF Stats MACRO for Non "cleared on read" register
@@ -1153,8 +1154,8 @@
 	memset(dcb_config, 0, sizeof(struct ixgbe_dcb_config));
 	ixgbe_dcb_init(hw, dcb_config);
 	/* Get Hardware Flow Control setting */
-	hw->fc.requested_mode = ixgbe_fc_full;
-	hw->fc.current_mode = ixgbe_fc_full;
+	hw->fc.requested_mode = ixgbe_fc_none;
+	hw->fc.current_mode = ixgbe_fc_none;
 	hw->fc.pause_time = IXGBE_FC_PAUSE;
 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
 		hw->fc.low_water[i] = IXGBE_FC_LO;
@@ -2572,6 +2573,39 @@
 	return 0;
 }
 
+static int
+ixgbe_flow_ctrl_enable(struct rte_eth_dev *dev, struct ixgbe_hw *hw)
+{
+	struct ixgbe_adapter *adapter = dev->data->dev_private;
+	int err;
+	uint32_t mflcn;
+
+	err = ixgbe_fc_enable(hw);
+
+	/* Not negotiated is not an error case */
+	if (err == IXGBE_SUCCESS || err == IXGBE_ERR_FC_NOT_NEGOTIATED) {
+		/*
+		 *check if we want to forward MAC frames - driver doesn't
+		 *have native capability to do that,
+		 *so we'll write the registers ourselves
+		 */
+
+		mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
+
+		/* set or clear MFLCN.PMCF bit depending on configuration */
+		if (adapter->mac_ctrl_frame_fwd != 0)
+			mflcn |= IXGBE_MFLCN_PMCF;
+		else
+			mflcn &= ~IXGBE_MFLCN_PMCF;
+
+		IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn);
+		IXGBE_WRITE_FLUSH(hw);
+
+		return 0;
+	}
+	return err;
+}
+
 /*
  * Configure device link speed and setup link.
  * It returns 0 on success.
@@ -2708,6 +2742,12 @@
 
 	ixgbe_restore_statistics_mapping(dev);
 
+	err = ixgbe_flow_ctrl_enable(dev, hw);
+	if (err < 0) {
+		PMD_INIT_LOG(ERR, "enable flow ctrl err");
+		goto error;
+	}
+
 	err = ixgbe_dev_rxtx_start(dev);
 	if (err < 0) {
 		PMD_INIT_LOG(ERR, "Unable to start rxtx queues");
@@ -2831,6 +2871,11 @@
 			    "please call hierarchy_commit() "
 			    "before starting the port");
 
+	/* wait for the controller to acquire link */
+	err = ixgbe_wait_for_link_up(hw);
+	if (err)
+		goto error;
+
 	/*
 	 * Update link status right before return, because it may
 	 * start link configuration process in a separate thread.
@@ -2919,6 +2964,8 @@
 	tm_conf->committed = false;
 
 	adapter->rss_reta_updated = 0;
+
+	adapter->mac_ctrl_frame_fwd = 0;
 }
 
 /*
@@ -4078,6 +4125,38 @@
 	intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
 }
 
+/*
+ * In freebsd environment, nic_uio drivers do not support interrupts,
+ * rte_intr_callback_register() will fail to register interrupts.
+ * We can not make link status to change from down to up by interrupt
+ * callback. So we need to wait for the controller to acquire link
+ * when ports start.
+ * It returns 0 on link up.
+ */
+static int
+ixgbe_wait_for_link_up(struct ixgbe_hw *hw)
+{
+#ifdef RTE_EXEC_ENV_FREEBSD
+	int err, i, link_up = 0;
+	uint32_t speed = 0;
+	const int nb_iter = 25;
+
+	for (i = 0; i < nb_iter; i++) {
+		err = ixgbe_check_link(hw, &speed, &link_up, 0);
+		if (err)
+			return err;
+		if (link_up)
+			return 0;
+		msec_delay(200);
+	}
+
+	return 0;
+#else
+	RTE_SET_USED(hw);
+	return 0;
+#endif
+}
+
 /* return 0 means link status changed, -1 means not changed */
 int
 ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
@@ -4119,9 +4198,11 @@
 		return rte_eth_linkstatus_set(dev, &link);
 	}
 
-	esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
-	if ((esdp_reg & IXGBE_ESDP_SDP3))
-		link_up = 0;
+	if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {
+		esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
+		if ((esdp_reg & IXGBE_ESDP_SDP3))
+			link_up = 0;
+	}
 
 	if (link_up == 0) {
 		if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {
@@ -4598,10 +4679,10 @@
 ixgbe_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 {
 	struct ixgbe_hw *hw;
+	struct ixgbe_adapter *adapter = dev->data->dev_private;
 	int err;
 	uint32_t rx_buf_size;
 	uint32_t max_high_water;
-	uint32_t mflcn;
 	enum ixgbe_fc_mode rte_fcmode_2_ixgbe_fcmode[] = {
 		ixgbe_fc_none,
 		ixgbe_fc_rx_pause,
@@ -4633,31 +4714,14 @@
 	hw->fc.low_water[0]   = fc_conf->low_water;
 	hw->fc.send_xon       = fc_conf->send_xon;
 	hw->fc.disable_fc_autoneg = !fc_conf->autoneg;
+	adapter->mac_ctrl_frame_fwd = fc_conf->mac_ctrl_frame_fwd;
 
-	err = ixgbe_fc_enable(hw);
-
-	/* Not negotiated is not an error case */
-	if ((err == IXGBE_SUCCESS) || (err == IXGBE_ERR_FC_NOT_NEGOTIATED)) {
-
-		/* check if we want to forward MAC frames - driver doesn't have native
-		 * capability to do that, so we'll write the registers ourselves */
-
-		mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
-
-		/* set or clear MFLCN.PMCF bit depending on configuration */
-		if (fc_conf->mac_ctrl_frame_fwd != 0)
-			mflcn |= IXGBE_MFLCN_PMCF;
-		else
-			mflcn &= ~IXGBE_MFLCN_PMCF;
-
-		IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn);
-		IXGBE_WRITE_FLUSH(hw);
-
-		return 0;
+	err = ixgbe_flow_ctrl_enable(dev, hw);
+	if (err < 0) {
+		PMD_INIT_LOG(ERR, "ixgbe_flow_ctrl_enable = 0x%x", err);
+		return -EIO;
 	}
-
-	PMD_INIT_LOG(ERR, "ixgbe_fc_enable = 0x%x", err);
-	return -EIO;
+	return err;
 }
 
 /**
diff -Nru dpdk-18.11.6/drivers/net/ixgbe/ixgbe_ethdev.h dpdk-18.11.8/drivers/net/ixgbe/ixgbe_ethdev.h
--- dpdk-18.11.6/drivers/net/ixgbe/ixgbe_ethdev.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/ixgbe/ixgbe_ethdev.h	2020-05-18 15:00:53.000000000 +0100
@@ -505,6 +505,7 @@
 	 * mailbox status) link status.
 	 */
 	uint8_t pflink_fullchk;
+	uint8_t mac_ctrl_frame_fwd;
 };
 
 struct ixgbe_vf_representor {
diff -Nru dpdk-18.11.6/drivers/net/ixgbe/ixgbe_rxtx.c dpdk-18.11.8/drivers/net/ixgbe/ixgbe_rxtx.c
--- dpdk-18.11.6/drivers/net/ixgbe/ixgbe_rxtx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/ixgbe/ixgbe_rxtx.c	2020-05-18 15:00:53.000000000 +0100
@@ -87,11 +87,6 @@
 #define rte_ixgbe_prefetch(p)   do {} while (0)
 #endif
 
-#ifdef RTE_IXGBE_INC_VECTOR
-uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
-				    uint16_t nb_pkts);
-#endif
-
 /*********************************************************************
  *
  *  TX functions
@@ -990,6 +985,12 @@
 			return i;
 		}
 
+		/* check the size of packet */
+		if (m->pkt_len < IXGBE_TX_MIN_PKT_LEN) {
+			rte_errno = EINVAL;
+			return i;
+		}
+
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
 		ret = rte_validate_tx_offload(m);
 		if (ret != 0) {
diff -Nru dpdk-18.11.6/drivers/net/ixgbe/ixgbe_rxtx.h dpdk-18.11.8/drivers/net/ixgbe/ixgbe_rxtx.h
--- dpdk-18.11.6/drivers/net/ixgbe/ixgbe_rxtx.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/ixgbe/ixgbe_rxtx.h	2020-05-18 15:00:53.000000000 +0100
@@ -53,6 +53,8 @@
 
 #define IXGBE_TX_MAX_SEG                    40
 
+#define IXGBE_TX_MIN_PKT_LEN		     14
+
 #define IXGBE_PACKET_TYPE_MASK_82599        0X7F
 #define IXGBE_PACKET_TYPE_MASK_X550         0X10FF
 #define IXGBE_PACKET_TYPE_MASK_TUNNEL       0XFF
diff -Nru dpdk-18.11.6/drivers/net/mlx5/mlx5.c dpdk-18.11.8/drivers/net/mlx5/mlx5.c
--- dpdk-18.11.6/drivers/net/mlx5/mlx5.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/mlx5/mlx5.c	2020-05-18 15:00:53.000000000 +0100
@@ -734,7 +734,8 @@
 mlx5_dev_spawn(struct rte_device *dpdk_dev,
 	       struct ibv_device *ibv_dev,
 	       struct mlx5_dev_config config,
-	       const struct mlx5_switch_info *switch_info)
+	       const struct mlx5_switch_info *switch_info,
+	       unsigned int ifindex)
 {
 	struct ibv_context *ctx;
 	struct ibv_device_attr_ex attr;
@@ -1132,6 +1133,12 @@
 		eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
 		eth_dev->data->representor_id = priv->representor_id;
 	}
+	/*
+	 * Store associated network device interface index. This index
+	 * is permanent throughout the lifetime of device. So, we may store
+	 * the ifindex here and use the cached value further.
+	 */
+	priv->if_index = ifindex;
 	eth_dev->data->dev_private = priv;
 	priv->dev_data = eth_dev->data;
 	eth_dev->data->mac_addrs = priv->mac;
@@ -1492,7 +1499,7 @@
 
 		list[i].eth_dev = mlx5_dev_spawn(&pci_dev->device,
 						 list[i].ibv_dev, dev_config,
-						 &list[i].info);
+						 &list[i].info, list[i].ifindex);
 		if (!list[i].eth_dev) {
 			if (rte_errno != EBUSY && rte_errno != EEXIST)
 				break;
diff -Nru dpdk-18.11.6/drivers/net/mlx5/mlx5_ethdev.c dpdk-18.11.8/drivers/net/mlx5/mlx5_ethdev.c
--- dpdk-18.11.6/drivers/net/mlx5/mlx5_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/mlx5/mlx5_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -220,10 +220,10 @@
 mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
-	unsigned int ifindex =
-		priv->nl_socket_rdma >= 0 ?
-		mlx5_nl_ifindex(priv->nl_socket_rdma, priv->ibdev_name) : 0;
+	unsigned int ifindex;
 
+	assert(priv);
+	ifindex = mlx5_ifindex(dev);
 	if (!ifindex) {
 		if (!priv->representor)
 			return mlx5_get_master_ifname(dev, ifname);
@@ -248,14 +248,14 @@
 unsigned int
 mlx5_ifindex(const struct rte_eth_dev *dev)
 {
-	char ifname[IF_NAMESIZE];
+	struct mlx5_priv *priv = dev->data->dev_private;
 	unsigned int ifindex;
 
-	if (mlx5_get_ifname(dev, &ifname))
-		return 0;
-	ifindex = if_nametoindex(ifname);
+	assert(priv);
+	assert(priv->if_index);
+	ifindex = priv->if_index;
 	if (!ifindex)
-		rte_errno = errno;
+		rte_errno = ENXIO;
 	return ifindex;
 }
 
@@ -502,7 +502,6 @@
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_dev_config *config = &priv->config;
 	unsigned int max;
-	char ifname[IF_NAMESIZE];
 
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
@@ -523,8 +522,7 @@
 	info->rx_offload_capa = (mlx5_get_rx_port_offloads() |
 				 info->rx_queue_offload_capa);
 	info->tx_offload_capa = mlx5_get_tx_port_offloads(dev);
-	if (mlx5_get_ifname(dev, &ifname) == 0)
-		info->if_index = if_nametoindex(ifname);
+	info->if_index = mlx5_ifindex(dev);
 	info->reta_size = priv->reta_idx_n ?
 		priv->reta_idx_n : config->ind_table_max_size;
 	info->hash_key_size = MLX5_RSS_HASH_KEY_LEN;
diff -Nru dpdk-18.11.6/drivers/net/mlx5/mlx5_flow.c dpdk-18.11.8/drivers/net/mlx5/mlx5_flow.c
--- dpdk-18.11.6/drivers/net/mlx5/mlx5_flow.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/mlx5/mlx5_flow.c	2020-05-18 15:00:53.000000000 +0100
@@ -163,7 +163,9 @@
 		.rss_types = ETH_RSS_NONFRAG_IPV6_TCP,
 	},
 	[MLX5_EXPANSION_VXLAN] = {
-		.next = RTE_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_ETH),
+		.next = RTE_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_ETH,
+						 MLX5_EXPANSION_IPV4,
+						 MLX5_EXPANSION_IPV6),
 		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
 	},
 	[MLX5_EXPANSION_VXLAN_GPE] = {
diff -Nru dpdk-18.11.6/drivers/net/mlx5/mlx5_flow_dv.c dpdk-18.11.8/drivers/net/mlx5/mlx5_flow_dv.c
--- dpdk-18.11.6/drivers/net/mlx5/mlx5_flow_dv.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/mlx5/mlx5_flow_dv.c	2020-05-18 15:00:53.000000000 +0100
@@ -1184,6 +1184,23 @@
 	/* The value must be in the range of the mask. */
 	for (i = 0; i < sizeof(eth_m->dst); ++i)
 		l24_v[i] = eth_m->src.addr_bytes[i] & eth_v->src.addr_bytes[i];
+	if (eth_v->type) {
+		/* When ethertype is present set mask for tagged VLAN. */
+		MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, 1);
+		/* Set value for tagged VLAN if ethertype is 802.1Q. */
+		if (eth_v->type == RTE_BE16(ETHER_TYPE_VLAN) ||
+		    eth_v->type == RTE_BE16(ETHER_TYPE_QINQ)) {
+			MLX5_SET(fte_match_set_lyr_2_4, headers_v, cvlan_tag,
+				 1);
+			/* Return here to avoid setting match on ethertype. */
+			return;
+		}
+	}
+	/*
+	 * HW supports match on one Ethertype, the Ethertype following the last
+	 * VLAN tag of the packet (see PRM).
+	 * Set match on ethertype only if ETH header is not followed by VLAN.
+	 */
 	MLX5_SET(fte_match_set_lyr_2_4, headers_m, ethertype,
 		 rte_be_to_cpu_16(eth_m->type));
 	l24_v = MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, ethertype);
@@ -1252,12 +1269,15 @@
  *   Flow matcher value.
  * @param[in] item
  *   Flow pattern to translate.
+ * @param[in] item_flags
+ *   Bit-fields that holds the items detected until now.
  * @param[in] inner
  *   Item is inner pattern.
  */
 static void
 flow_dv_translate_item_ipv4(void *matcher, void *key,
 			    const struct rte_flow_item *item,
+			    const uint64_t item_flags,
 			    int inner)
 {
 	const struct rte_flow_item_ipv4 *ipv4_m = item->mask;
@@ -1314,6 +1334,12 @@
 		 ipv4_m->hdr.next_proto_id);
 	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
 		 ipv4_v->hdr.next_proto_id & ipv4_m->hdr.next_proto_id);
+	/*
+	 * On outer header (which must contains L2), or inner header with L2,
+	 * set cvlan_tag mask bit to mark this packet as untagged.
+	 */
+	if (!inner || item_flags & MLX5_FLOW_LAYER_INNER_L2)
+		MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, 1);
 }
 
 /**
@@ -1325,12 +1351,15 @@
  *   Flow matcher value.
  * @param[in] item
  *   Flow pattern to translate.
+ * @param[in] item_flags
+ *   Bit-fields that holds the items detected until now.
  * @param[in] inner
  *   Item is inner pattern.
  */
 static void
 flow_dv_translate_item_ipv6(void *matcher, void *key,
 			    const struct rte_flow_item *item,
+			    const uint64_t item_flags,
 			    int inner)
 {
 	const struct rte_flow_item_ipv6 *ipv6_m = item->mask;
@@ -1413,6 +1442,12 @@
 		 ipv6_m->hdr.proto);
 	MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
 		 ipv6_v->hdr.proto & ipv6_m->hdr.proto);
+	/*
+	 * On outer header (which must contains L2), or inner header with L2,
+	 * set cvlan_tag mask bit to mark this packet as untagged.
+	 */
+	if (!inner || item_flags & MLX5_FLOW_LAYER_INNER_L2)
+		MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, 1);
 }
 
 /**
@@ -2088,7 +2123,8 @@
 			break;
 		case RTE_FLOW_ITEM_TYPE_IPV4:
 			flow_dv_translate_item_ipv4(match_mask, match_value,
-						    items, tunnel);
+						    items, item_flags,
+						    tunnel);
 			matcher.priority = MLX5_PRIORITY_MAP_L3;
 			dev_flow->dv.hash_fields |=
 				mlx5_flow_hashfields_adjust
@@ -2100,7 +2136,8 @@
 			break;
 		case RTE_FLOW_ITEM_TYPE_IPV6:
 			flow_dv_translate_item_ipv6(match_mask, match_value,
-						    items, tunnel);
+						    items, item_flags,
+						    tunnel);
 			matcher.priority = MLX5_PRIORITY_MAP_L3;
 			dev_flow->dv.hash_fields |=
 				mlx5_flow_hashfields_adjust
diff -Nru dpdk-18.11.6/drivers/net/mlx5/mlx5.h dpdk-18.11.8/drivers/net/mlx5/mlx5.h
--- dpdk-18.11.6/drivers/net/mlx5/mlx5.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/mlx5/mlx5.h	2020-05-18 15:00:53.000000000 +0100
@@ -197,6 +197,7 @@
 	unsigned int representor:1; /* Device is a port representor. */
 	uint16_t domain_id; /* Switch domain identifier. */
 	int32_t representor_id; /* Port representor identifier. */
+	unsigned int if_index; /* Associated kernel network device index. */
 	/* RX/TX queues. */
 	unsigned int rxqs_n; /* RX queues array size. */
 	unsigned int txqs_n; /* TX queues array size. */
diff -Nru dpdk-18.11.6/drivers/net/netvsc/hn_ethdev.c dpdk-18.11.8/drivers/net/netvsc/hn_ethdev.c
--- dpdk-18.11.6/drivers/net/netvsc/hn_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/netvsc/hn_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -240,6 +240,9 @@
 	dev_info->max_rx_queues = hv->max_queues;
 	dev_info->max_tx_queues = hv->max_queues;
 
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return;
+
 	hn_rndis_get_offload(hv, dev_info);
 	hn_vf_info_get(hv, dev_info);
 }
@@ -619,6 +622,10 @@
 	if (error)
 		hn_rndis_set_rxfilter(hv, 0);
 
+	/* Initialize Link state */
+	if (error == 0)
+		hn_dev_link_update(dev, 0);
+
 	return error;
 }
 
@@ -721,6 +728,9 @@
 	eth_dev->tx_pkt_burst = &hn_xmit_pkts;
 	eth_dev->rx_pkt_burst = &hn_recv_pkts;
 
+	/* Since Hyper-V only supports one MAC address, just use local data */
+	eth_dev->data->mac_addrs = &hv->mac_addr;
+
 	/*
 	 * for secondary processes, we don't initialize any further as primary
 	 * has already done this work.
@@ -728,9 +738,6 @@
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	/* Since Hyper-V only supports one MAC address, just use local data */
-	eth_dev->data->mac_addrs = &hv->mac_addr;
-
 	hv->vmbus = vmbus;
 	hv->rxbuf_res = &vmbus->resource[HV_RECV_BUF_MAP];
 	hv->chim_res  = &vmbus->resource[HV_SEND_BUF_MAP];
diff -Nru dpdk-18.11.6/drivers/net/octeontx/octeontx_ethdev.c dpdk-18.11.8/drivers/net/octeontx/octeontx_ethdev.c
--- dpdk-18.11.6/drivers/net/octeontx/octeontx_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/octeontx/octeontx_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -346,6 +346,10 @@
 		rte_free(txq);
 	}
 
+	/* Free MAC address table */
+	rte_free(dev->data->mac_addrs);
+	dev->data->mac_addrs = NULL;
+
 	dev->tx_pkt_burst = NULL;
 	dev->rx_pkt_burst = NULL;
 }
@@ -1081,7 +1085,7 @@
 		octeontx_log_err("eth_dev->port_id (%d) is diff to orig (%d)",
 				data->port_id, nic->port_id);
 		res = -EINVAL;
-		goto err;
+		goto free_mac_addrs;
 	}
 
 	/* Update port_id mac to eth_dev */
@@ -1100,6 +1104,8 @@
 	rte_eth_dev_probing_finish(eth_dev);
 	return data->port_id;
 
+free_mac_addrs:
+	rte_free(data->mac_addrs);
 err:
 	if (nic)
 		octeontx_port_close(nic);
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_dev_api.h dpdk-18.11.8/drivers/net/qede/base/ecore_dev_api.h
--- dpdk-18.11.6/drivers/net/qede/base/ecore_dev_api.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_dev_api.h	2020-05-18 15:00:53.000000000 +0100
@@ -277,6 +277,9 @@
 
 	/* Indicates whether this PF serves a storage target */
 	bool b_is_target;
+
+	/* retry count for VF acquire on channel timeout */
+	u8 acquire_retry_cnt;
 };
 
 /**
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_dev.c dpdk-18.11.8/drivers/net/qede/base/ecore_dev.c
--- dpdk-18.11.6/drivers/net/qede/base/ecore_dev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_dev.c	2020-05-18 15:00:53.000000000 +0100
@@ -5500,7 +5500,7 @@
 	p_hwfn->db_phys_addr = db_phys_addr;
 
 	if (IS_VF(p_dev))
-		return ecore_vf_hw_prepare(p_hwfn);
+		return ecore_vf_hw_prepare(p_hwfn, p_params);
 
 	/* Validate that chip access is feasible */
 	if (REG_RD(p_hwfn, PXP_PF_ME_OPAQUE_ADDR) == 0xffffffff) {
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_iov_api.h dpdk-18.11.8/drivers/net/qede/base/ecore_iov_api.h
--- dpdk-18.11.6/drivers/net/qede/base/ecore_iov_api.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_iov_api.h	2020-05-18 15:00:53.000000000 +0100
@@ -51,6 +51,7 @@
 	PFVF_STATUS_NO_RESOURCE,
 	PFVF_STATUS_FORCED,
 	PFVF_STATUS_MALICIOUS,
+	PFVF_STATUS_ACQUIRED,
 };
 
 struct ecore_mcp_link_params;
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_sriov.c dpdk-18.11.8/drivers/net/qede/base/ecore_sriov.c
--- dpdk-18.11.6/drivers/net/qede/base/ecore_sriov.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_sriov.c	2020-05-18 15:00:53.000000000 +0100
@@ -61,6 +61,39 @@
 	"CHANNEL_TLV_COALESCE_READ",
 	"CHANNEL_TLV_BULLETIN_UPDATE_MAC",
 	"CHANNEL_TLV_UPDATE_MTU",
+	"CHANNEL_TLV_RDMA_ACQUIRE",
+	"CHANNEL_TLV_RDMA_START",
+	"CHANNEL_TLV_RDMA_STOP",
+	"CHANNEL_TLV_RDMA_ADD_USER",
+	"CHANNEL_TLV_RDMA_REMOVE_USER",
+	"CHANNEL_TLV_RDMA_QUERY_COUNTERS",
+	"CHANNEL_TLV_RDMA_ALLOC_TID",
+	"CHANNEL_TLV_RDMA_REGISTER_TID",
+	"CHANNEL_TLV_RDMA_DEREGISTER_TID",
+	"CHANNEL_TLV_RDMA_FREE_TID",
+	"CHANNEL_TLV_RDMA_CREATE_CQ",
+	"CHANNEL_TLV_RDMA_RESIZE_CQ",
+	"CHANNEL_TLV_RDMA_DESTROY_CQ",
+	"CHANNEL_TLV_RDMA_CREATE_QP",
+	"CHANNEL_TLV_RDMA_MODIFY_QP",
+	"CHANNEL_TLV_RDMA_QUERY_QP",
+	"CHANNEL_TLV_RDMA_DESTROY_QP",
+	"CHANNEL_TLV_RDMA_CREATE_SRQ",
+	"CHANNEL_TLV_RDMA_MODIFY_SRQ",
+	"CHANNEL_TLV_RDMA_DESTROY_SRQ",
+	"CHANNEL_TLV_RDMA_QUERY_PORT",
+	"CHANNEL_TLV_RDMA_QUERY_DEVICE",
+	"CHANNEL_TLV_RDMA_IWARP_CONNECT",
+	"CHANNEL_TLV_RDMA_IWARP_ACCEPT",
+	"CHANNEL_TLV_RDMA_IWARP_CREATE_LISTEN",
+	"CHANNEL_TLV_RDMA_IWARP_DESTROY_LISTEN",
+	"CHANNEL_TLV_RDMA_IWARP_PAUSE_LISTEN",
+	"CHANNEL_TLV_RDMA_IWARP_REJECT",
+	"CHANNEL_TLV_RDMA_IWARP_SEND_RTR",
+	"CHANNEL_TLV_ESTABLISH_LL2_CONN",
+	"CHANNEL_TLV_TERMINATE_LL2_CONN",
+	"CHANNEL_TLV_ASYNC_EVENT",
+	"CHANNEL_TLV_SOFT_FLR",
 	"CHANNEL_TLV_MAX"
 };
 
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_vf_api.h dpdk-18.11.8/drivers/net/qede/base/ecore_vf_api.h
--- dpdk-18.11.6/drivers/net/qede/base/ecore_vf_api.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_vf_api.h	2020-05-18 15:00:53.000000000 +0100
@@ -11,6 +11,9 @@
 #include "ecore_mcp_api.h"
 
 #ifdef CONFIG_ECORE_SRIOV
+
+#define ECORE_VF_ACQUIRE_THRESH 3
+
 /**
  * @brief Read the VF bulletin and act on it if needed
  *
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_vf.c dpdk-18.11.8/drivers/net/qede/base/ecore_vf.c
--- dpdk-18.11.6/drivers/net/qede/base/ecore_vf.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_vf.c	2020-05-18 15:00:53.000000000 +0100
@@ -226,7 +226,6 @@
 	return _ecore_vf_pf_release(p_hwfn, true);
 }
 
-#define VF_ACQUIRE_THRESH 3
 static void ecore_vf_pf_acquire_reduce_resc(struct ecore_hwfn *p_hwfn,
 					    struct vf_pf_resc_request *p_req,
 					    struct pf_vf_resc *p_resp)
@@ -251,12 +250,46 @@
 	p_req->num_cids = p_resp->num_cids;
 }
 
-static enum _ecore_status_t ecore_vf_pf_acquire(struct ecore_hwfn *p_hwfn)
+static enum _ecore_status_t
+ecore_vf_pf_soft_flr_acquire(struct ecore_hwfn *p_hwfn)
+{
+	struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
+	struct pfvf_def_resp_tlv *resp;
+	struct vfpf_soft_flr_tlv *req;
+	enum _ecore_status_t rc;
+
+	req = ecore_vf_pf_prep(p_hwfn, CHANNEL_TLV_SOFT_FLR, sizeof(*req));
+
+	/* add list termination tlv */
+	ecore_add_tlv(&p_iov->offset,
+		      CHANNEL_TLV_LIST_END,
+		      sizeof(struct channel_list_end_tlv));
+
+	resp = &p_iov->pf2vf_reply->default_resp;
+	rc = ecore_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
+
+	DP_VERBOSE(p_hwfn, ECORE_MSG_IOV, "rc=0x%x\n", rc);
+
+	/* to release the mutex as ecore_vf_pf_acquire() take the mutex */
+	ecore_vf_pf_req_end(p_hwfn, ECORE_AGAIN);
+
+	/* As of today, there is no mechanism in place for VF to know the FLR
+	 * status, so sufficiently (worst case time) wait for FLR to complete,
+	 * as mailbox request to MFW by the PF for initiating VF flr and PF
+	 * processing VF FLR could take time.
+	 */
+	OSAL_MSLEEP(3000);
+
+	return ecore_vf_pf_acquire(p_hwfn);
+}
+
+enum _ecore_status_t ecore_vf_pf_acquire(struct ecore_hwfn *p_hwfn)
 {
 	struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
 	struct pfvf_acquire_resp_tlv *resp = &p_iov->pf2vf_reply->acquire_resp;
 	struct pf_vf_pfdev_info *pfdev_info = &resp->pfdev_info;
 	struct ecore_vf_acquire_sw_info vf_sw_info;
+	u8 retry_cnt = p_iov->acquire_retry_cnt;
 	struct vf_pf_resc_request *p_resc;
 	bool resources_acquired = false;
 	struct vfpf_acquire_tlv *req;
@@ -317,6 +350,14 @@
 		/* send acquire request */
 		rc = ecore_send_msg2pf(p_hwfn,
 				       &resp->hdr.status, sizeof(*resp));
+
+		if (retry_cnt && rc == ECORE_TIMEOUT) {
+			DP_VERBOSE(p_hwfn, ECORE_MSG_IOV,
+				   "VF retrying to acquire due to VPC timeout\n");
+			retry_cnt--;
+			continue;
+		}
+
 		if (rc != ECORE_SUCCESS)
 			goto exit;
 
@@ -342,7 +383,7 @@
 			resources_acquired = true;
 		} /* PF refuses to allocate our resources */
 		else if (resp->hdr.status == PFVF_STATUS_NO_RESOURCE &&
-			 attempts < VF_ACQUIRE_THRESH) {
+			 attempts < ECORE_VF_ACQUIRE_THRESH) {
 			ecore_vf_pf_acquire_reduce_resc(p_hwfn, p_resc,
 							&resp->resc);
 
@@ -390,6 +431,9 @@
 				  "PF rejected acquisition by VF\n");
 			rc = ECORE_INVAL;
 			goto exit;
+		} else if (resp->hdr.status == PFVF_STATUS_ACQUIRED) {
+			ecore_vf_pf_req_end(p_hwfn, ECORE_AGAIN);
+			return ecore_vf_pf_soft_flr_acquire(p_hwfn);
 		} else {
 			DP_ERR(p_hwfn,
 			       "PF returned err %d to VF acquisition request\n",
@@ -476,7 +520,9 @@
 	return 0;
 }
 
-enum _ecore_status_t ecore_vf_hw_prepare(struct ecore_hwfn *p_hwfn)
+enum _ecore_status_t
+ecore_vf_hw_prepare(struct ecore_hwfn *p_hwfn,
+		    struct ecore_hw_prepare_params *p_params)
 {
 	struct ecore_hwfn *p_lead = ECORE_LEADING_HWFN(p_hwfn->p_dev);
 	struct ecore_vf_iov *p_iov;
@@ -582,6 +628,7 @@
 #endif
 	OSAL_MUTEX_INIT(&p_iov->mutex);
 
+	p_iov->acquire_retry_cnt = p_params->acquire_retry_cnt;
 	p_hwfn->vf_iov_info = p_iov;
 
 	p_hwfn->hw_info.personality = ECORE_PCI_ETH;
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_vf.h dpdk-18.11.8/drivers/net/qede/base/ecore_vf.h
--- dpdk-18.11.6/drivers/net/qede/base/ecore_vf.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_vf.h	2020-05-18 15:00:53.000000000 +0100
@@ -11,6 +11,7 @@
 #include "ecore_vf_api.h"
 #include "ecore_l2_api.h"
 #include "ecore_vfpf_if.h"
+#include "ecore_dev_api.h"
 
 /* Default number of CIDs [total of both Rx and Tx] to be requested
  * by default.
@@ -59,6 +60,9 @@
 	 * bar or via the doorbell bar.
 	 */
 	bool b_doorbell_bar;
+
+	/* retry count for VF acquire on channel timeout */
+	u8 acquire_retry_cnt;
 };
 
 /**
@@ -72,6 +76,8 @@
 enum _ecore_status_t ecore_vf_pf_get_coalesce(struct ecore_hwfn *p_hwfn,
 					      u16 *p_coal,
 					      struct ecore_queue_cid *p_cid);
+
+enum _ecore_status_t ecore_vf_pf_acquire(struct ecore_hwfn *p_hwfn);
 /**
  * @brief VF - Set Rx/Tx coalesce per VF's relative queue.
  *             Coalesce value '0' will omit the configuration.
@@ -92,10 +98,13 @@
  *	sends ACQUIRE message
  *
  * @param p_hwfn
+ * @param p_params
  *
  * @return enum _ecore_status_t
  */
-enum _ecore_status_t ecore_vf_hw_prepare(struct ecore_hwfn *p_hwfn);
+enum _ecore_status_t
+ecore_vf_hw_prepare(struct ecore_hwfn *p_hwfn,
+		    struct ecore_hw_prepare_params *p_params);
 
 /**
  * @brief VF - start the RX Queue by sending a message to the PF
diff -Nru dpdk-18.11.6/drivers/net/qede/base/ecore_vfpf_if.h dpdk-18.11.8/drivers/net/qede/base/ecore_vfpf_if.h
--- dpdk-18.11.6/drivers/net/qede/base/ecore_vfpf_if.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/ecore_vfpf_if.h	2020-05-18 15:00:53.000000000 +0100
@@ -251,6 +251,13 @@
 	u8			padding[3];
 };
 
+/* Soft FLR req */
+struct vfpf_soft_flr_tlv {
+	struct vfpf_first_tlv first_tlv;
+	u32 reserved1;
+	u32 reserved2;
+};
+
 /* Setup Queue */
 struct vfpf_start_rxq_tlv {
 	struct vfpf_first_tlv	first_tlv;
@@ -557,6 +564,7 @@
 	struct vfpf_read_coal_req_tlv		read_coal_req;
 	struct vfpf_bulletin_update_mac_tlv	bulletin_update_mac;
 	struct vfpf_update_mtu_tlv		update_mtu;
+	struct vfpf_soft_flr_tlv		soft_flr;
 	struct tlv_buffer_size			tlv_buf_size;
 };
 
@@ -689,6 +697,39 @@
 	CHANNEL_TLV_COALESCE_READ,
 	CHANNEL_TLV_BULLETIN_UPDATE_MAC,
 	CHANNEL_TLV_UPDATE_MTU,
+	CHANNEL_TLV_RDMA_ACQUIRE,
+	CHANNEL_TLV_RDMA_START,
+	CHANNEL_TLV_RDMA_STOP,
+	CHANNEL_TLV_RDMA_ADD_USER,
+	CHANNEL_TLV_RDMA_REMOVE_USER,
+	CHANNEL_TLV_RDMA_QUERY_COUNTERS,
+	CHANNEL_TLV_RDMA_ALLOC_TID,
+	CHANNEL_TLV_RDMA_REGISTER_TID,
+	CHANNEL_TLV_RDMA_DEREGISTER_TID,
+	CHANNEL_TLV_RDMA_FREE_TID,
+	CHANNEL_TLV_RDMA_CREATE_CQ,
+	CHANNEL_TLV_RDMA_RESIZE_CQ,
+	CHANNEL_TLV_RDMA_DESTROY_CQ,
+	CHANNEL_TLV_RDMA_CREATE_QP,
+	CHANNEL_TLV_RDMA_MODIFY_QP,
+	CHANNEL_TLV_RDMA_QUERY_QP,
+	CHANNEL_TLV_RDMA_DESTROY_QP,
+	CHANNEL_TLV_RDMA_QUERY_PORT,
+	CHANNEL_TLV_RDMA_QUERY_DEVICE,
+	CHANNEL_TLV_RDMA_IWARP_CONNECT,
+	CHANNEL_TLV_RDMA_IWARP_ACCEPT,
+	CHANNEL_TLV_RDMA_IWARP_CREATE_LISTEN,
+	CHANNEL_TLV_RDMA_IWARP_DESTROY_LISTEN,
+	CHANNEL_TLV_RDMA_IWARP_PAUSE_LISTEN,
+	CHANNEL_TLV_RDMA_IWARP_REJECT,
+	CHANNEL_TLV_RDMA_IWARP_SEND_RTR,
+	CHANNEL_TLV_ESTABLISH_LL2_CONN,
+	CHANNEL_TLV_TERMINATE_LL2_CONN,
+	CHANNEL_TLV_ASYNC_EVENT,
+	CHANNEL_TLV_RDMA_CREATE_SRQ,
+	CHANNEL_TLV_RDMA_MODIFY_SRQ,
+	CHANNEL_TLV_RDMA_DESTROY_SRQ,
+	CHANNEL_TLV_SOFT_FLR,
 	CHANNEL_TLV_MAX,
 
 	/* Required for iterating over vport-update tlvs.
diff -Nru dpdk-18.11.6/drivers/net/qede/base/mcp_public.h dpdk-18.11.8/drivers/net/qede/base/mcp_public.h
--- dpdk-18.11.6/drivers/net/qede/base/mcp_public.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/base/mcp_public.h	2020-05-18 15:00:53.000000000 +0100
@@ -1273,6 +1273,7 @@
 /*deprecated don't use*/
 #define DRV_MSG_CODE_INITIATE_FLR_DEPRECATED    0x02000000
 #define DRV_MSG_CODE_INITIATE_PF_FLR            0x02010000
+#define DRV_MSG_CODE_INITIATE_VF_FLR		0x02020000
 #define DRV_MSG_CODE_VF_DISABLED_DONE           0xc0000000
 #define DRV_MSG_CODE_CFG_VF_MSIX                0xc0010000
 #define DRV_MSG_CODE_CFG_PF_VFS_MSIX            0xc0020000
@@ -1704,6 +1705,7 @@
 #define FW_MSG_CODE_NIG_DRAIN_DONE              0x30000000
 #define FW_MSG_CODE_VF_DISABLED_DONE            0xb0000000
 #define FW_MSG_CODE_DRV_CFG_VF_MSIX_DONE        0xb0010000
+#define FW_MSG_CODE_INITIATE_VF_FLR_OK		0xb0030000
 #define FW_MSG_CODE_FLR_ACK                     0x02000000
 #define FW_MSG_CODE_FLR_NACK                    0x02100000
 #define FW_MSG_CODE_SET_DRIVER_DONE		0x02200000
diff -Nru dpdk-18.11.6/drivers/net/qede/qede_ethdev.c dpdk-18.11.8/drivers/net/qede/qede_ethdev.c
--- dpdk-18.11.6/drivers/net/qede/qede_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/qede_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -1442,7 +1442,8 @@
 	if (eth_dev->data->dev_started)
 		qede_dev_stop(eth_dev);
 
-	qede_stop_vport(edev);
+	if (qdev->vport_started)
+		qede_stop_vport(edev);
 	qdev->vport_started = false;
 	qede_fdir_dealloc_resc(eth_dev);
 	qede_dealloc_fp_resc(eth_dev);
diff -Nru dpdk-18.11.6/drivers/net/qede/qede_main.c dpdk-18.11.8/drivers/net/qede/qede_main.c
--- dpdk-18.11.6/drivers/net/qede/qede_main.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/qede/qede_main.c	2020-05-18 15:00:53.000000000 +0100
@@ -56,6 +56,10 @@
 	qed_init_pci(edev, pci_dev);
 
 	memset(&hw_prepare_params, 0, sizeof(hw_prepare_params));
+
+	if (is_vf)
+		hw_prepare_params.acquire_retry_cnt = ECORE_VF_ACQUIRE_THRESH;
+
 	hw_prepare_params.personality = ECORE_PCI_ETH;
 	hw_prepare_params.drv_resc_alloc = false;
 	hw_prepare_params.chk_reg_fifo = false;
diff -Nru dpdk-18.11.6/drivers/net/sfc/sfc.c dpdk-18.11.8/drivers/net/sfc/sfc.c
--- dpdk-18.11.6/drivers/net/sfc/sfc.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/sfc/sfc.c	2020-05-18 15:00:53.000000000 +0100
@@ -30,7 +30,7 @@
 {
 	const struct rte_memzone *mz;
 
-	sfc_log_init(sa, "name=%s id=%u len=%lu socket_id=%d",
+	sfc_log_init(sa, "name=%s id=%u len=%zu socket_id=%d",
 		     name, id, len, socket_id);
 
 	mz = rte_eth_dma_zone_reserve(sa->eth_dev, name, id, len,
diff -Nru dpdk-18.11.6/drivers/net/sfc/sfc_ethdev.c dpdk-18.11.8/drivers/net/sfc/sfc_ethdev.c
--- dpdk-18.11.6/drivers/net/sfc/sfc_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/sfc/sfc_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -1460,7 +1460,7 @@
 
 	if ((rss_conf->rss_key != NULL) &&
 	    (rss_conf->rss_key_len != sizeof(rss->key))) {
-		sfc_err(sa, "RSS key size is wrong (should be %lu)",
+		sfc_err(sa, "RSS key size is wrong (should be %zu)",
 			sizeof(rss->key));
 		return -EINVAL;
 	}
diff -Nru dpdk-18.11.6/drivers/net/sfc/sfc_rx.c dpdk-18.11.8/drivers/net/sfc/sfc_rx.c
--- dpdk-18.11.6/drivers/net/sfc/sfc_rx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/sfc/sfc_rx.c	2020-05-18 15:00:53.000000000 +0100
@@ -1322,7 +1322,7 @@
 
 	if (conf->rss_key != NULL) {
 		if (conf->rss_key_len != sizeof(rss->key)) {
-			sfc_err(sa, "RSS key size is wrong (should be %lu)",
+			sfc_err(sa, "RSS key size is wrong (should be %zu)",
 				sizeof(rss->key));
 			return EINVAL;
 		}
diff -Nru dpdk-18.11.6/drivers/net/tap/rte_eth_tap.c dpdk-18.11.8/drivers/net/tap/rte_eth_tap.c
--- dpdk-18.11.6/drivers/net/tap/rte_eth_tap.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/tap/rte_eth_tap.c	2020-05-18 15:00:53.000000000 +0100
@@ -1522,8 +1522,11 @@
 	int err;
 
 	err = tap_lsc_intr_handle_set(dev, set);
-	if (err)
+	if (err < 0) {
+		if (!set)
+			tap_rx_intr_vec_set(dev, 0);
 		return err;
+	}
 	err = tap_rx_intr_vec_set(dev, set);
 	if (err && set)
 		tap_lsc_intr_handle_set(dev, 0);
diff -Nru dpdk-18.11.6/drivers/net/vhost/rte_eth_vhost.c dpdk-18.11.8/drivers/net/vhost/rte_eth_vhost.c
--- dpdk-18.11.6/drivers/net/vhost/rte_eth_vhost.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/vhost/rte_eth_vhost.c	2020-05-18 15:00:53.000000000 +0100
@@ -1005,7 +1005,7 @@
 			rte_free(dev->data->tx_queues[i]);
 
 	free(internal->dev_name);
-	free(internal->iface_name);
+	rte_free(internal->iface_name);
 	rte_free(internal);
 
 	dev->data->dev_private = NULL;
@@ -1246,9 +1246,11 @@
 	internal->dev_name = strdup(name);
 	if (internal->dev_name == NULL)
 		goto error;
-	internal->iface_name = strdup(iface_name);
+	internal->iface_name = rte_malloc_socket(name, strlen(iface_name) + 1,
+						 0, numa_node);
 	if (internal->iface_name == NULL)
 		goto error;
+	strcpy(internal->iface_name, iface_name);
 
 	list->eth_dev = eth_dev;
 	pthread_mutex_lock(&internal_list_lock);
@@ -1286,11 +1288,11 @@
 	}
 
 	rte_eth_dev_probing_finish(eth_dev);
-	return data->port_id;
+	return 0;
 
 error:
 	if (internal) {
-		free(internal->iface_name);
+		rte_free(internal->iface_name);
 		free(internal->dev_name);
 	}
 	rte_free(vring_state);
@@ -1351,8 +1353,11 @@
 			VHOST_LOG(ERR, "Failed to probe %s\n", name);
 			return -1;
 		}
-		/* TODO: request info from primary to set up Rx and Tx */
+		eth_dev->rx_pkt_burst = eth_vhost_rx;
+		eth_dev->tx_pkt_burst = eth_vhost_tx;
 		eth_dev->dev_ops = &ops;
+		if (dev->device.numa_node == SOCKET_ID_ANY)
+			dev->device.numa_node = rte_socket_id();
 		eth_dev->device = &dev->device;
 		rte_eth_dev_probing_finish(eth_dev);
 		return 0;
@@ -1424,8 +1429,10 @@
 	if (dev->device.numa_node == SOCKET_ID_ANY)
 		dev->device.numa_node = rte_socket_id();
 
-	eth_dev_vhost_create(dev, iface_name, queues, dev->device.numa_node,
-		flags);
+	ret = eth_dev_vhost_create(dev, iface_name, queues,
+				   dev->device.numa_node, flags);
+	if (ret == -1)
+		VHOST_LOG(ERR, "Failed to create %s\n", name);
 
 out_free:
 	rte_kvargs_free(kvlist);
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_rxtx.c dpdk-18.11.8/drivers/net/virtio/virtio_rxtx.c
--- dpdk-18.11.6/drivers/net/virtio/virtio_rxtx.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_rxtx.c	2020-05-18 15:00:53.000000000 +0100
@@ -413,8 +413,8 @@
 		dxp->cookie = (void *)cookies[i];
 		dxp->ndescs = 1;
 
-		hdr = (struct virtio_net_hdr *)
-			rte_pktmbuf_prepend(cookies[i], head_size);
+		hdr = rte_pktmbuf_mtod_offset(cookies[i],
+				struct virtio_net_hdr *, -head_size);
 		cookies[i]->pkt_len -= head_size;
 
 		/* if offload disabled, it is not zeroed below, do it now */
@@ -430,8 +430,9 @@
 		virtqueue_xmit_offload(hdr, cookies[i],
 				vq->hw->has_tx_offload);
 
-		start_dp[idx].addr  = VIRTIO_MBUF_DATA_DMA_ADDR(cookies[i], vq);
-		start_dp[idx].len   = cookies[i]->data_len;
+		start_dp[idx].addr  =
+			VIRTIO_MBUF_DATA_DMA_ADDR(cookies[i], vq) - head_size;
+		start_dp[idx].len   = cookies[i]->data_len + head_size;
 		start_dp[idx].flags = 0;
 
 		vq_update_avail_ring(vq, idx);
@@ -456,6 +457,7 @@
 	uint16_t seg_num = cookie->nb_segs;
 	uint16_t head_idx, idx;
 	uint16_t head_size = vq->hw->vtnet_hdr_size;
+	bool prepend_header = false;
 	struct virtio_net_hdr *hdr;
 
 	head_idx = vq->vq_desc_head_idx;
@@ -471,13 +473,9 @@
 
 	if (can_push) {
 		/* prepend cannot fail, checked by caller */
-		hdr = (struct virtio_net_hdr *)
-			rte_pktmbuf_prepend(cookie, head_size);
-		/* rte_pktmbuf_prepend() counts the hdr size to the pkt length,
-		 * which is wrong. Below subtract restores correct pkt size.
-		 */
-		cookie->pkt_len -= head_size;
-
+		hdr = rte_pktmbuf_mtod_offset(cookie, struct virtio_net_hdr *,
+					      -head_size);
+		prepend_header = true;
 		/* if offload disabled, it is not zeroed below, do it now */
 		if (!vq->hw->has_tx_offload) {
 			ASSIGN_UNLESS_EQUAL(hdr->csum_start, 0);
@@ -521,6 +519,11 @@
 	do {
 		start_dp[idx].addr  = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq);
 		start_dp[idx].len   = cookie->data_len;
+		if (prepend_header) {
+			start_dp[idx].addr -= head_size;
+			start_dp[idx].len += head_size;
+			prepend_header = false;
+		}
 		start_dp[idx].flags = cookie->next ? VRING_DESC_F_NEXT : 0;
 		idx = start_dp[idx].next;
 	} while ((cookie = cookie->next) != NULL);
@@ -1471,6 +1474,21 @@
 	return nb_tx;
 }
 
+static __rte_always_inline int
+virtio_xmit_try_cleanup_inorder(struct virtqueue *vq, uint16_t need)
+{
+	uint16_t nb_used, nb_clean, nb_descs;
+
+	nb_descs = vq->vq_free_cnt + need;
+	nb_used = VIRTQUEUE_NUSED(vq);
+	virtio_rmb();
+	nb_clean = RTE_MIN(need, (int)nb_used);
+
+	virtio_xmit_cleanup_inorder(vq, nb_clean);
+
+	return nb_descs - vq->vq_free_cnt;
+}
+
 uint16_t
 virtio_xmit_pkts_inorder(void *tx_queue,
 			struct rte_mbuf **tx_pkts,
@@ -1480,8 +1498,9 @@
 	struct virtqueue *vq = txvq->vq;
 	struct virtio_hw *hw = vq->hw;
 	uint16_t hdr_size = hw->vtnet_hdr_size;
-	uint16_t nb_used, nb_avail, nb_tx = 0, nb_inorder_pkts = 0;
+	uint16_t nb_used, nb_tx = 0, nb_inorder_pkts = 0;
 	struct rte_mbuf *inorder_pkts[nb_pkts];
+	int need;
 
 	if (unlikely(hw->started == 0 && tx_pkts != hw->inject_pkts))
 		return nb_tx;
@@ -1497,14 +1516,9 @@
 	if (likely(nb_used > vq->vq_nentries - vq->vq_free_thresh))
 		virtio_xmit_cleanup_inorder(vq, nb_used);
 
-	if (unlikely(!vq->vq_free_cnt))
-		virtio_xmit_cleanup_inorder(vq, nb_used);
-
-	nb_avail = RTE_MIN(vq->vq_free_cnt, nb_pkts);
-
-	for (nb_tx = 0; nb_tx < nb_avail; nb_tx++) {
+	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
 		struct rte_mbuf *txm = tx_pkts[nb_tx];
-		int slots, need;
+		int slots;
 
 		/* optimize ring usage */
 		if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) ||
@@ -1524,6 +1538,17 @@
 		}
 
 		if (nb_inorder_pkts) {
+			need = nb_inorder_pkts - vq->vq_free_cnt;
+			if (unlikely(need > 0)) {
+				need = virtio_xmit_try_cleanup_inorder(vq,
+								       need);
+				if (unlikely(need > 0)) {
+					PMD_TX_LOG(ERR,
+						"No free tx descriptors to "
+						"transmit");
+					break;
+				}
+			}
 			virtqueue_enqueue_xmit_inorder(txvq, inorder_pkts,
 							nb_inorder_pkts);
 			nb_inorder_pkts = 0;
@@ -1532,13 +1557,7 @@
 		slots = txm->nb_segs + 1;
 		need = slots - vq->vq_free_cnt;
 		if (unlikely(need > 0)) {
-			nb_used = VIRTQUEUE_NUSED(vq);
-			virtio_rmb();
-			need = RTE_MIN(need, (int)nb_used);
-
-			virtio_xmit_cleanup_inorder(vq, need);
-
-			need = slots - vq->vq_free_cnt;
+			need = virtio_xmit_try_cleanup_inorder(vq, slots);
 
 			if (unlikely(need > 0)) {
 				PMD_TX_LOG(ERR,
@@ -1554,9 +1573,21 @@
 	}
 
 	/* Transmit all inorder packets */
-	if (nb_inorder_pkts)
+	if (nb_inorder_pkts) {
+		need = nb_inorder_pkts - vq->vq_free_cnt;
+		if (unlikely(need > 0)) {
+			need = virtio_xmit_try_cleanup_inorder(vq, need);
+			if (unlikely(need > 0)) {
+				PMD_TX_LOG(ERR,
+					"No free tx descriptors to transmit");
+				nb_inorder_pkts = vq->vq_free_cnt;
+				nb_tx -= need;
+			}
+		}
+
 		virtqueue_enqueue_xmit_inorder(txvq, inorder_pkts,
 						nb_inorder_pkts);
+	}
 
 	txvq->stats.packets += nb_tx;
 
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel.c dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel.c
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel.c	2020-05-18 15:00:53.000000000 +0100
@@ -331,16 +331,34 @@
 
 	vhostfd = dev->vhostfds[pair_idx];
 
+	if (dev->qp_enabled[pair_idx] == enable)
+		return 0;
+
 	if (!enable) {
-		if (dev->tapfds[pair_idx] >= 0) {
-			close(dev->tapfds[pair_idx]);
-			dev->tapfds[pair_idx] = -1;
+		tapfd = dev->tapfds[pair_idx];
+		if (vhost_kernel_set_backend(vhostfd, -1) < 0) {
+			PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
+			return -1;
+		}
+		if (req_mq && vhost_kernel_tap_set_queue(tapfd, false) < 0) {
+			PMD_DRV_LOG(ERR, "fail to disable tap for vhost kernel");
+			return -1;
 		}
-		return vhost_kernel_set_backend(vhostfd, -1);
-	} else if (dev->tapfds[pair_idx] >= 0) {
+		dev->qp_enabled[pair_idx] = false;
 		return 0;
 	}
 
+	if (dev->tapfds[pair_idx] >= 0) {
+		tapfd = dev->tapfds[pair_idx];
+		if (vhost_kernel_tap_set_offload(tapfd, dev->features) == -1)
+			return -1;
+		if (req_mq && vhost_kernel_tap_set_queue(tapfd, true) < 0) {
+			PMD_DRV_LOG(ERR, "fail to enable tap for vhost kernel");
+			return -1;
+		}
+		goto set_backend;
+	}
+
 	if ((dev->features & (1ULL << VIRTIO_NET_F_MRG_RXBUF)) ||
 	    (dev->features & (1ULL << VIRTIO_F_VERSION_1)))
 		hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf);
@@ -354,13 +372,15 @@
 		return -1;
 	}
 
+	dev->tapfds[pair_idx] = tapfd;
+
+set_backend:
 	if (vhost_kernel_set_backend(vhostfd, tapfd) < 0) {
 		PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
-		close(tapfd);
 		return -1;
 	}
 
-	dev->tapfds[pair_idx] = tapfd;
+	dev->qp_enabled[pair_idx] = true;
 	return 0;
 }
 
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel_tap.c dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel_tap.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel_tap.c	2020-05-18 15:00:53.000000000 +0100
@@ -18,7 +18,7 @@
 #include "../virtio_logs.h"
 #include "../virtio_pci.h"
 
-static int
+int
 vhost_kernel_tap_set_offload(int fd, uint64_t features)
 {
 	unsigned int offload = 0;
@@ -37,20 +37,18 @@
 			offload |= TUN_F_UFO;
 	}
 
-	if (offload != 0) {
-		/* Check if our kernel supports TUNSETOFFLOAD */
-		if (ioctl(fd, TUNSETOFFLOAD, 0) != 0 && errno == EINVAL) {
-			PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n");
-			return -ENOTSUP;
-		}
+	/* Check if our kernel supports TUNSETOFFLOAD */
+	if (ioctl(fd, TUNSETOFFLOAD, 0) != 0 && errno == EINVAL) {
+		PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n");
+		return -ENOTSUP;
+	}
 
+	if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
+		offload &= ~TUN_F_UFO;
 		if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
-			offload &= ~TUN_F_UFO;
-			if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
-				PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n",
-					strerror(errno));
-				return -1;
-			}
+			PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n",
+				strerror(errno));
+			return -1;
 		}
 	}
 
@@ -58,6 +56,16 @@
 }
 
 int
+vhost_kernel_tap_set_queue(int fd, bool attach)
+{
+	struct ifreq ifr = {
+		.ifr_flags = attach ? IFF_ATTACH_QUEUE : IFF_DETACH_QUEUE,
+	};
+
+	return ioctl(fd, TUNSETQUEUE, &ifr);
+}
+
+int
 vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
 			 const char *mac, uint64_t features)
 {
@@ -66,6 +74,7 @@
 	int sndbuf = INT_MAX;
 	struct ifreq ifr;
 	int tapfd;
+	int ret;
 
 	/* TODO:
 	 * 1. verify we can get/set vnet_hdr_len, tap_probe_vnet_hdr_len
@@ -131,7 +140,9 @@
 		goto error;
 	}
 
-	vhost_kernel_tap_set_offload(tapfd, features);
+	ret = vhost_kernel_tap_set_offload(tapfd, features);
+	if (ret < 0 && ret != -ENOTSUP)
+		goto error;
 
 	memset(&ifr, 0, sizeof(ifr));
 	ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel_tap.h dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel_tap.h
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_kernel_tap.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_kernel_tap.h	2020-05-18 15:00:53.000000000 +0100
@@ -2,6 +2,10 @@
  * Copyright(c) 2016 Intel Corporation
  */
 
+#ifndef _VHOST_KERNEL_TAP_H
+#define _VHOST_KERNEL_TAP_H
+
+#include <stdbool.h>
 #include <sys/ioctl.h>
 
 /* TUN ioctls */
@@ -37,3 +41,7 @@
 
 int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
 			 const char *mac, uint64_t features);
+int vhost_kernel_tap_set_offload(int fd, uint64_t features);
+int vhost_kernel_tap_set_queue(int fd, bool attach);
+
+#endif
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_user.c dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_user.c
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/vhost_user.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/vhost_user.c	2020-05-18 15:00:53.000000000 +0100
@@ -456,6 +456,9 @@
 {
 	int i;
 
+	if (dev->qp_enabled[pair_idx] == enable)
+		return 0;
+
 	for (i = 0; i < 2; ++i) {
 		struct vhost_vring_state state = {
 			.index = pair_idx * 2 + i,
@@ -466,6 +469,7 @@
 			return -1;
 	}
 
+	dev->qp_enabled[pair_idx] = enable;
 	return 0;
 }
 
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/virtio_user_dev.c dpdk-18.11.8/drivers/net/virtio/virtio_user/virtio_user_dev.c
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/virtio_user_dev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/virtio_user_dev.c	2020-05-18 15:00:53.000000000 +0100
@@ -524,7 +524,8 @@
 		close(dev->kickfds[i]);
 	}
 
-	close(dev->vhostfd);
+	if (dev->vhostfd >= 0)
+		close(dev->vhostfd);
 
 	if (dev->is_server && dev->listenfd >= 0) {
 		close(dev->listenfd);
@@ -532,8 +533,11 @@
 	}
 
 	if (dev->vhostfds) {
-		for (i = 0; i < dev->max_queue_pairs; ++i)
+		for (i = 0; i < dev->max_queue_pairs; ++i) {
 			close(dev->vhostfds[i]);
+			if (dev->tapfds[i] >= 0)
+				close(dev->tapfds[i]);
+		}
 		free(dev->vhostfds);
 		free(dev->tapfds);
 	}
diff -Nru dpdk-18.11.6/drivers/net/virtio/virtio_user/virtio_user_dev.h dpdk-18.11.8/drivers/net/virtio/virtio_user/virtio_user_dev.h
--- dpdk-18.11.6/drivers/net/virtio/virtio_user/virtio_user_dev.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/drivers/net/virtio/virtio_user/virtio_user_dev.h	2020-05-18 15:00:53.000000000 +0100
@@ -40,6 +40,7 @@
 	uint8_t		mac_addr[ETHER_ADDR_LEN];
 	char		path[PATH_MAX];
 	struct vring	vrings[VIRTIO_MAX_VIRTQUEUES];
+	bool		qp_enabled[VIRTIO_MAX_VIRTQUEUE_PAIRS];
 	struct virtio_user_backend_ops *ops;
 	pthread_mutex_t	mutex;
 	bool		started;
diff -Nru dpdk-18.11.6/examples/ethtool/lib/rte_ethtool.c dpdk-18.11.8/examples/ethtool/lib/rte_ethtool.c
--- dpdk-18.11.6/examples/ethtool/lib/rte_ethtool.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/examples/ethtool/lib/rte_ethtool.c	2020-05-18 15:00:53.000000000 +0100
@@ -370,6 +370,7 @@
 	uint16_t num_vfs;
 	struct rte_eth_dev_info dev_info;
 	uint16_t vf;
+	int ret;
 
 	rte_eth_dev_info_get(port_id, &dev_info);
 	num_vfs = dev_info.max_vfs;
@@ -383,7 +384,9 @@
 	}
 
 	/* Enable Rx vlan filter, VF unspport status is discard */
-	rte_eth_dev_set_vlan_offload(port_id, ETH_VLAN_FILTER_MASK);
+	ret = rte_eth_dev_set_vlan_offload(port_id, ETH_VLAN_FILTER_MASK);
+	if (ret != 0)
+		return ret;
 
 	return 0;
 }
diff -Nru dpdk-18.11.6/examples/fips_validation/fips_validation_gcm.c dpdk-18.11.8/examples/fips_validation/fips_validation_gcm.c
--- dpdk-18.11.6/examples/fips_validation/fips_validation_gcm.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/examples/fips_validation/fips_validation_gcm.c	2020-05-18 15:00:53.000000000 +0100
@@ -46,6 +46,10 @@
 		{KEYLEN_STR, parser_read_uint32_bit_val, &vec.cipher_auth.key},
 		{IVLEN_STR, parser_read_uint32_bit_val, &vec.iv},
 		{PTLEN_STR, parser_read_uint32_bit_val, &vec.pt},
+		{PTLEN_STR, parser_read_uint32_bit_val, &vec.ct},
+		/**< The NIST test vectors use 'PTlen' to denote input text
+		 *  length in case of decrypt & encrypt operations.
+		 */
 		{AADLEN_STR, parser_read_uint32_bit_val, &vec.cipher_auth.aad},
 		{TAGLEN_STR, parser_read_uint32_bit_val,
 				&vec.cipher_auth.digest},
diff -Nru dpdk-18.11.6/examples/ipsec-secgw/sa.c dpdk-18.11.8/examples/ipsec-secgw/sa.c
--- dpdk-18.11.6/examples/ipsec-secgw/sa.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/examples/ipsec-secgw/sa.c	2020-05-18 15:00:53.000000000 +0100
@@ -306,6 +306,9 @@
 			APP_CHECK(algo != NULL, status, "unrecognized "
 				"input \"%s\"", tokens[ti]);
 
+			if (status->status < 0)
+				return;
+
 			rule->cipher_algo = algo->algo;
 			rule->block_size = algo->block_size;
 			rule->iv_len = algo->iv_len;
@@ -370,6 +373,9 @@
 			APP_CHECK(algo != NULL, status, "unrecognized "
 				"input \"%s\"", tokens[ti]);
 
+			if (status->status < 0)
+				return;
+
 			rule->auth_algo = algo->algo;
 			rule->auth_key_len = algo->key_len;
 			rule->digest_len = algo->digest_len;
@@ -425,6 +431,9 @@
 			APP_CHECK(algo != NULL, status, "unrecognized "
 				"input \"%s\"", tokens[ti]);
 
+			if (status->status < 0)
+				return;
+
 			rule->aead_algo = algo->algo;
 			rule->cipher_key_len = algo->key_len;
 			rule->digest_len = algo->digest_len;
diff -Nru dpdk-18.11.6/examples/l3fwd-power/main.c dpdk-18.11.8/examples/l3fwd-power/main.c
--- dpdk-18.11.6/examples/l3fwd-power/main.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/examples/l3fwd-power/main.c	2020-05-18 15:00:53.000000000 +0100
@@ -814,9 +814,6 @@
 		port_id = ((uintptr_t)data) >> CHAR_BIT;
 		queue_id = ((uintptr_t)data) &
 			RTE_LEN2MASK(CHAR_BIT, uint8_t);
-		rte_spinlock_lock(&(locks[port_id]));
-		rte_eth_dev_rx_intr_disable(port_id, queue_id);
-		rte_spinlock_unlock(&(locks[port_id]));
 		RTE_LOG(INFO, L3FWD_POWER,
 			"lcore %u is waked up from rx interrupt on"
 			" port %d queue %d\n",
@@ -826,7 +823,7 @@
 	return 0;
 }
 
-static void turn_on_intr(struct lcore_conf *qconf)
+static void turn_on_off_intr(struct lcore_conf *qconf, bool on)
 {
 	int i;
 	struct lcore_rx_queue *rx_queue;
@@ -839,7 +836,10 @@
 		queue_id = rx_queue->queue_id;
 
 		rte_spinlock_lock(&(locks[port_id]));
-		rte_eth_dev_rx_intr_enable(port_id, queue_id);
+		if (on)
+			rte_eth_dev_rx_intr_enable(port_id, queue_id);
+		else
+			rte_eth_dev_rx_intr_disable(port_id, queue_id);
 		rte_spinlock_unlock(&(locks[port_id]));
 	}
 }
@@ -1152,11 +1152,12 @@
 				 */
 				rte_delay_us(lcore_idle_hint);
 			else {
-				/* suspend until rx interrupt trigges */
+				/* suspend until rx interrupt triggers */
 				if (intr_en) {
-					turn_on_intr(qconf);
+					turn_on_off_intr(qconf, 1);
 					sleep_until_rx_interrupt(
 						qconf->n_rx_queue);
+					turn_on_off_intr(qconf, 0);
 					/**
 					 * start receiving packets immediately
 					 */
diff -Nru dpdk-18.11.6/examples/tep_termination/vxlan_setup.c dpdk-18.11.8/examples/tep_termination/vxlan_setup.c
--- dpdk-18.11.6/examples/tep_termination/vxlan_setup.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/examples/tep_termination/vxlan_setup.c	2020-05-18 15:00:53.000000000 +0100
@@ -190,8 +190,6 @@
 			ports_eth_addr[port].addr_bytes[5]);
 
 	if (tso_segsz != 0) {
-		struct rte_eth_dev_info dev_info;
-		rte_eth_dev_info_get(port, &dev_info);
 		if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0)
 			RTE_LOG(WARNING, PORT,
 				"hardware TSO offload is not supported\n");
diff -Nru dpdk-18.11.6/kernel/linux/kni/compat.h dpdk-18.11.8/kernel/linux/kni/compat.h
--- dpdk-18.11.6/kernel/linux/kni/compat.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/compat.h	2020-05-18 15:00:53.000000000 +0100
@@ -117,3 +117,7 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
 #define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
 #endif
+
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
+#define HAVE_TX_TIMEOUT_TXQUEUE
+#endif
diff -Nru dpdk-18.11.6/kernel/linux/kni/ethtool/igb/igb_ethtool.c dpdk-18.11.8/kernel/linux/kni/ethtool/igb/igb_ethtool.c
--- dpdk-18.11.6/kernel/linux/kni/ethtool/igb/igb_ethtool.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/ethtool/igb/igb_ethtool.c	2020-05-18 15:00:53.000000000 +0100
@@ -39,9 +39,11 @@
 	int stat_offset;
 };
 
+#define RTE_SIZEOF_FIELD(type, field) (sizeof(((type *)0)->field))
+
 #define IGB_STAT(_name, _stat) { \
 	.stat_string = _name, \
-	.sizeof_stat = FIELD_SIZEOF(struct igb_adapter, _stat), \
+	.sizeof_stat = RTE_SIZEOF_FIELD(struct igb_adapter, _stat), \
 	.stat_offset = offsetof(struct igb_adapter, _stat) \
 }
 static const struct igb_stats igb_gstrings_stats[] = {
@@ -96,7 +98,7 @@
 
 #define IGB_NETDEV_STAT(_net_stat) { \
 	.stat_string = #_net_stat, \
-	.sizeof_stat = FIELD_SIZEOF(struct net_device_stats, _net_stat), \
+	.sizeof_stat = RTE_SIZEOF_FIELD(struct net_device_stats, _net_stat), \
 	.stat_offset = offsetof(struct net_device_stats, _net_stat) \
 }
 static const struct igb_stats igb_gstrings_net_stats[] = {
diff -Nru dpdk-18.11.6/kernel/linux/kni/ethtool/ixgbe/ixgbe_ethtool.c dpdk-18.11.8/kernel/linux/kni/ethtool/ixgbe/ixgbe_ethtool.c
--- dpdk-18.11.6/kernel/linux/kni/ethtool/ixgbe/ixgbe_ethtool.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/ethtool/ixgbe/ixgbe_ethtool.c	2020-05-18 15:00:53.000000000 +0100
@@ -40,9 +40,11 @@
 	int stat_offset;
 };
 
+#define RTE_SIZEOF_FIELD(type, field) (sizeof(((type *)0)->field))
+
 #define IXGBE_NETDEV_STAT(_net_stat) { \
 	.stat_string = #_net_stat, \
-	.sizeof_stat = FIELD_SIZEOF(struct net_device_stats, _net_stat), \
+	.sizeof_stat = RTE_SIZEOF_FIELD(struct net_device_stats, _net_stat), \
 	.stat_offset = offsetof(struct net_device_stats, _net_stat) \
 }
 static const struct ixgbe_stats ixgbe_gstrings_net_stats[] = {
@@ -69,7 +71,7 @@
 
 #define IXGBE_STAT(_name, _stat) { \
 	.stat_string = _name, \
-	.sizeof_stat = FIELD_SIZEOF(struct ixgbe_adapter, _stat), \
+	.sizeof_stat = RTE_SIZEOF_FIELD(struct ixgbe_adapter, _stat), \
 	.stat_offset = offsetof(struct ixgbe_adapter, _stat) \
 }
 static struct ixgbe_stats ixgbe_gstrings_stats[] = {
diff -Nru dpdk-18.11.6/kernel/linux/kni/kni_dev.h dpdk-18.11.8/kernel/linux/kni/kni_dev.h
--- dpdk-18.11.6/kernel/linux/kni/kni_dev.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/kni_dev.h	2020-05-18 15:00:53.000000000 +0100
@@ -30,7 +30,7 @@
 #define MBUF_BURST_SZ 32
 
 /* Default carrier state for created KNI network interfaces */
-extern uint32_t dflt_carrier;
+extern uint32_t kni_dflt_carrier;
 
 /**
  * A structure describing the private information for a kni device.
diff -Nru dpdk-18.11.6/kernel/linux/kni/kni_misc.c dpdk-18.11.8/kernel/linux/kni/kni_misc.c
--- dpdk-18.11.6/kernel/linux/kni/kni_misc.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/kni_misc.c	2020-05-18 15:00:53.000000000 +0100
@@ -41,7 +41,7 @@
 
 /* Default carrier state for created KNI network interfaces */
 static char *carrier;
-uint32_t dflt_carrier;
+uint32_t kni_dflt_carrier;
 
 #define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */
 
@@ -594,14 +594,14 @@
 kni_parse_carrier_state(void)
 {
 	if (!carrier) {
-		dflt_carrier = 0;
+		kni_dflt_carrier = 0;
 		return 0;
 	}
 
 	if (strcmp(carrier, "off") == 0)
-		dflt_carrier = 0;
+		kni_dflt_carrier = 0;
 	else if (strcmp(carrier, "on") == 0)
-		dflt_carrier = 1;
+		kni_dflt_carrier = 1;
 	else
 		return -1;
 
@@ -628,7 +628,7 @@
 		return -EINVAL;
 	}
 
-	if (dflt_carrier == 0)
+	if (kni_dflt_carrier == 0)
 		pr_debug("Default carrier state set to off.\n");
 	else
 		pr_debug("Default carrier state set to on.\n");
diff -Nru dpdk-18.11.6/kernel/linux/kni/kni_net.c dpdk-18.11.8/kernel/linux/kni/kni_net.c
--- dpdk-18.11.6/kernel/linux/kni/kni_net.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/kni_net.c	2020-05-18 15:00:53.000000000 +0100
@@ -121,7 +121,7 @@
 	struct kni_dev *kni = netdev_priv(dev);
 
 	netif_start_queue(dev);
-	if (dflt_carrier == 1)
+	if (kni_dflt_carrier == 1)
 		netif_carrier_on(dev);
 	else
 		netif_carrier_off(dev);
@@ -596,8 +596,13 @@
 /*
  * Deal with a transmit timeout.
  */
+#ifdef HAVE_TX_TIMEOUT_TXQUEUE
+static void
+kni_net_tx_timeout(struct net_device *dev, unsigned int txqueue)
+#else
 static void
 kni_net_tx_timeout(struct net_device *dev)
+#endif
 {
 	struct kni_dev *kni = netdev_priv(dev);
 
diff -Nru dpdk-18.11.6/kernel/linux/kni/meson.build dpdk-18.11.8/kernel/linux/kni/meson.build
--- dpdk-18.11.6/kernel/linux/kni/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/kernel/linux/kni/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -28,7 +28,6 @@
 		' -I' + meson.current_source_dir() + '/ethtool/igb',
 		'modules'],
 	depends: kni_mkfile,
-	console: true,
 	install: true,
 	install_dir: kernel_dir + '/extra/dpdk',
 	build_by_default: get_option('enable_kmods'))
diff -Nru dpdk-18.11.6/lib/librte_acl/acl_bld.c dpdk-18.11.8/lib/librte_acl/acl_bld.c
--- dpdk-18.11.6/lib/librte_acl/acl_bld.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_acl/acl_bld.c	2020-05-18 15:00:53.000000000 +0100
@@ -778,9 +778,8 @@
 }
 
 static void
-acl_gen_range(struct acl_build_context *context,
-	const uint8_t *hi, const uint8_t *lo, int size, int level,
-	struct rte_acl_node *root, struct rte_acl_node *end)
+acl_gen_full_range(struct acl_build_context *context, struct rte_acl_node *root,
+	struct rte_acl_node *end, int size, int level)
 {
 	struct rte_acl_node *node, *prev;
 	uint32_t n;
@@ -788,10 +787,71 @@
 	prev = root;
 	for (n = size - 1; n > 0; n--) {
 		node = acl_alloc_node(context, level++);
-		acl_add_ptr_range(context, prev, node, lo[n], hi[n]);
+		acl_add_ptr_range(context, prev, node, 0, UINT8_MAX);
 		prev = node;
 	}
-	acl_add_ptr_range(context, prev, end, lo[0], hi[0]);
+	acl_add_ptr_range(context, prev, end, 0, UINT8_MAX);
+}
+
+static void
+acl_gen_range_mdl(struct acl_build_context *context, struct rte_acl_node *root,
+	struct rte_acl_node *end, uint8_t lo, uint8_t hi, int size, int level)
+{
+	struct rte_acl_node *node;
+
+	node = acl_alloc_node(context, level++);
+	acl_add_ptr_range(context, root, node, lo, hi);
+	acl_gen_full_range(context, node, end, size - 1, level);
+}
+
+static void
+acl_gen_range_low(struct acl_build_context *context, struct rte_acl_node *root,
+	struct rte_acl_node *end, const uint8_t *lo, int size, int level)
+{
+	struct rte_acl_node *node;
+	uint32_t n;
+
+	n = size - 1;
+	if (n == 0) {
+		acl_add_ptr_range(context, root, end, lo[0], UINT8_MAX);
+		return;
+	}
+
+	node = acl_alloc_node(context, level++);
+	acl_add_ptr_range(context, root, node, lo[n], lo[n]);
+
+	/* generate lower-bound sub-trie */
+	acl_gen_range_low(context, node, end, lo, n, level);
+
+	/* generate middle sub-trie */
+	if (n > 1 && lo[n - 1] != UINT8_MAX)
+		acl_gen_range_mdl(context, node, end, lo[n - 1] + 1, UINT8_MAX,
+			n, level);
+}
+
+static void
+acl_gen_range_high(struct acl_build_context *context, struct rte_acl_node *root,
+	struct rte_acl_node *end, const uint8_t *hi, int size, int level)
+{
+	struct rte_acl_node *node;
+	uint32_t n;
+
+	n = size - 1;
+	if (n == 0) {
+		acl_add_ptr_range(context, root, end, 0, hi[0]);
+		return;
+	}
+
+	node = acl_alloc_node(context, level++);
+	acl_add_ptr_range(context, root, node, hi[n], hi[n]);
+
+	/* generate upper-bound sub-trie */
+	acl_gen_range_high(context, node, end, hi, n, level);
+
+	/* generate middle sub-trie */
+	if (n > 1 && hi[n - 1] != 0)
+		acl_gen_range_mdl(context, node, end, 0, hi[n - 1] - 1,
+			n, level);
 }
 
 static struct rte_acl_node *
@@ -799,52 +859,56 @@
 	const void *min, const void *max,
 	int size, int level, struct rte_acl_node **pend)
 {
-	int32_t n;
-	struct rte_acl_node *root;
-	const uint8_t *lo = min;
-	const uint8_t *hi = max;
+	int32_t k, n;
+	uint8_t hi_ff, lo_00;
+	struct rte_acl_node *node, *prev, *root;
+	const uint8_t *lo;
+	const uint8_t *hi;
+
+	lo = min;
+	hi = max;
 
-	*pend = acl_alloc_node(context, level+size);
+	*pend = acl_alloc_node(context, level + size);
 	root = acl_alloc_node(context, level++);
+	prev = root;
 
-	if (lo[size - 1] == hi[size - 1]) {
-		acl_gen_range(context, hi, lo, size, level, root, *pend);
-	} else {
-		uint8_t limit_lo[64];
-		uint8_t limit_hi[64];
-		uint8_t hi_ff = UINT8_MAX;
-		uint8_t lo_00 = 0;
-
-		memset(limit_lo, 0, RTE_DIM(limit_lo));
-		memset(limit_hi, UINT8_MAX, RTE_DIM(limit_hi));
-
-		for (n = size - 2; n >= 0; n--) {
-			hi_ff = (uint8_t)(hi_ff & hi[n]);
-			lo_00 = (uint8_t)(lo_00 | lo[n]);
-		}
-
-		if (hi_ff != UINT8_MAX) {
-			limit_lo[size - 1] = hi[size - 1];
-			acl_gen_range(context, hi, limit_lo, size, level,
-				root, *pend);
-		}
-
-		if (lo_00 != 0) {
-			limit_hi[size - 1] = lo[size - 1];
-			acl_gen_range(context, limit_hi, lo, size, level,
-				root, *pend);
-		}
-
-		if (hi[size - 1] - lo[size - 1] > 1 ||
-				lo_00 == 0 ||
-				hi_ff == UINT8_MAX) {
-			limit_lo[size-1] = (uint8_t)(lo[size-1] + (lo_00 != 0));
-			limit_hi[size-1] = (uint8_t)(hi[size-1] -
-				(hi_ff != UINT8_MAX));
-			acl_gen_range(context, limit_hi, limit_lo, size,
-				level, root, *pend);
-		}
+	/* build common sub-trie till possible */
+	for (n = size - 1; n > 0 && lo[n] == hi[n]; n--) {
+		node = acl_alloc_node(context, level++);
+		acl_add_ptr_range(context, prev, node, lo[n], hi[n]);
+		prev = node;
 	}
+
+	/* no branch needed, just one sub-trie */
+	if (n == 0) {
+		acl_add_ptr_range(context, prev, *pend, lo[0], hi[0]);
+		return root;
+	}
+
+	/* gather information about divirgent paths */
+	lo_00 = 0;
+	hi_ff = UINT8_MAX;
+	for (k = n - 1; k >= 0; k--) {
+		hi_ff &= hi[k];
+		lo_00 |= lo[k];
+	}
+
+	/* generate left (lower-bound) sub-trie */
+	if (lo_00 != 0)
+		acl_gen_range_low(context, prev, *pend, lo, n + 1, level);
+
+	/* generate right (upper-bound) sub-trie */
+	if (hi_ff != UINT8_MAX)
+		acl_gen_range_high(context, prev, *pend, hi, n + 1, level);
+
+	/* generate sub-trie in the middle */
+	if (lo[n] + 1 != hi[n] || lo_00 == 0 || hi_ff == UINT8_MAX) {
+		lo_00 = lo[n] + (lo_00 != 0);
+		hi_ff = hi[n] - (hi_ff != UINT8_MAX);
+		acl_gen_range_mdl(context, prev, *pend, lo_00, hi_ff,
+			n + 1, level);
+	}
+
 	return root;
 }
 
diff -Nru dpdk-18.11.6/lib/librte_bpf/meson.build dpdk-18.11.8/lib/librte_bpf/meson.build
--- dpdk-18.11.6/lib/librte_bpf/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_bpf/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -12,7 +12,7 @@
 	sources += files('bpf_jit_x86.c')
 endif
 
-install_headers = files('bpf_def.h',
+install_headers('bpf_def.h',
 			'rte_bpf.h',
 			'rte_bpf_ethdev.h')
 
diff -Nru dpdk-18.11.6/lib/librte_cfgfile/rte_cfgfile_version.map dpdk-18.11.8/lib/librte_cfgfile/rte_cfgfile_version.map
--- dpdk-18.11.6/lib/librte_cfgfile/rte_cfgfile_version.map	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_cfgfile/rte_cfgfile_version.map	2020-05-18 15:00:53.000000000 +0100
@@ -9,6 +9,7 @@
 	rte_cfgfile_num_sections;
 	rte_cfgfile_section_entries;
 	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_num_entries_by_index;
 	rte_cfgfile_sections;
 
 	local: *;
diff -Nru dpdk-18.11.6/lib/librte_eal/common/include/rte_version.h dpdk-18.11.8/lib/librte_eal/common/include/rte_version.h
--- dpdk-18.11.6/lib/librte_eal/common/include/rte_version.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_eal/common/include/rte_version.h	2020-05-18 15:00:53.000000000 +0100
@@ -37,7 +37,7 @@
 /**
  * Patch level number i.e. the z in yy.mm.z
  */
-#define RTE_VER_MINOR 6
+#define RTE_VER_MINOR 8
 
 /**
  * Extra string to be appended to version number
diff -Nru dpdk-18.11.6/lib/librte_eal/common/rte_service.c dpdk-18.11.8/lib/librte_eal/common/rte_service.c
--- dpdk-18.11.6/lib/librte_eal/common/rte_service.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_eal/common/rte_service.c	2020-05-18 15:00:53.000000000 +0100
@@ -52,7 +52,6 @@
 	rte_atomic32_t num_mapped_cores;
 	uint64_t calls;
 	uint64_t cycles_spent;
-	uint8_t active_on_lcore[RTE_MAX_LCORE];
 } __rte_cache_aligned;
 
 /* the internal values of a service core */
@@ -61,7 +60,7 @@
 	uint64_t service_mask;
 	uint8_t runstate; /* running or stopped */
 	uint8_t is_service_core; /* set if core is currently a service core */
-
+	uint8_t service_active_on_lcore[RTE_SERVICE_NUM_MAX];
 	uint64_t loops;
 	uint64_t calls_per_service[RTE_SERVICE_NUM_MAX];
 } __rte_cache_aligned;
@@ -137,6 +136,12 @@
 	return !!(rte_services[id].internal_flags & SERVICE_F_REGISTERED);
 }
 
+static struct rte_service_spec_impl *
+service_get(uint32_t id)
+{
+	return &rte_services[id];
+}
+
 /* validate ID and retrieve service pointer, or return error value */
 #define SERVICE_VALID_GET_OR_ERR_RET(id, service, retval) do {          \
 	if (id >= RTE_SERVICE_NUM_MAX || !service_valid(id))            \
@@ -344,20 +349,22 @@
 }
 
 
-static inline int32_t
-service_run(uint32_t i, int lcore, struct core_state *cs, uint64_t service_mask)
+/* Expects the service 's' is valid. */
+static int32_t
+service_run(uint32_t i, struct core_state *cs, uint64_t service_mask,
+	    struct rte_service_spec_impl *s)
 {
-	if (!service_valid(i))
+	if (!s)
 		return -EINVAL;
-	struct rte_service_spec_impl *s = &rte_services[i];
+
 	if (s->comp_runstate != RUNSTATE_RUNNING ||
 			s->app_runstate != RUNSTATE_RUNNING ||
 			!(service_mask & (UINT64_C(1) << i))) {
-		s->active_on_lcore[lcore] = 0;
+		cs->service_active_on_lcore[i] = 0;
 		return -ENOEXEC;
 	}
 
-	s->active_on_lcore[lcore] = 1;
+	cs->service_active_on_lcore[i] = 1;
 
 	/* check do we need cmpset, if MT safe or <= 1 core
 	 * mapped, atomic ops are not required.
@@ -380,15 +387,14 @@
 rte_service_may_be_active(uint32_t id)
 {
 	uint32_t ids[RTE_MAX_LCORE] = {0};
-	struct rte_service_spec_impl *s = &rte_services[id];
 	int32_t lcore_count = rte_service_lcore_list(ids, RTE_MAX_LCORE);
 	int i;
 
-	if (!service_valid(id))
+	if (id >= RTE_SERVICE_NUM_MAX || !service_valid(id))
 		return -EINVAL;
 
 	for (i = 0; i < lcore_count; i++) {
-		if (s->active_on_lcore[ids[i]])
+		if (lcore_states[i].service_active_on_lcore[id])
 			return 1;
 	}
 
@@ -398,12 +404,10 @@
 int32_t
 rte_service_run_iter_on_app_lcore(uint32_t id, uint32_t serialize_mt_unsafe)
 {
-	/* run service on calling core, using all-ones as the service mask */
-	if (!service_valid(id))
-		return -EINVAL;
-
 	struct core_state *cs = &lcore_states[rte_lcore_id()];
-	struct rte_service_spec_impl *s = &rte_services[id];
+	struct rte_service_spec_impl *s;
+
+	SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL);
 
 	/* Atomically add this core to the mapped cores first, then examine if
 	 * we can run the service. This avoids a race condition between
@@ -419,7 +423,7 @@
 		return -EBUSY;
 	}
 
-	int ret = service_run(id, rte_lcore_id(), cs, UINT64_MAX);
+	int ret = service_run(id, cs, UINT64_MAX, s);
 
 	if (serialize_mt_unsafe)
 		rte_atomic32_dec(&s->num_mapped_cores);
@@ -439,8 +443,10 @@
 		const uint64_t service_mask = cs->service_mask;
 
 		for (i = 0; i < RTE_SERVICE_NUM_MAX; i++) {
+			if (!service_valid(i))
+				continue;
 			/* return value ignored as no change to code flow */
-			service_run(i, lcore, cs, service_mask);
+			service_run(i, cs, service_mask, service_get(i));
 		}
 
 		cs->loops++;
diff -Nru dpdk-18.11.6/lib/librte_eal/linuxapp/eal/eal_interrupts.c dpdk-18.11.8/lib/librte_eal/linuxapp/eal/eal_interrupts.c
--- dpdk-18.11.6/lib/librte_eal/linuxapp/eal/eal_interrupts.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_eal/linuxapp/eal/eal_interrupts.c	2020-05-18 15:00:53.000000000 +0100
@@ -964,8 +964,6 @@
 static __attribute__((noreturn)) void *
 eal_intr_thread_main(__rte_unused void *arg)
 {
-	struct epoll_event ev;
-
 	/* host thread, never break out */
 	for (;;) {
 		/* build up the epoll fd with all descriptors we are to
@@ -997,8 +995,11 @@
 		rte_spinlock_lock(&intr_lock);
 
 		TAILQ_FOREACH(src, &intr_sources, next) {
+			struct epoll_event ev;
+
 			if (src->callbacks.tqh_first == NULL)
 				continue; /* skip those with no callbacks */
+			memset(&ev, 0, sizeof(ev));
 			ev.events = EPOLLIN | EPOLLPRI | EPOLLRDHUP | EPOLLHUP;
 			ev.data.fd = src->intr_handle.fd;
 
diff -Nru dpdk-18.11.6/lib/librte_eal/linuxapp/eal/eal_memory.c dpdk-18.11.8/lib/librte_eal/linuxapp/eal/eal_memory.c
--- dpdk-18.11.6/lib/librte_eal/linuxapp/eal/eal_memory.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_eal/linuxapp/eal/eal_memory.c	2020-05-18 15:00:53.000000000 +0100
@@ -1868,7 +1868,7 @@
 		if (flock(fd, LOCK_SH) < 0) {
 			RTE_LOG(DEBUG, EAL, "%s(): Locking file failed: %s\n",
 				__func__, strerror(errno));
-			goto fd_error;
+			goto mmap_error;
 		}
 
 		/* find segment data */
@@ -1876,13 +1876,13 @@
 		if (msl == NULL) {
 			RTE_LOG(DEBUG, EAL, "%s(): Cannot find memseg list\n",
 				__func__);
-			goto fd_error;
+			goto mmap_error;
 		}
 		ms = rte_mem_virt2memseg(map_addr, msl);
 		if (ms == NULL) {
 			RTE_LOG(DEBUG, EAL, "%s(): Cannot find memseg\n",
 				__func__);
-			goto fd_error;
+			goto mmap_error;
 		}
 
 		msl_idx = msl - mcfg->memsegs;
@@ -1890,7 +1890,7 @@
 		if (ms_idx < 0) {
 			RTE_LOG(DEBUG, EAL, "%s(): Cannot find memseg idx\n",
 				__func__);
-			goto fd_error;
+			goto mmap_error;
 		}
 
 		/* store segment fd internally */
@@ -1903,18 +1903,15 @@
 	close(fd_hugepage);
 	return 0;
 
+mmap_error:
+	munmap(hp[i].final_va, hp[i].size);
 fd_error:
 	close(fd);
 error:
-	/* map all segments into memory to make sure we get the addrs */
-	cur_seg = 0;
-	for (cur_seg = 0; cur_seg < i; cur_seg++) {
-		struct hugepage_file *hf = &hp[i];
-		size_t map_sz = hf->size;
-		void *map_addr = hf->final_va;
+	/* unwind mmap's done so far */
+	for (cur_seg = 0; cur_seg < i; cur_seg++)
+		munmap(hp[cur_seg].final_va, hp[cur_seg].size);
 
-		munmap(map_addr, map_sz);
-	}
 	if (hp != NULL && hp != MAP_FAILED)
 		munmap(hp, size);
 	if (fd_hugepage >= 0)
diff -Nru dpdk-18.11.6/lib/librte_ethdev/rte_ethdev.c dpdk-18.11.8/lib/librte_ethdev/rte_ethdev.c
--- dpdk-18.11.6/lib/librte_ethdev/rte_ethdev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_ethdev/rte_ethdev.c	2020-05-18 15:00:53.000000000 +0100
@@ -2524,6 +2524,7 @@
 	 * return status and does not know if get is successful or not.
 	 */
 	memset(dev_info, 0, sizeof(struct rte_eth_dev_info));
+	dev_info->switch_info.domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
 
 	RTE_ETH_VALID_PORTID_OR_RET(port_id);
 	dev = &rte_eth_devices[port_id];
@@ -3460,7 +3461,7 @@
 			next = TAILQ_NEXT(cb, next);
 
 			if (cb->cb_fn != cb_fn || cb->event != event ||
-			    (cb->cb_arg != (void *)-1 && cb->cb_arg != cb_arg))
+			    (cb_arg != (void *)-1 && cb->cb_arg != cb_arg))
 				continue;
 
 			/*
@@ -4359,8 +4360,7 @@
 
 	*domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
 
-	for (i = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID + 1;
-		i < RTE_MAX_ETHPORTS; i++) {
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
 		if (rte_eth_switch_domains[i].state ==
 			RTE_ETH_SWITCH_DOMAIN_UNUSED) {
 			rte_eth_switch_domains[i].state =
diff -Nru dpdk-18.11.6/lib/librte_ethdev/rte_ethdev.h dpdk-18.11.8/lib/librte_ethdev/rte_ethdev.h
--- dpdk-18.11.6/lib/librte_ethdev/rte_ethdev.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_ethdev/rte_ethdev.h	2020-05-18 15:00:53.000000000 +0100
@@ -1054,7 +1054,7 @@
  * Default values for switch domain id when ethdev does not support switch
  * domain definitions.
  */
-#define RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID	(0)
+#define RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID	(UINT16_MAX)
 
 /**
  * Ethernet device associated switch information
diff -Nru dpdk-18.11.6/lib/librte_ethdev/rte_ethdev_pci.h dpdk-18.11.8/lib/librte_ethdev/rte_ethdev_pci.h
--- dpdk-18.11.6/lib/librte_ethdev/rte_ethdev_pci.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_ethdev/rte_ethdev_pci.h	2020-05-18 15:00:53.000000000 +0100
@@ -42,6 +42,8 @@
 
 /**
  * Copy pci device info to the Ethernet device data.
+ * Shared memory (eth_dev->data) only updated by primary process, so it is safe
+ * to call this function from both primary and secondary processes.
  *
  * @param eth_dev
  * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
@@ -60,14 +62,16 @@
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
 
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
 
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
diff -Nru dpdk-18.11.6/lib/librte_kni/rte_kni.c dpdk-18.11.8/lib/librte_kni/rte_kni.c
--- dpdk-18.11.6/lib/librte_kni/rte_kni.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_kni/rte_kni.c	2020-05-18 15:00:53.000000000 +0100
@@ -142,31 +142,38 @@
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_TX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_tx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_tx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_tx_q == NULL, tx_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_rx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_rx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_rx_q == NULL, rx_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_ALLOC_Q_MZ_NAME_FMT, kni->name);
-	kni->m_alloc_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_alloc_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_alloc_q == NULL, alloc_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_FREE_Q_MZ_NAME_FMT, kni->name);
-	kni->m_free_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_free_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_free_q == NULL, free_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_REQ_Q_MZ_NAME_FMT, kni->name);
-	kni->m_req_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_req_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_req_q == NULL, req_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RESP_Q_MZ_NAME_FMT, kni->name);
-	kni->m_resp_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_resp_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_resp_q == NULL, resp_q_fail);
 
 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_SYNC_ADDR_MZ_NAME_FMT, kni->name);
-	kni->m_sync_addr = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY, 0);
+	kni->m_sync_addr = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
+			RTE_MEMZONE_IOVA_CONTIG);
 	KNI_MEM_CHECK(kni->m_sync_addr == NULL, sync_addr_fail);
 
 	return 0;
diff -Nru dpdk-18.11.6/lib/librte_latencystats/rte_latencystats.c dpdk-18.11.8/lib/librte_latencystats/rte_latencystats.c
--- dpdk-18.11.6/lib/librte_latencystats/rte_latencystats.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_latencystats/rte_latencystats.c	2020-05-18 15:00:53.000000000 +0100
@@ -41,6 +41,7 @@
 	float avg_latency; /**< Average latency in nano seconds */
 	float max_latency; /**< Maximum latency in nano seconds */
 	float jitter; /** Latency variation */
+	rte_spinlock_t lock; /** Latency calculation lock */
 };
 
 static struct rte_latency_stats *glob_stats;
@@ -163,6 +164,7 @@
 			latency[cnt++] = now - pkts[i]->timestamp;
 	}
 
+	rte_spinlock_lock(&glob_stats->lock);
 	for (i = 0; i < cnt; i++) {
 		/*
 		 * The jitter is calculated as statistical mean of interpacket
@@ -192,6 +194,7 @@
 			alpha * (latency[i] - glob_stats->avg_latency);
 		prev_latency = latency[i];
 	}
+	rte_spinlock_unlock(&glob_stats->lock);
 
 	return nb_pkts;
 }
@@ -221,6 +224,7 @@
 	}
 
 	glob_stats = mz->addr;
+	rte_spinlock_init(&glob_stats->lock);
 	samp_intvl = app_samp_intvl * latencystat_cycles_per_ns();
 
 	/** Register latency stats with stats library */
diff -Nru dpdk-18.11.6/lib/librte_mbuf/rte_mbuf.h dpdk-18.11.8/lib/librte_mbuf/rte_mbuf.h
--- dpdk-18.11.6/lib/librte_mbuf/rte_mbuf.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_mbuf/rte_mbuf.h	2020-05-18 15:00:53.000000000 +0100
@@ -2092,7 +2092,7 @@
 static inline int rte_pktmbuf_is_contiguous(const struct rte_mbuf *m)
 {
 	__rte_mbuf_sanity_check(m, 1);
-	return !!(m->nb_segs == 1);
+	return m->nb_segs == 1;
 }
 
 /**
diff -Nru dpdk-18.11.6/lib/librte_mempool/rte_mempool.c dpdk-18.11.8/lib/librte_mempool/rte_mempool.c
--- dpdk-18.11.6/lib/librte_mempool/rte_mempool.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_mempool/rte_mempool.c	2020-05-18 15:00:53.000000000 +0100
@@ -678,8 +678,10 @@
 	}
 
 	ret = mempool_ops_alloc_once(mp);
-	if (ret != 0)
-		return ret;
+	if (ret < 0) {
+		rte_errno = -ret;
+		return 0;
+	}
 
 	size = get_anon_size(mp);
 	if (size < 0) {
@@ -703,8 +705,10 @@
 
 	ret = rte_mempool_populate_virt(mp, addr, size, getpagesize(),
 		rte_mempool_memchunk_anon_free, addr);
-	if (ret == 0)
+	if (ret < 0) {
+		rte_errno = -ret;
 		goto fail;
+	}
 
 	return mp->populated_size;
 
diff -Nru dpdk-18.11.6/lib/librte_mempool/rte_mempool.h dpdk-18.11.8/lib/librte_mempool/rte_mempool.h
--- dpdk-18.11.6/lib/librte_mempool/rte_mempool.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_mempool/rte_mempool.h	2020-05-18 15:00:53.000000000 +0100
@@ -1087,8 +1087,8 @@
  *   A pointer to the mempool structure.
  * @return
  *   The number of objects added on success.
- *   On error, the chunk is not added in the memory list of the
- *   mempool and a negative errno is returned.
+ *   On error, 0 is returned, rte_errno is set, and the chunk is not added in
+ *   the memory list of the mempool.
  */
 int rte_mempool_populate_anon(struct rte_mempool *mp);
 
@@ -1573,7 +1573,7 @@
 static inline int
 rte_mempool_full(const struct rte_mempool *mp)
 {
-	return !!(rte_mempool_avail_count(mp) == mp->size);
+	return rte_mempool_avail_count(mp) == mp->size;
 }
 
 /**
@@ -1592,7 +1592,7 @@
 static inline int
 rte_mempool_empty(const struct rte_mempool *mp)
 {
-	return !!(rte_mempool_avail_count(mp) == 0);
+	return rte_mempool_avail_count(mp) == 0;
 }
 
 /**
diff -Nru dpdk-18.11.6/lib/librte_vhost/socket.c dpdk-18.11.8/lib/librte_vhost/socket.c
--- dpdk-18.11.6/lib/librte_vhost/socket.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_vhost/socket.c	2020-05-18 15:00:53.000000000 +0100
@@ -125,7 +125,8 @@
 
 	ret = recvmsg(sockfd, &msgh, 0);
 	if (ret <= 0) {
-		RTE_LOG(ERR, VHOST_CONFIG, "recvmsg failed\n");
+		if (ret)
+			RTE_LOG(ERR, VHOST_CONFIG, "recvmsg failed\n");
 		return ret;
 	}
 
@@ -310,16 +311,16 @@
 
 		vhost_destroy_device(conn->vid);
 
+		if (vsocket->reconnect) {
+			create_unix_socket(vsocket);
+			vhost_user_start_client(vsocket);
+		}
+
 		pthread_mutex_lock(&vsocket->conn_mutex);
 		TAILQ_REMOVE(&vsocket->conn_list, conn, next);
 		pthread_mutex_unlock(&vsocket->conn_mutex);
 
 		free(conn);
-
-		if (vsocket->reconnect) {
-			create_unix_socket(vsocket);
-			vhost_user_start_client(vsocket);
-		}
 	}
 }
 
@@ -855,6 +856,7 @@
 			"error: failed to init connection mutex\n");
 		goto out_free;
 	}
+	vsocket->vdpa_dev_id = -1;
 	vsocket->dequeue_zero_copy = flags & RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
 
 	if (vsocket->dequeue_zero_copy &&
@@ -997,9 +999,10 @@
 				next = TAILQ_NEXT(conn, next);
 
 				/*
-				 * If r/wcb is executing, release the
-				 * conn_mutex lock, and try again since
-				 * the r/wcb may use the conn_mutex lock.
+				 * If r/wcb is executing, release vsocket's
+				 * conn_mutex and vhost_user's mutex locks, and
+				 * try again since the r/wcb may use the
+				 * conn_mutex and mutex locks.
 				 */
 				if (fdset_try_del(&vhost_user.fdset,
 						  conn->connfd) == -1) {
@@ -1020,8 +1023,17 @@
 			pthread_mutex_unlock(&vsocket->conn_mutex);
 
 			if (vsocket->is_server) {
-				fdset_del(&vhost_user.fdset,
-						vsocket->socket_fd);
+				/*
+				 * If r/wcb is executing, release vhost_user's
+				 * mutex lock, and try again since the r/wcb
+				 * may use the mutex lock.
+				 */
+				if (fdset_try_del(&vhost_user.fdset,
+						vsocket->socket_fd) == -1) {
+					pthread_mutex_unlock(&vhost_user.mutex);
+					goto again;
+				}
+
 				close(vsocket->socket_fd);
 				unlink(path);
 			} else if (vsocket->reconnect) {
diff -Nru dpdk-18.11.6/lib/librte_vhost/vhost.c dpdk-18.11.8/lib/librte_vhost/vhost.c
--- dpdk-18.11.6/lib/librte_vhost/vhost.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_vhost/vhost.c	2020-05-18 15:00:53.000000000 +0100
@@ -323,6 +323,57 @@
 	rte_free(dev);
 }
 
+static __rte_always_inline int
+log_translate(struct virtio_net *dev, struct vhost_virtqueue *vq)
+{
+	if (likely(!(vq->ring_addrs.flags & (1 << VHOST_VRING_F_LOG))))
+		return 0;
+
+	vq->log_guest_addr = translate_log_addr(dev, vq,
+						vq->ring_addrs.log_guest_addr);
+	if (vq->log_guest_addr == 0)
+		return -1;
+
+	return 0;
+}
+
+/*
+ * Converts vring log address to GPA
+ * If IOMMU is enabled, the log address is IOVA
+ * If IOMMU not enabled, the log address is already GPA
+ *
+ * Caller should have iotlb_lock read-locked
+ */
+uint64_t
+translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq,
+		uint64_t log_addr)
+{
+	if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) {
+		const uint64_t exp_size = sizeof(uint64_t);
+		uint64_t hva, gpa;
+		uint64_t size = exp_size;
+
+		hva = vhost_iova_to_vva(dev, vq, log_addr,
+					&size, VHOST_ACCESS_RW);
+
+		if (size != exp_size)
+			return 0;
+
+		gpa = hva_to_gpa(dev, hva, exp_size);
+		if (!gpa) {
+			RTE_LOG(ERR, VHOST_CONFIG,
+				"VQ: Failed to find GPA for log_addr: 0x%"
+				PRIx64 " hva: 0x%" PRIx64 "\n",
+				log_addr, hva);
+			return 0;
+		}
+		return gpa;
+
+	} else
+		return log_addr;
+}
+
+/* Caller should have iotlb_lock read-locked */
 static int
 vring_translate_split(struct virtio_net *dev, struct vhost_virtqueue *vq)
 {
@@ -361,6 +412,7 @@
 	return 0;
 }
 
+/* Caller should have iotlb_lock read-locked */
 static int
 vring_translate_packed(struct virtio_net *dev, struct vhost_virtqueue *vq)
 {
@@ -407,6 +459,10 @@
 		if (vring_translate_split(dev, vq) < 0)
 			return -1;
 	}
+
+	if (log_translate(dev, vq) < 0)
+		return -1;
+
 	vq->access_ok = 1;
 
 	return 0;
diff -Nru dpdk-18.11.6/lib/librte_vhost/vhost_crypto.c dpdk-18.11.8/lib/librte_vhost/vhost_crypto.c
--- dpdk-18.11.6/lib/librte_vhost/vhost_crypto.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_vhost/vhost_crypto.c	2020-05-18 15:00:53.000000000 +0100
@@ -236,6 +236,11 @@
 	if (unlikely(ret < 0))
 		return ret;
 
+	if (param->cipher_key_len > VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH) {
+		VC_LOG_DBG("Invalid cipher key length\n");
+		return -VIRTIO_CRYPTO_BADMSG;
+	}
+
 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
 	xform->cipher.key.length = param->cipher_key_len;
 	if (xform->cipher.key.length > 0)
@@ -286,6 +291,12 @@
 			&xform_cipher->cipher.algo);
 	if (unlikely(ret < 0))
 		return ret;
+
+	if (param->cipher_key_len > VHOST_USER_CRYPTO_MAX_CIPHER_KEY_LENGTH) {
+		VC_LOG_DBG("Invalid cipher key length\n");
+		return -VIRTIO_CRYPTO_BADMSG;
+	}
+
 	xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
 	xform_cipher->cipher.key.length = param->cipher_key_len;
 	xform_cipher->cipher.key.data = param->cipher_key_buf;
@@ -300,6 +311,12 @@
 	ret = auth_algo_transform(param->hash_algo, &xform_auth->auth.algo);
 	if (unlikely(ret < 0))
 		return ret;
+
+	if (param->auth_key_len > VHOST_USER_CRYPTO_MAX_HMAC_KEY_LENGTH) {
+		VC_LOG_DBG("Invalid auth key length\n");
+		return -VIRTIO_CRYPTO_BADMSG;
+	}
+
 	xform_auth->auth.digest_length = param->digest_len;
 	xform_auth->auth.key.length = param->auth_key_len;
 	xform_auth->auth.key.data = param->auth_key_buf;
@@ -1529,18 +1546,18 @@
 
 	if (unlikely(dev == NULL)) {
 		VC_LOG_ERR("Invalid vid %i", vid);
-		return -EINVAL;
+		return 0;
 	}
 
 	if (unlikely(qid >= VHOST_MAX_QUEUE_PAIRS)) {
 		VC_LOG_ERR("Invalid qid %u", qid);
-		return -EINVAL;
+		return 0;
 	}
 
 	vcrypto = (struct vhost_crypto *)dev->extern_data;
 	if (unlikely(vcrypto == NULL)) {
 		VC_LOG_ERR("Cannot find required data, is it initialized?");
-		return -ENOENT;
+		return 0;
 	}
 
 	vq = dev->virtqueue[qid];
@@ -1562,7 +1579,7 @@
 		if (unlikely(rte_mempool_get_bulk(vcrypto->mbuf_pool,
 				(void **)mbufs, count * 2) < 0)) {
 			VC_LOG_ERR("Insufficient memory");
-			return -ENOMEM;
+			return 0;
 		}
 
 		for (i = 0; i < count; i++) {
@@ -1592,7 +1609,7 @@
 		if (unlikely(rte_mempool_get_bulk(vcrypto->mbuf_pool,
 				(void **)mbufs, count) < 0)) {
 			VC_LOG_ERR("Insufficient memory");
-			return -ENOMEM;
+			return 0;
 		}
 
 		for (i = 0; i < count; i++) {
diff -Nru dpdk-18.11.6/lib/librte_vhost/vhost.h dpdk-18.11.8/lib/librte_vhost/vhost.h
--- dpdk-18.11.6/lib/librte_vhost/vhost.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_vhost/vhost.h	2020-05-18 15:00:53.000000000 +0100
@@ -437,14 +437,23 @@
 vhost_log_cache_used_vring(struct virtio_net *dev, struct vhost_virtqueue *vq,
 			uint64_t offset, uint64_t len)
 {
-	vhost_log_cache_write(dev, vq, vq->log_guest_addr + offset, len);
+	if (unlikely(dev->features & (1ULL << VHOST_F_LOG_ALL))) {
+		if (unlikely(vq->log_guest_addr == 0))
+			return;
+		__vhost_log_cache_write(dev, vq, vq->log_guest_addr + offset,
+					len);
+	}
 }
 
 static __rte_always_inline void
 vhost_log_used_vring(struct virtio_net *dev, struct vhost_virtqueue *vq,
 		     uint64_t offset, uint64_t len)
 {
-	vhost_log_write(dev, vq->log_guest_addr + offset, len);
+	if (unlikely(dev->features & (1ULL << VHOST_F_LOG_ALL))) {
+		if (unlikely(vq->log_guest_addr == 0))
+			return;
+		__vhost_log_write(dev, vq->log_guest_addr + offset, len);
+	}
 }
 
 static __rte_always_inline void
@@ -593,6 +602,8 @@
 			struct vhost_virtqueue *vq,
 			uint64_t desc_addr, uint64_t desc_len);
 int vring_translate(struct virtio_net *dev, struct vhost_virtqueue *vq);
+uint64_t translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq,
+		uint64_t log_addr);
 void vring_invalidate(struct virtio_net *dev, struct vhost_virtqueue *vq);
 
 static __rte_always_inline uint64_t
diff -Nru dpdk-18.11.6/lib/librte_vhost/vhost_user.c dpdk-18.11.8/lib/librte_vhost/vhost_user.c
--- dpdk-18.11.6/lib/librte_vhost/vhost_user.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/lib/librte_vhost/vhost_user.c	2020-05-18 15:00:53.000000000 +0100
@@ -628,13 +628,11 @@
 {
 	if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) {
 		uint64_t vva;
-		uint64_t req_size = *size;
 
-		vva = vhost_user_iotlb_cache_find(vq, ra,
+		vhost_user_iotlb_rd_lock(vq);
+		vva = vhost_iova_to_vva(dev, vq, ra,
 					size, VHOST_ACCESS_RW);
-		if (req_size != *size)
-			vhost_user_iotlb_miss(dev, (ra + *size),
-					      VHOST_ACCESS_RW);
+		vhost_user_iotlb_rd_unlock(vq);
 
 		return vva;
 	}
@@ -642,37 +640,16 @@
 	return qva_to_vva(dev, ra, size);
 }
 
-/*
- * Converts vring log address to GPA
- * If IOMMU is enabled, the log address is IOVA
- * If IOMMU not enabled, the log address is already GPA
- */
 static uint64_t
-translate_log_addr(struct virtio_net *dev, struct vhost_virtqueue *vq,
-		uint64_t log_addr)
+log_addr_to_gpa(struct virtio_net *dev, struct vhost_virtqueue *vq)
 {
-	if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) {
-		const uint64_t exp_size = sizeof(struct vring_used) +
-			sizeof(struct vring_used_elem) * vq->size;
-		uint64_t hva, gpa;
-		uint64_t size = exp_size;
-
-		hva = vhost_iova_to_vva(dev, vq, log_addr,
-					&size, VHOST_ACCESS_RW);
-		if (size != exp_size)
-			return 0;
+	uint64_t log_gpa;
 
-		gpa = hva_to_gpa(dev, hva, exp_size);
-		if (!gpa) {
-			RTE_LOG(ERR, VHOST_CONFIG,
-				"VQ: Failed to find GPA for log_addr: 0x%" PRIx64 " hva: 0x%" PRIx64 "\n",
-				log_addr, hva);
-			return 0;
-		}
-		return gpa;
+	vhost_user_iotlb_rd_lock(vq);
+	log_gpa = translate_log_addr(dev, vq, vq->ring_addrs.log_guest_addr);
+	vhost_user_iotlb_rd_unlock(vq);
 
-	} else
-		return log_addr;
+	return log_gpa;
 }
 
 static struct virtio_net *
@@ -684,7 +661,7 @@
 
 	if (addr->flags & (1 << VHOST_VRING_F_LOG)) {
 		vq->log_guest_addr =
-			translate_log_addr(dev, vq, addr->log_guest_addr);
+			log_addr_to_gpa(dev, vq);
 		if (vq->log_guest_addr == 0) {
 			RTE_LOG(DEBUG, VHOST_CONFIG,
 				"(%d) failed to map log_guest_addr.\n",
@@ -1117,6 +1094,21 @@
 			goto err_mmap;
 		}
 		mmap_size = RTE_ALIGN_CEIL(mmap_size, alignment);
+		if (mmap_size == 0) {
+			/*
+			 * It could happen if initial mmap_size + alignment
+			 * overflows the sizeof uint64, which could happen if
+			 * either mmap_size or alignment value is wrong.
+			 *
+			 * mmap() kernel implementation would return an error,
+			 * but better catch it before and provide useful info
+			 * in the logs.
+			 */
+			RTE_LOG(ERR, VHOST_CONFIG, "mmap size (0x%" PRIx64 ") "
+					"or alignment (0x%" PRIx64 ") is invalid\n",
+					reg->size + mmap_offset, alignment);
+			goto err_mmap;
+		}
 
 		populate = (dev->dequeue_zero_copy) ? MAP_POPULATE : 0;
 		mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
@@ -1270,7 +1262,8 @@
 		return false;
 
 	if (vq_is_packed(dev))
-		rings_ok = !!vq->desc_packed;
+		rings_ok = vq->desc_packed && vq->driver_event &&
+			vq->device_event;
 	else
 		rings_ok = vq->desc && vq->avail && vq->used;
 
@@ -1602,10 +1595,10 @@
 	size = msg->payload.log.mmap_size;
 	off  = msg->payload.log.mmap_offset;
 
-	/* Don't allow mmap_offset to point outside the mmap region */
-	if (off > size) {
+	/* Check for mmap size and offset overflow. */
+	if (off >= -size) {
 		RTE_LOG(ERR, VHOST_CONFIG,
-			"log offset %#"PRIx64" exceeds log size %#"PRIx64"\n",
+			"log offset %#"PRIx64" and log size %#"PRIx64" overflow\n",
 			off, size);
 		return VH_RESULT_ERR;
 	}
@@ -1771,6 +1764,13 @@
 	if (ra->used_user_addr < end && (ra->used_user_addr + len) > start)
 		return 1;
 
+	if (ra->flags & (1 << VHOST_VRING_F_LOG)) {
+		len = sizeof(uint64_t);
+		if (ra->log_guest_addr < end &&
+		    (ra->log_guest_addr + len) > start)
+			return 1;
+	}
+
 	return 0;
 }
 
@@ -1796,6 +1796,13 @@
 	if (ra->used_user_addr < end && (ra->used_user_addr + len) > start)
 		return 1;
 
+	if (ra->flags & (1 << VHOST_VRING_F_LOG)) {
+		len = sizeof(uint64_t);
+		if (ra->log_guest_addr < end &&
+		    (ra->log_guest_addr + len) > start)
+			return 1;
+	}
+
 	return 0;
 }
 
@@ -1981,8 +1988,14 @@
 
 	ret = read_fd_message(sockfd, (char *)msg, VHOST_USER_HDR_SIZE,
 		msg->fds, VHOST_MEMORY_MAX_NREGIONS, &msg->fd_num);
-	if (ret <= 0)
+	if (ret <= 0) {
 		return ret;
+	} else if (ret != VHOST_USER_HDR_SIZE) {
+		RTE_LOG(ERR, VHOST_CONFIG,
+			"Unexpected header size read\n");
+		close_msg_fds(msg);
+		return -1;
+	}
 
 	if (msg->size) {
 		if (msg->size > sizeof(msg->payload)) {
@@ -2049,7 +2062,7 @@
 vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev,
 			struct VhostUserMsg *msg)
 {
-	uint16_t vring_idx;
+	uint32_t vring_idx;
 
 	switch (msg->request.master) {
 	case VHOST_USER_SET_VRING_KICK:
diff -Nru dpdk-18.11.6/MAINTAINERS dpdk-18.11.8/MAINTAINERS
--- dpdk-18.11.6/MAINTAINERS	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/MAINTAINERS	2020-05-18 15:00:53.000000000 +0100
@@ -63,8 +63,8 @@
 T: git://dpdk.org/next/dpdk-next-pipeline
 
 Stable Branches
-M: Yuanhan Liu <yliu@fridaylinux.org>
 M: Luca Boccassi <bluca@debian.org>
+M: Kevin Traynor <ktraynor@redhat.com>
 T: git://dpdk.org/dpdk-stable
 
 Security Issues
@@ -318,7 +318,7 @@
 F: devtools/test-null.sh
 
 Flow API
-M: Adrien Mazarguil <adrien.mazarguil@6wind.com>
+M: Ori Kam <orika@mellanox.com>
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/cmdline_flow.c
 F: doc/guides/prog_guide/rte_flow.rst
@@ -780,7 +780,7 @@
 F: doc/guides/nics/features/null.ini
 
 Fail-safe PMD
-M: Gaetan Rivet <gaetan.rivet@6wind.com>
+M: Gaetan Rivet <grive@u256.net>
 F: drivers/net/failsafe/
 F: doc/guides/nics/fail_safe.rst
 F: doc/guides/nics/features/failsafe.ini
@@ -1168,7 +1168,7 @@
 F: test/test/test_kvargs.c
 
 PCI
-M: Gaetan Rivet <gaetan.rivet@6wind.com>
+M: Gaetan Rivet <grive@u256.net>
 F: lib/librte_pci/
 
 Power management
diff -Nru dpdk-18.11.6/meson.build dpdk-18.11.8/meson.build
--- dpdk-18.11.6/meson.build	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/meson.build	2020-05-18 15:00:53.000000000 +0100
@@ -2,7 +2,7 @@
 # Copyright(c) 2017 Intel Corporation
 
 project('DPDK', 'C',
-	version: '18.11.6',
+	version: '18.11.8',
 	license: 'BSD',
 	default_options: ['buildtype=release', 'default_library=static'],
 	meson_version: '>= 0.41'
diff -Nru dpdk-18.11.6/mk/internal/rte.compile-pre.mk dpdk-18.11.8/mk/internal/rte.compile-pre.mk
--- dpdk-18.11.6/mk/internal/rte.compile-pre.mk	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/mk/internal/rte.compile-pre.mk	2020-05-18 15:00:53.000000000 +0100
@@ -61,7 +61,7 @@
 
 PMDINFO_GEN = $(RTE_SDK_BIN)/app/dpdk-pmdinfogen $@ $@.pmd.c
 PMDINFO_CC = $(CC) $(CPPFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@.pmd.o $@.pmd.c
-PMDINFO_LD = $(CROSS)ld $(LDFLAGS) -r -o $@.o $@.pmd.o $@
+PMDINFO_LD = $(CROSS)ld -r $(filter-out -export-dynamic,$(LDFLAGS)) -o $@.o $@.pmd.o $@
 PMDINFO_TO_O = if grep -q 'RTE_PMD_REGISTER_.*(.*)' $<; then \
 	echo "$(if $V,$(PMDINFO_GEN),  PMDINFO $@.pmd.c)" && \
 	$(PMDINFO_GEN) && \
diff -Nru dpdk-18.11.6/mk/rte.sdkdoc.mk dpdk-18.11.8/mk/rte.sdkdoc.mk
--- dpdk-18.11.6/mk/rte.sdkdoc.mk	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/mk/rte.sdkdoc.mk	2020-05-18 15:00:53.000000000 +0100
@@ -37,7 +37,7 @@
 all: api-html guides-html guides-pdf
 
 .PHONY: clean
-clean: api-html-clean guides-html-clean guides-pdf-clean guides-man-clean
+clean: api-html-clean guides-html-clean guides-pdf-clean guides-man-clean guide-table-clean
 
 .PHONY: api-html
 api-html: $(API_EXAMPLES)
@@ -56,7 +56,7 @@
 .PHONY: api-html-clean
 api-html-clean:
 	$(Q)rm -f $(API_EXAMPLES)
-	$(Q)rm -f $(RTE_OUTPUT)/doc/html/api/*
+	$(Q)rm -rf $(RTE_OUTPUT)/doc/html/api/*
 	$(Q)rmdir -p --ignore-fail-on-non-empty $(RTE_OUTPUT)/doc/html/api 2>&- || true
 
 $(API_EXAMPLES): api-html-clean
@@ -67,6 +67,10 @@
 guides-pdf-img-clean:
 	$(Q)rm -f $(RTE_SDK)/doc/guides/*/img/*.pdf
 
+guide-table-clean: guide-overview_feature_table-clean
+guide-overview_feature_table-clean:
+	$(Q)rm -rf $(shell find $(RTE_SDK)/doc/guides/ -maxdepth 1 -type d '!' -exec test -e "{}/index.rst" ';' -print)
+
 guides-%-clean:
 	$(Q)rm -rf $(RTE_OUTPUT)/doc/$*/guides
 	$(Q)rmdir -p --ignore-fail-on-non-empty $(RTE_OUTPUT)/doc/$* 2>&- || true
diff -Nru dpdk-18.11.6/pkg/dpdk.spec dpdk-18.11.8/pkg/dpdk.spec
--- dpdk-18.11.6/pkg/dpdk.spec	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/pkg/dpdk.spec	2020-05-18 15:00:53.000000000 +0100
@@ -2,7 +2,7 @@
 # Copyright 2014 6WIND S.A.
 
 Name: dpdk
-Version: 18.11.6
+Version: 18.11.8
 Release: 1
 Packager: packaging@6wind.com
 URL: http://dpdk.org
diff -Nru dpdk-18.11.6/test/test/test_compressdev_test_buffer.h dpdk-18.11.8/test/test/test_compressdev_test_buffer.h
--- dpdk-18.11.6/test/test/test_compressdev_test_buffer.h	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/test/test/test_compressdev_test_buffer.h	2020-05-18 15:00:53.000000000 +0100
@@ -1,3 +1,7 @@
+/* SPDX-License-Identifier: (BSD-3-Clause)
+ * Copyright(c) 2018-2020 Intel Corporation
+ */
+
 #ifndef TEST_COMPRESSDEV_TEST_BUFFERS_H_
 #define TEST_COMPRESSDEV_TEST_BUFFERS_H_
 
@@ -190,106 +194,104 @@
 	"\n"
 	"ORLANDO	Go apart, Adam, and thou shalt hear how he will\n";
 
-/* Snippet of source code in Pascal */
-static const char test_buf_pascal[] =
-	"	Ptr    = 1..DMem;\n"
-	"	Loc    = 1..IMem;\n"
-	"	Loc0   = 0..IMem;\n"
-	"	EdgeT  = (hout,lin,hin,lout); {Warning this order is important in}\n"
-	"				      {predicates such as gtS,geS}\n"
-	"	CardT  = (finite,infinite);\n"
-	"	ExpT   = Minexp..Maxexp;\n"
-	"	ManT   = Mininf..Maxinf; \n"
-	"	Pflag  = (PNull,PSoln,PTrace,PPrint);\n"
-	"	Sreal  = record\n"
-	"		    edge:EdgeT;\n"
-	"		    cardinality:CardT;\n"
-	"		    exp:ExpT; {exponent}\n"
-	"		    mantissa:ManT;\n"
-	"		 end;\n"
-	"	Int    = record\n"
-	"		    hi:Sreal;\n"
-	"		    lo:Sreal;\n"
-	"	 end;\n"
-	"	Instr  = record\n"
-	"		    Code:OpType;\n"
-	"		    Pars: array[0..Par] of 0..DMem;\n"
-	"		 end;\n"
-	"	DataMem= record\n"
-	"		    D        :array [Ptr] of Int;\n"
-	"		    S        :array [Loc] of State;\n"
-	"		    LastHalve:Loc;\n"
-	"		    RHalve   :array [Loc] of real;\n"
-	"		 end;\n"
-	"	DataFlags=record\n"
-	"		    PF	     :array [Ptr] of Pflag;\n"
-	"		 end;\n"
-	"var\n"
-	"	Debug  : (none,activity,post,trace,dump);\n"
-	"	Cut    : (once,all);\n"
-	"	GlobalEnd,Verifiable:boolean;\n"
-	"	HalveThreshold:real;\n"
-	"	I      : array [Loc] of Instr; {Memory holding instructions}\n"
-	"	End    : Loc; {last instruction in I}\n"
-	"	ParN   : array [OpType] of -1..Par; {number of parameters for each \n"
-	"			opcode. -1 means no result}\n"
-	"        ParIntersect : array [OpType] of boolean ;\n"
-	"	DInit  : DataMem; {initial memory which is cleared and \n"
-	"				used in first call}\n"
-	"	DF     : DataFlags; {hold flags for variables, e.g. print/trace}\n"
-	"	MaxDMem:0..DMem;\n"
-	"	Shift  : array[0..Digits] of 1..maxint;{array of constant multipliers}\n"
-	"						{used for alignment etc.}\n"
-	"	Dummy  :Positive;\n"
-	"	{constant intervals and Sreals}\n"
-	"	PlusInfS,MinusInfS,PlusSmallS,MinusSmallS,ZeroS,\n"
-	"	PlusFiniteS,MinusFiniteS:Sreal;\n"
-	"	Zero,All,AllFinite:Int;\n"
-	"\n"
-	"procedure deblank;\n"
-	"var Ch:char;\n"
-	"begin\n"
-	"   while (not eof) and (input^ in [' ','	']) do read(Ch);\n"
-	"end;\n"
-	"\n"
-	"procedure InitialOptions;\n"
-	"\n"
-	"#include '/user/profs/cleary/bin/options.i';\n"
-	"\n"
-	"   procedure Option;\n"
-	"   begin\n"
-	"      case Opt of\n"
-	"      'a','A':Debug:=activity;\n"
-	"      'd','D':Debug:=dump;\n"
-	"      'h','H':HalveThreshold:=StringNum/100;\n"
-	"      'n','N':Debug:=none;\n"
-	"      'p','P':Debug:=post;\n"
-	"      't','T':Debug:=trace;\n"
-	"      'v','V':Verifiable:=true;\n"
-	"      end;\n"
-	"   end;\n"
-	"\n"
-	"begin\n"
-	"   Debug:=trace;\n"
-	"   Verifiable:=false;\n"
-	"   HalveThreshold:=67/100;\n"
-	"   Options;\n"
-	"   writeln(Debug);\n"
-	"   writeln('Verifiable:',Verifiable);\n"
-	"   writeln('Halve threshold',HalveThreshold);\n"
-	"end;{InitialOptions}\n"
-	"\n"
-	"procedure NormalizeUp(E,M:integer;var S:Sreal;var Closed:boolean);\n"
-	"begin\n"
-	"with S do\n"
-	"begin\n"
-	"   if M=0 then S:=ZeroS else\n"
-	"   if M>0 then\n";
+/* Snippet of Alice's Adventures in Wonderland */
+static const char test_buf_alice2[] =
+	"`Curiouser and curiouser!' cried Alice (she was so much\n"
+	"surprised, that for the moment she quite forgot how to speak good\n"
+	"English); `now I'm opening out like the largest telescope that\n"
+	"ever was!  Good-bye, feet!' (for when she looked down at her\n"
+	"feet, they seemed to be almost out of sight, they were getting so\n"
+	"far off).  `Oh, my poor little feet, I wonder who will put on\n"
+	"your shoes and stockings for you now, dears?  I'm sure _I_ shan't\n"
+	"be able!  I shall be a great deal too far off to trouble myself\n"
+	"about you:  you must manage the best way you can; --but I must be\n"
+	"kind to them,' thought Alice, `or perhaps they won't walk the\n"
+	"way I want to go!  Let me see:  I'll give them a new pair of\n"
+	"boots every Christmas.'\n"
+	"\n"
+	"  And she went on planning to herself how she would manage it.\n"
+	"`They must go by the carrier,' she thought; `and how funny it'll\n"
+	"seem, sending presents to one's own feet!  And how odd the\n"
+	"directions will look!\n"
+	"\n"
+	"	    ALICE'S RIGHT FOOT, ESQ.\n"
+	"		HEARTHRUG,\n"
+	"		    NEAR THE FENDER,\n"
+	"			(WITH ALICE'S LOVE).\n"
+	"\n"
+	"Oh dear, what nonsense I'm talking!'\n"
+	"\n"
+	"  Just then her head struck against the roof of the hall:  in\n"
+	"fact she was now more than nine feet high, and she at once took\n"
+	"up the little golden key and hurried off to the garden door.\n"
+	"\n"
+	"  Poor Alice!  It was as much as she could do, lying down on one\n"
+	"side, to look through into the garden with one eye; but to get\n"
+	"through was more hopeless than ever:  she sat down and began to\n"
+	"cry again.\n"
+	"\n"
+	"  `You ought to be ashamed of yourself,' said Alice, `a great\n"
+	"girl like you,' (she might well say this), `to go on crying in\n"
+	"this way!  Stop this moment, I tell you!'  But she went on all\n"
+	"the same, shedding gallons of tears, until there was a large pool\n"
+	"all round her, about four inches deep and reaching half down the\n"
+	"hall.\n"
+	"\n"
+	" After a time she heard a little pattering of feet in the\n"
+	"distance, and she hastily dried her eyes to see what was coming.\n"
+	"It was the White Rabbit returning, splendidly dressed, with a\n"
+	"pair of white kid gloves in one hand and a large fan in the\n"
+	"other:  he came trotting along in a great hurry, muttering to\n"
+	"himself as he came, `Oh! the Duchess, the Duchess! Oh! won't she\n"
+	"be savage if I've kept her waiting!'  Alice felt so desperate\n"
+	"that she was ready to ask help of any one; so, when the Rabbit\n"
+	"came near her, she began, in a low, timid voice, `If you please,\n"
+	"sir--'  The Rabbit started violently, dropped the white kid\n"
+	"gloves and the fan, and skurried away into the darkness as hard\n"
+	"as he could go.\n"
+	"\n"
+	"  Alice took up the fan and gloves, and, as the hall was very\n"
+	"hot, she kept fanning herself all the time she went on talking:\n"
+	"`Dear, dear!  How queer everything is to-day!  And yesterday\n"
+	"things went on just as usual.  I wonder if I've been changed in\n"
+	"the night?  Let me think:  was I the same when I got up this\n"
+	"morning?  I almost think I can remember feeling a little\n"
+	"different.  But if I'm not the same, the next question is, Who in\n"
+	"the world am I?  Ah, THAT'S the great puzzle!'  And she began\n"
+	"thinking over all the children she knew that were of the same age\n"
+	"as herself, to see if she could have been changed for any of\n"
+	"them.\n"
+	"\n"
+	"  `I'm sure I'm not Ada,' she said, `for her hair goes in such\n"
+	"long ringlets, and mine doesn't go in ringlets at all; and I'm\n"
+	"sure I can't be Mabel, for I know all sorts of things, and she,\n"
+	"oh! she knows such a very little!  Besides, SHE'S she, and I'm I,\n"
+	"and--oh dear, how puzzling it all is!  I'll try if I know all the\n"
+	"things I used to know.  Let me see:  four times five is twelve,\n"
+	"and four times six is thirteen, and four times seven is--oh dear!\n"
+	"I shall never get to twenty at that rate!  However, the\n"
+	"Multiplication Table doesn't signify:  let's try Geography.\n"
+	"London is the capital of Paris, and Paris is the capital of Rome,\n"
+	"and Rome--no, THAT'S all wrong, I'm certain!  I must have been\n"
+	"changed for Mabel!  I'll try and say ''How doth the little--''\n"
+	"and she crossed her hands on her lap as if she were saying lessons,\n"
+	"and began to repeat it, but her voice sounded hoarse and\n"
+	"strange, and the words did not come the same as they used to do:--\n"
+	"\n"
+	"	    `How doth the little crocodile\n"
+	"	      Improve his shining tail,\n"
+	"	    And pour the waters of the Nile\n"
+	"	      On every golden scale!\n"
+	"\n"
+	"	    `How cheerfully he seems to grin,\n"
+	"	      How neatly spread his claws,\n"
+	"	    And welcome little fishes in\n"
+	"	      With gently smiling jaws!'\n";
 
 static const char * const compress_test_bufs[] = {
 	test_buf_alice,
 	test_buf_shakespeare,
-	test_buf_pascal
+	test_buf_alice2
 };
 
 #endif /* TEST_COMPRESSDEV_TEST_BUFFERS_H_ */
diff -Nru dpdk-18.11.6/test/test/test_cryptodev.c dpdk-18.11.8/test/test/test_cryptodev.c
--- dpdk-18.11.6/test/test/test_cryptodev.c	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/test/test/test_cryptodev.c	2020-05-18 15:00:53.000000000 +0100
@@ -136,6 +136,11 @@
 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
 		rte_pause();
 
+	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
+		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
+		return NULL;
+	}
+
 	return op;
 }
 
@@ -2899,8 +2904,8 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 				ut_params->op);
-	ut_params->obuf = ut_params->op->sym->m_src;
 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+	ut_params->obuf = ut_params->op->sym->m_src;
 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
 			+ plaintext_pad_len;
 
@@ -3019,8 +3024,8 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 				ut_params->op);
-	ut_params->obuf = ut_params->op->sym->m_src;
 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+	ut_params->obuf = ut_params->op->sym->m_src;
 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
 			+ plaintext_pad_len;
 
@@ -4781,8 +4786,8 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 				ut_params->op);
-	ut_params->obuf = ut_params->op->sym->m_src;
 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+	ut_params->obuf = ut_params->op->sym->m_src;
 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
 			+ plaintext_pad_len;
 
@@ -8100,13 +8105,7 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 			ut_params->op);
-	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
-	TEST_ASSERT_EQUAL(ut_params->op->status,
-			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
-			"authentication not failed");
-
-	ut_params->obuf = ut_params->op->sym->m_src;
-	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
+	TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
 
 	return 0;
 }
@@ -8161,13 +8160,7 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 			ut_params->op);
-	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
-	TEST_ASSERT_EQUAL(ut_params->op->status,
-			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
-			"authentication not failed");
-
-	ut_params->obuf = ut_params->op->sym->m_src;
-	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
+	TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
 
 	return 0;
 }
@@ -8221,14 +8214,7 @@
 
 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
 			ut_params->op);
-
-	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
-	TEST_ASSERT_EQUAL(ut_params->op->status,
-			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
-			"authentication not failed");
-
-	ut_params->obuf = ut_params->op->sym->m_src;
-	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
+	TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
 
 	return 0;
 }
diff -Nru dpdk-18.11.6/usertools/dpdk-pmdinfo.py dpdk-18.11.8/usertools/dpdk-pmdinfo.py
--- dpdk-18.11.6/usertools/dpdk-pmdinfo.py	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/usertools/dpdk-pmdinfo.py	2020-05-18 15:00:53.000000000 +0100
@@ -539,7 +539,7 @@
         return
 
     (autoload_path, scannedfile) = readelf.search_for_autoload_path()
-    if (autoload_path is None or autoload_path is ""):
+    if not autoload_path:
         if (raw_output is False):
             print("No autoload path configured in %s" % dpdk_path)
         return
diff -Nru dpdk-18.11.6/usertools/dpdk-telemetry-client.py dpdk-18.11.8/usertools/dpdk-telemetry-client.py
--- dpdk-18.11.6/usertools/dpdk-telemetry-client.py	2020-01-31 09:55:30.000000000 +0000
+++ dpdk-18.11.8/usertools/dpdk-telemetry-client.py	2020-05-18 15:00:53.000000000 +0100
@@ -2,6 +2,7 @@
 # Copyright(c) 2018 Intel Corporation
 
 from __future__ import print_function
+from __future__ import unicode_literals
 
 import socket
 import os
@@ -63,18 +64,19 @@
         self.socket.recv_fd.settimeout(2)
         self.socket.send_fd.connect("/var/run/dpdk/rte/telemetry")
         JSON = (API_REG + self.file_path + "\"}}")
-        self.socket.send_fd.sendall(JSON)
+        self.socket.send_fd.sendall(JSON.encode())
+
         self.socket.recv_fd.listen(1)
         self.socket.client_fd = self.socket.recv_fd.accept()[0]
 
     def unregister(self): # Unregister a given client
-        self.socket.client_fd.send(API_UNREG + self.file_path + "\"}}")
+        self.socket.client_fd.send((API_UNREG + self.file_path + "\"}}").encode())
         self.socket.client_fd.close()
 
     def requestMetrics(self): # Requests metrics for given client
-        self.socket.client_fd.send(METRICS_REQ)
-        data = self.socket.client_fd.recv(BUFFER_SIZE)
-        print("\nResponse: \n", str(data))
+        self.socket.client_fd.send(METRICS_REQ.encode())
+        data = self.socket.client_fd.recv(BUFFER_SIZE).decode()
+        print("\nResponse: \n", data)
 
     def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics for given client
         print("\nPlease enter the number of times you'd like to continuously request Metrics:")

Attachment: signature.asc
Description: This is a digitally signed message part


--- End Message ---
--- Begin Message ---
Package: release.debian.org
Version: 10.5

Hi,

Each of these bugs relates to an update that was included in today's
stable point release.

Regards,

Adam

--- End Message ---

Reply to: