From 572825df79e27a8baebcfc11d91bdb6f9776c2c7 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Mon, 15 May 2017 12:32:15 +0200 Subject: dpdk: revert dpdk 17.05 change which causes virtio issues This patch is causing DPDK to provide bad MAC address for legacy virtio interfaces. Change-Id: I526cd35a38164ede80a8ab6decb9e0d1ebfad723 Signed-off-by: Damjan Marion --- dpdk/Makefile | 2 +- ...io-tx-with-can_push-when-VERSION_1-is-set.patch | 38 ------- .../0002-ethdev-fix-MAC-address-replay.patch | 83 -------------- .../0003-enic-fix-MAC-address-add-and-remove.patch | 122 --------------------- ...t-virtio-remove-redundant-MSI-X-detection.patch | 58 ++++++++++ 5 files changed, 59 insertions(+), 244 deletions(-) delete mode 100644 dpdk/dpdk-16.11_patches/0001-virtio-tx-with-can_push-when-VERSION_1-is-set.patch delete mode 100644 dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch delete mode 100644 dpdk/dpdk-16.11_patches/0003-enic-fix-MAC-address-add-and-remove.patch create mode 100644 dpdk/dpdk-17.05_patches/0001-Revert-net-virtio-remove-redundant-MSI-X-detection.patch (limited to 'dpdk') diff --git a/dpdk/Makefile b/dpdk/Makefile index cd79e394e6e..0f75a58a271 100644 --- a/dpdk/Makefile +++ b/dpdk/Makefile @@ -26,7 +26,7 @@ DPDK_MLX5_PMD ?= n B := $(DPDK_BUILD_DIR) I := $(DPDK_INSTALL_DIR) DPDK_VERSION ?= 17.05 -PKG_SUFFIX ?= vpp1 +PKG_SUFFIX ?= vpp2 DPDK_BASE_URL ?= http://fast.dpdk.org/rel DPDK_TARBALL := dpdk-$(DPDK_VERSION).tar.xz DPDK_TAR_URL := $(DPDK_BASE_URL)/$(DPDK_TARBALL) diff --git a/dpdk/dpdk-16.11_patches/0001-virtio-tx-with-can_push-when-VERSION_1-is-set.patch b/dpdk/dpdk-16.11_patches/0001-virtio-tx-with-can_push-when-VERSION_1-is-set.patch deleted file mode 100644 index c26935684b6..00000000000 --- a/dpdk/dpdk-16.11_patches/0001-virtio-tx-with-can_push-when-VERSION_1-is-set.patch +++ /dev/null @@ -1,38 +0,0 @@ -From b002b56c0c8a1790549c23d93f3d57ffc212c6da Mon Sep 17 00:00:00 2001 -From: Pierre Pfister -Date: Tue, 8 Nov 2016 10:24:48 +0100 -Subject: [PATCH] virtio: tx with can_push when VERSION_1 is set - -Current virtio driver advertises VERSION_1 support, -but does not handle device's VERSION_1 support when -sending packets (it looks for ANY_LAYOUT feature, -which is absent). - -This patch enables 'can_push' in tx path when VERSION_1 -is advertised by the device. - -This significantly improves small packets forwarding rate -towards devices advertising VERSION_1 feature. - -Signed-off-by: Pierre Pfister ---- - drivers/net/virtio/virtio_rxtx.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c -index 22d97a4..1e5a6b9 100644 ---- a/drivers/net/virtio/virtio_rxtx.c -+++ b/drivers/net/virtio/virtio_rxtx.c -@@ -1015,7 +1015,8 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - } - - /* optimize ring usage */ -- if (vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) && -+ if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || -+ vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) && - rte_mbuf_refcnt_read(txm) == 1 && - RTE_MBUF_DIRECT(txm) && - txm->nb_segs == 1 && --- -2.7.4 (Apple Git-66) - diff --git a/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch b/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch deleted file mode 100644 index 951694ded79..00000000000 --- a/dpdk/dpdk-16.11_patches/0002-ethdev-fix-MAC-address-replay.patch +++ /dev/null @@ -1,83 +0,0 @@ -From fb7c10892b057533931553f9367acd5541a0537c Mon Sep 17 00:00:00 2001 -From: Steve Shin -Date: Mon, 30 Jan 2017 09:12:25 -0800 -Subject: [PATCH] This patch fixes a bug in replaying MAC address to the - hardware in rte_eth_dev_config_restore() routine. Added default MAC replay as - well. - -Fixes: 4bdefaade6d1 ("ethdev: VMDQ enhancements") - -Signed-off-by: Steve Shin ---- - lib/librte_ether/rte_ethdev.c | 48 ++++++++++++++++++++++++------------------- - 1 file changed, 27 insertions(+), 21 deletions(-) - -diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c -index fde8112..2c07dfe 100644 ---- a/lib/librte_ether/rte_ethdev.c -+++ b/lib/librte_ether/rte_ethdev.c -@@ -857,34 +857,40 @@ struct rte_eth_dev * - { - struct rte_eth_dev *dev; - struct rte_eth_dev_info dev_info; -- struct ether_addr addr; -+ struct ether_addr *addr; - uint16_t i; - uint32_t pool = 0; -+ uint64_t pool_mask; - - dev = &rte_eth_devices[port_id]; - - rte_eth_dev_info_get(port_id, &dev_info); - -- if (RTE_ETH_DEV_SRIOV(dev).active) -- pool = RTE_ETH_DEV_SRIOV(dev).def_vmdq_idx; -- -- /* replay MAC address configuration */ -- for (i = 0; i < dev_info.max_mac_addrs; i++) { -- addr = dev->data->mac_addrs[i]; -- -- /* skip zero address */ -- if (is_zero_ether_addr(&addr)) -- continue; -- -- /* add address to the hardware */ -- if (*dev->dev_ops->mac_addr_add && -- (dev->data->mac_pool_sel[i] & (1ULL << pool))) -- (*dev->dev_ops->mac_addr_add)(dev, &addr, i, pool); -- else { -- RTE_PMD_DEBUG_TRACE("port %d: MAC address array not supported\n", -- port_id); -- /* exit the loop but not return an error */ -- break; -+ /* replay MAC address configuration including default MAC */ -+ addr = &dev->data->mac_addrs[0]; -+ if (*dev->dev_ops->mac_addr_set != NULL) -+ (*dev->dev_ops->mac_addr_set)(dev, addr); -+ else if (*dev->dev_ops->mac_addr_add != NULL) -+ (*dev->dev_ops->mac_addr_add)(dev, addr, 0, pool); -+ -+ if (*dev->dev_ops->mac_addr_add != NULL) { -+ for (i = 1; i < dev_info.max_mac_addrs; i++) { -+ addr = &dev->data->mac_addrs[i]; -+ -+ /* skip zero address */ -+ if (is_zero_ether_addr(addr)) -+ continue; -+ -+ pool = 0; -+ pool_mask = dev->data->mac_pool_sel[i]; -+ -+ do { -+ if (pool_mask & 1ULL) -+ (*dev->dev_ops->mac_addr_add)(dev, -+ addr, i, pool); -+ pool_mask >>= 1; -+ pool++; -+ } while (pool_mask); - } - } - --- -1.9.1 - diff --git a/dpdk/dpdk-16.11_patches/0003-enic-fix-MAC-address-add-and-remove.patch b/dpdk/dpdk-16.11_patches/0003-enic-fix-MAC-address-add-and-remove.patch deleted file mode 100644 index e2965676a0a..00000000000 --- a/dpdk/dpdk-16.11_patches/0003-enic-fix-MAC-address-add-and-remove.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 0cd0ed7b0b966704236e07fc1d3bd099deb407a7 Mon Sep 17 00:00:00 2001 -From: John Daley -Date: Tue, 31 Jan 2017 12:59:23 -0800 -Subject: [PATCH] The mac_addr_add callback function was simply replacing the - primary MAC address instead of adding new ones and the mac_addr_remove - callback would only remove the primary MAC form the adapter. Fix the - functions to add or remove new address. Allow up to 64 MAC addresses per - port. - -Signed-off-by: John Daley ---- - drivers/net/enic/enic.h | 5 +++-- - drivers/net/enic/enic_ethdev.c | 6 +++--- - drivers/net/enic/enic_main.c | 21 ++++++++------------- - 3 files changed, 14 insertions(+), 18 deletions(-) - -diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h -index 865cd76..5a807d4 100644 ---- a/drivers/net/enic/enic.h -+++ b/drivers/net/enic/enic.h -@@ -60,6 +60,7 @@ - #define ENIC_RQ_MAX 16 - #define ENIC_CQ_MAX (ENIC_WQ_MAX + (ENIC_RQ_MAX / 2)) - #define ENIC_INTR_MAX (ENIC_CQ_MAX + 2) -+#define ENIC_MAX_MAC_ADDR 64 - - #define VLAN_ETH_HLEN 18 - -@@ -277,8 +278,8 @@ extern void enic_dev_stats_get(struct enic *enic, - struct rte_eth_stats *r_stats); - extern void enic_dev_stats_clear(struct enic *enic); - extern void enic_add_packet_filter(struct enic *enic); --extern void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr); --extern void enic_del_mac_address(struct enic *enic); -+void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr); -+void enic_del_mac_address(struct enic *enic, int mac_index); - extern unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq); - extern void enic_send_pkt(struct enic *enic, struct vnic_wq *wq, - struct rte_mbuf *tx_pkt, unsigned short len, -diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c -index 2b154ec..d2d04a9 100644 ---- a/drivers/net/enic/enic_ethdev.c -+++ b/drivers/net/enic/enic_ethdev.c -@@ -464,7 +464,7 @@ static void enicpmd_dev_info_get(struct rte_eth_dev *eth_dev, - device_info->max_tx_queues = enic->conf_wq_count; - device_info->min_rx_bufsize = ENIC_MIN_MTU; - device_info->max_rx_pktlen = enic->max_mtu + ETHER_HDR_LEN + 4; -- device_info->max_mac_addrs = 1; -+ device_info->max_mac_addrs = ENIC_MAX_MAC_ADDR; - device_info->rx_offload_capa = - DEV_RX_OFFLOAD_VLAN_STRIP | - DEV_RX_OFFLOAD_IPV4_CKSUM | -@@ -545,12 +545,12 @@ static void enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev, - enic_set_mac_address(enic, mac_addr->addr_bytes); - } - --static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, __rte_unused uint32_t index) -+static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index) - { - struct enic *enic = pmd_priv(eth_dev); - - ENICPMD_FUNC_TRACE(); -- enic_del_mac_address(enic); -+ enic_del_mac_address(enic, index); - } - - static int enicpmd_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) -diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c -index f0b15ac..21e8ede 100644 ---- a/drivers/net/enic/enic_main.c -+++ b/drivers/net/enic/enic_main.c -@@ -190,9 +190,12 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats) - r_stats->rx_nombuf = rte_atomic64_read(&soft_stats->rx_nombuf); - } - --void enic_del_mac_address(struct enic *enic) -+void enic_del_mac_address(struct enic *enic, int mac_index) - { -- if (vnic_dev_del_addr(enic->vdev, enic->mac_addr)) -+ struct rte_eth_dev *eth_dev = enic->rte_dev; -+ uint8_t *mac_addr = eth_dev->data->mac_addrs[mac_index].addr_bytes; -+ -+ if (vnic_dev_del_addr(enic->vdev, mac_addr)) - dev_err(enic, "del mac addr failed\n"); - } - -@@ -205,15 +208,6 @@ void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr) - return; - } - -- err = vnic_dev_del_addr(enic->vdev, enic->mac_addr); -- if (err) { -- dev_err(enic, "del mac addr failed\n"); -- return; -- } -- -- ether_addr_copy((struct ether_addr *)mac_addr, -- (struct ether_addr *)enic->mac_addr); -- - err = vnic_dev_add_addr(enic->vdev, mac_addr); - if (err) { - dev_err(enic, "add mac addr failed\n"); -@@ -1308,13 +1302,14 @@ static int enic_dev_init(struct enic *enic) - /* Get the supported filters */ - enic_fdir_info(enic); - -- eth_dev->data->mac_addrs = rte_zmalloc("enic_mac_addr", ETH_ALEN, 0); -+ eth_dev->data->mac_addrs = rte_zmalloc("enic_mac_addr", ETH_ALEN -+ * ENIC_MAX_MAC_ADDR, 0); - if (!eth_dev->data->mac_addrs) { - dev_err(enic, "mac addr storage alloc failed, aborting.\n"); - return -1; - } - ether_addr_copy((struct ether_addr *) enic->mac_addr, -- ð_dev->data->mac_addrs[0]); -+ eth_dev->data->mac_addrs); - - vnic_dev_set_reset_flag(enic->vdev, 0); - --- -1.9.1 - diff --git a/dpdk/dpdk-17.05_patches/0001-Revert-net-virtio-remove-redundant-MSI-X-detection.patch b/dpdk/dpdk-17.05_patches/0001-Revert-net-virtio-remove-redundant-MSI-X-detection.patch new file mode 100644 index 00000000000..28dc68dd5f0 --- /dev/null +++ b/dpdk/dpdk-17.05_patches/0001-Revert-net-virtio-remove-redundant-MSI-X-detection.patch @@ -0,0 +1,58 @@ +From 3a1470e031ff33ac99da33b41dae0e9082d4da78 Mon Sep 17 00:00:00 2001 +From: Damjan Marion +Date: Mon, 15 May 2017 12:27:37 +0200 +Subject: [PATCH] Revert "net/virtio: remove redundant MSI-X detection" + +This reverts commit ee1843bd89076c59e50cadbef5c935613f543765. +--- + drivers/net/virtio/virtio_pci.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c +index b7b3d6157..127f25791 100644 +--- a/drivers/net/virtio/virtio_pci.c ++++ b/drivers/net/virtio/virtio_pci.c +@@ -274,6 +274,32 @@ legacy_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) + VIRTIO_PCI_QUEUE_NOTIFY); + } + ++#ifdef RTE_EXEC_ENV_LINUXAPP ++static int ++legacy_virtio_has_msix(const struct rte_pci_addr *loc) ++{ ++ DIR *d; ++ char dirname[PATH_MAX]; ++ ++ snprintf(dirname, sizeof(dirname), ++ "%s/" PCI_PRI_FMT "/msi_irqs", pci_get_sysfs_path(), ++ loc->domain, loc->bus, loc->devid, loc->function); ++ ++ d = opendir(dirname); ++ if (d) ++ closedir(d); ++ ++ return d != NULL; ++} ++#else ++static int ++legacy_virtio_has_msix(const struct rte_pci_addr *loc __rte_unused) ++{ ++ /* nic_uio does not enable interrupts, return 0 (false). */ ++ return 0; ++} ++#endif ++ + const struct virtio_pci_ops legacy_ops = { + .read_dev_cfg = legacy_read_dev_config, + .write_dev_cfg = legacy_write_dev_config, +@@ -694,6 +720,7 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) + } + + virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; ++ hw->use_msix = legacy_virtio_has_msix(&dev->addr); + hw->modern = 0; + + return 0; +-- +2.11.0 + -- cgit 1.2.3-korg