From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id BAE3B2C55 for ; Tue, 22 Jan 2019 11:14:02 +0100 (CET) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20190122101401euoutp01ef5568cc97e93e237cc9a232f18bb0ba~8JBRYhm0c2962329623euoutp01c for ; Tue, 22 Jan 2019 10:14:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20190122101401euoutp01ef5568cc97e93e237cc9a232f18bb0ba~8JBRYhm0c2962329623euoutp01c DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1548152041; bh=abf1+x9mPpKw0IXMLoJ+Y7FhCCgEIpvvJPKLT5zLBLY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sKwK71NeQqjaYAPDmDsYLB92cUqQ5SbmsNBj0lNwYWi8Oz88hhyl7rmb9jf7SyGid zFJPTcN+5msbBq2E24Uhm7oeYSTWbvb8pEfORM1Wyu8hXHRR0+54/Keq2ecp8L7mI1 l9I3/tfdL5t9Ex89jDYa9jCwWebejnT9mwpjyemg= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20190122101400eucas1p2b809485c99d74927bd7dbc6cd2e46912~8JBQsHv6f1199111991eucas1p2g; Tue, 22 Jan 2019 10:14:00 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id CB.66.04441.8ECE64C5; Tue, 22 Jan 2019 10:14:00 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20190122101400eucas1p2210f3181b9b91b4061d45111b6565ab4~8JBP-odH82949429494eucas1p2x; Tue, 22 Jan 2019 10:14:00 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20190122101359eusmtrp285081c40f4b486fec5cfddb812685953~8JBPw77vO1676816768eusmtrp2E; Tue, 22 Jan 2019 10:13:59 +0000 (GMT) X-AuditID: cbfec7f2-5c9ff70000001159-c6-5c46ece826f7 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 22.44.04128.7ECE64C5; Tue, 22 Jan 2019 10:13:59 +0000 (GMT) Received: from imaximets.rnd.samsung.ru (unknown [106.109.129.180]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20190122101359eusmtip160446dc2fa22ff3bb165afb0179753d7~8JBPLitsM1626316263eusmtip1U; Tue, 22 Jan 2019 10:13:59 +0000 (GMT) From: Ilya Maximets To: stable@dpdk.org, Yongseok Koh Cc: Qi Zhang , Wei Zhao , Anatoly Burakov , Ilya Maximets Date: Tue, 22 Jan 2019 13:13:40 +0300 Message-Id: <20190122101341.9556-2-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190122101341.9556-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrCIsWRmVeSWpSXmKPExsWy7djPc7ov3rjFGEy8rWHx6N5iZosr7T/Z LaZv6Gez+Nfxh91izdeLQLH5+5gd2Dx+LVjK6rF4z0smj2fTDzN59G1ZxRjAEsVlk5Kak1mW WqRvl8CVsX3dXdaCk8oVB5feYWlgfCDbxcjJISFgIjF/71m2LkYuDiGBFYwSUw9+Y4FwvjBK 7Fn9gB3C+cwo8XrBL1aYlqfbDzJCJJYzSiy7MRWq5QejxN+X+5hBqtgEdCROrT7CCGKLCJhJ 3Jt7hhWkiFlgFqNEc/srNpCEsECAxMa7nSwgNouAqsSWzYfZQWxeASuJS51PoNbJS6zecABs KKeAtcSjHduZQAZJCDxmk/h5fyozRJGLxKQXV6EahCVeHd/CDmHLSPzfOZ8Jwq6XuN/ykhGi uYNRYvqhf1AJe4ktr88BNXAAnacpsX6XPkTYUWLD6udsIGEJAT6JG28FQcLMQOakbdOZIcK8 Eh1tQhDVKhK/Dy6HukZK4ua7z1AXeEh8vfQcGkB9jBKbv09gnMAoPwth2QJGxlWM4qmlxbnp qcWGeanlesWJucWleel6yfm5mxiBaeH0v+OfdjB+vZR0iFGAg1GJhzfhgmuMEGtiWXFl7iFG CQ5mJRFe14tuMUK8KYmVValF+fFFpTmpxYcYpTlYlMR5qxkeRAsJpCeWpGanphakFsFkmTg4 pRoYF+6RujiNt+XuqdY9fv/Wr7rt/ffszBM/Z/9UaHZiVNyn8HOP96aJH+aG6rasW+QRXzjj 24PoPSZysnKml28Ih1p5bdqQZHtY36LKnVu/v33qgimvcg1dlf51MQaurIr+tEix5/eXZw+7 RWYr39Wcwel6JjYn5uFWi6Zt2nWPnvyT3tVjVXdMWYmlOCPRUIu5qDgRANel1x4HAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRmVeSWpSXmKPExsVy+t/xu7rP37jFGNz9ZGnx6N5iZosr7T/Z LaZv6Gez+Nfxh91izdeLQLH5+5gd2Dx+LVjK6rF4z0smj2fTDzN59G1ZxRjAEqVnU5RfWpKq kJFfXGKrFG1oYaRnaGmhZ2RiqWdobB5rZWSqpG9nk5Kak1mWWqRvl6CXsX3dXdaCk8oVB5fe YWlgfCDbxcjJISFgIvF0+0HGLkYuDiGBpYwS/38vZ4NISEn8+HWBFcIWlvhzrYsNougbo8SV 5zMZQRJsAjoSp1YfAbNFBCwk7j35ywxSxCwwj1Hi0+wfYAlhAT+JvVMawWwWAVWJLZsPs4PY vAJWEpc6n0BtkJdYveEAM4jNKWAt8WjHdiYQWwioZsLDV4wTGPkWMDKsYhRJLS3OTc8tNtIr TswtLs1L10vOz93ECAzSbcd+btnB2PUu+BCjAAejEg9vwgXXGCHWxLLiytxDjBIczEoivK4X 3WKEeFMSK6tSi/Lji0pzUosPMZoCHTWRWUo0OR8YQXkl8YamhuYWlobmxubGZhZK4rznDSqj hATSE0tSs1NTC1KLYPqYODilGhh9/GsVr2VdeN1p9e2IpH+hfdCObL3SbdpLgzf++1wUJ3Va 1+fCp1e+nBd3rVvnHpj7eN77U98sfq2dcOiqYdHb0IXzX6zZ3SnQe/vSznVmvP+UfsqZik64 +OG3pFeBENuzaud/Sq8MHSJdyraf4v+q0ux4vkJLgf/Sg0V/D6wT/rhz1dlIhsLbSizFGYmG WsxFxYkA6qWIDGgCAAA= X-CMS-MailID: 20190122101400eucas1p2210f3181b9b91b4061d45111b6565ab4 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20190122101400eucas1p2210f3181b9b91b4061d45111b6565ab4 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20190122101400eucas1p2210f3181b9b91b4061d45111b6565ab4 References: <20190122101341.9556-1-i.maximets@samsung.com> Subject: [dpdk-stable] [PATCH 17.11 1/2] net/ixgbe: fix busy polling while fiber link update X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2019 10:14:02 -0000 [ backported from upstream commit 0408f47ba4d67f0cb96f5e907bc9336b6cbff0dd ] If the multispeed fiber link is in DOWN state, ixgbe_setup_link could take around a second of busy polling. This is highly inconvenient for the case where single thread periodically checks the link statuses. For example, OVS main thread periodically updates the link statuses and hangs for a really long time busy waiting on ixgbe_setup_link() for a DOWN fiber ports. For case with 3 down ports it hangs for a 3 seconds and unable to do anything including packet processing. Fix that by shifting that workaround to a separate thread by alarm handler that will try to set up link if it is DOWN. Fixes: c12d22f65b13 ("net/ixgbe: ensure link status is updated") CC: stable@dpdk.org Signed-off-by: Ilya Maximets Reviewed-by: Qi Zhang Reviewed-by: Wei Zhao --- drivers/net/ixgbe/ixgbe_ethdev.c | 46 +++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 5f7fb0f1d..be836beeb 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -254,6 +254,8 @@ static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev, struct rte_intr_handle *handle); static void ixgbe_dev_interrupt_handler(void *param); static void ixgbe_dev_interrupt_delayed_handler(void *param); +static void ixgbe_dev_setup_link_alarm_handler(void *param); + static int ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr, uint32_t index, uint32_t pool); static void ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index); @@ -2759,6 +2761,8 @@ ixgbe_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); + rte_eal_alarm_cancel(ixgbe_dev_setup_link_alarm_handler, dev); + /* disable interrupts */ ixgbe_disable_intr(hw); @@ -3954,6 +3958,25 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, return ret_val; } +static void +ixgbe_dev_setup_link_alarm_handler(void *param) +{ + struct rte_eth_dev *dev = (struct rte_eth_dev *)param; + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ixgbe_interrupt *intr = + IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); + u32 speed; + bool autoneg = false; + + speed = hw->phy.autoneg_advertised; + if (!speed) + ixgbe_get_link_capabilities(hw, &speed, &autoneg); + + ixgbe_setup_link(hw, speed, true); + + intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG; +} + /* return 0 means link status changed, -1 means not changed */ static int ixgbe_dev_link_update_share(struct rte_eth_dev *dev, @@ -3966,9 +3989,7 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); int link_up; int diag; - u32 speed = 0; int wait = 1; - bool autoneg = false; link.link_status = ETH_LINK_DOWN; link.link_speed = 0; @@ -3979,12 +4000,11 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, hw->mac.get_link_status = true; - if ((intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) && - ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) { - speed = hw->phy.autoneg_advertised; - if (!speed) - ixgbe_get_link_capabilities(hw, &speed, &autoneg); - ixgbe_setup_link(hw, speed, true); + if (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) { + rte_ixgbe_dev_atomic_write_link_status(dev, &link); + if (link.link_status == old.link_status) + return -1; + return 0; } /* check if it needs to wait to complete, if lsc interrupt is enabled */ @@ -4007,12 +4027,16 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, if (link_up == 0) { rte_ixgbe_dev_atomic_write_link_status(dev, &link); - intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG; + if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) { + intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG; + rte_eal_alarm_set(10, + ixgbe_dev_setup_link_alarm_handler, dev); + } if (link.link_status == old.link_status) return -1; return 0; } - intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG; + link.link_status = ETH_LINK_UP; link.link_duplex = ETH_LINK_FULL_DUPLEX; @@ -5102,6 +5126,8 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); + rte_eal_alarm_cancel(ixgbe_dev_setup_link_alarm_handler, dev); + ixgbevf_intr_disable(hw); hw->adapter_stopped = 1; -- 2.17.1