Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9185999pxu; Mon, 28 Dec 2020 08:44:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJx2xh6e1TDxhy/vDY07B+wZw5gF0lLUtsm++S4xtu8i3YPGML8MiL/wo+fVPFRdRC1wA4oy X-Received: by 2002:a50:e719:: with SMTP id a25mr42792383edn.12.1609173855218; Mon, 28 Dec 2020 08:44:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609173855; cv=none; d=google.com; s=arc-20160816; b=C86iJDYJV+89aBg3OMoGFL53kX5IjCK+uvwWn3KePUcVFj0L2kkI7oL7xkB9NdwXyh V1U531egrLCfLF+Qrzf1oDEOjhoCpzBDO8JjoIz1DbGabDRhioIrLR69zTNliwz411QH +/3r+chcdji0HHX/VQuXa2O2u24kAKUjd3mZkE2lq74iv7n93Cb8xUROfHcivSjTQAOG dk/AHTtc9eZHNA3CE4RwKQM+OkumMsMdnW3+if5XmFFlrxtvnAU1mrM/vzoyoa3TR63s 3Hy7mqSkAXyBW8lBuHE2ntdsWzfewJfSbCfwyQHEeWKnMCyMajLonfogWqahAjHEGrQG ixuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=BTdTBUtwhyXp32HT+I8h4c3Moz32slnp4hn610IgsGA=; b=tzuAyXRMKY38GI37mOzw1dvxTKTQg2HmlLGVfFohDVEccGbPZbe1O+Et97XJBibagC xwLJENciot0L5NYTcwci9uob5kIEOp5uXFDRzwgyCNiSGRWI5Fqerb3MA+r3Mh9PN+3Q wnf8PxDsVixP9EBWgPBwhYf+trbEMY7EgAM5pKd/D/8pZ+bVoU4rZHw+PILaxUEZ11JN R0BDHbMpseqWZd4x37aywUsYbGs8IF/Qfipl8cTj6qhRVPTYhkHU0+nXVzoKv5v1MyH7 W5Vr00QvAA4dxVVHz9HdZwAtrCza1XhE7n3vtyZNHfWqNoQ5PIzhPw/ZpW1gpWSpXqlf K2ew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Iy+B6dQD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g12si18376008ejd.532.2020.12.28.08.43.52; Mon, 28 Dec 2020 08:44:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Iy+B6dQD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2633852AbgL1Qk4 (ORCPT + 99 others); Mon, 28 Dec 2020 11:40:56 -0500 Received: from mail.kernel.org ([198.145.29.99]:55612 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728326AbgL1M7W (ORCPT ); Mon, 28 Dec 2020 07:59:22 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 30FE822AAA; Mon, 28 Dec 2020 12:58:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609160321; bh=UxDVjRKxcEiuNupP/13AuHRi/VUNkfhOcob9XU5/5EU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Iy+B6dQDtkvGWzwjCz181zmvQaVaNFJk1nsAHhT5xmynSrc3q5jQaWIz8s4JTfaCu Of2GL0yEdtrryGsmAD8XD/KEui60sOTlQjHHmwbo6xyqw/qua9mD2GiVBp94H1zHzx qW0vuOA9wH3w0pOwGwmYzobyTz22eM/RkEilmIh0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Moshe Shemesh , Tariq Toukan , "David S. Miller" Subject: [PATCH 4.9 012/175] net/mlx4_en: Avoid scheduling restart task if it is already running Date: Mon, 28 Dec 2020 13:47:45 +0100 Message-Id: <20201228124853.851160561@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124853.216621466@linuxfoundation.org> References: <20201228124853.216621466@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Moshe Shemesh [ Upstream commit fed91613c9dd455dd154b22fa8e11b8526466082 ] Add restarting state flag to avoid scheduling another restart task while such task is already running. Change task name from watchdog_task to restart_task to better fit the task role. Fixes: 1e338db56e5a ("mlx4_en: Fix a race at restart task") Signed-off-by: Moshe Shemesh Signed-off-by: Tariq Toukan Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 20 +++++++++++++------- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 7 ++++++- 2 files changed, 19 insertions(+), 8 deletions(-) --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -1311,8 +1311,10 @@ static void mlx4_en_tx_timeout(struct ne } priv->port_stats.tx_timeout++; - en_dbg(DRV, priv, "Scheduling watchdog\n"); - queue_work(mdev->workqueue, &priv->watchdog_task); + if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state)) { + en_dbg(DRV, priv, "Scheduling port restart\n"); + queue_work(mdev->workqueue, &priv->restart_task); + } } @@ -1746,6 +1748,7 @@ int mlx4_en_start_port(struct net_device local_bh_enable(); } + clear_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state); netif_tx_start_all_queues(dev); netif_device_attach(dev); @@ -1900,7 +1903,7 @@ void mlx4_en_stop_port(struct net_device static void mlx4_en_restart(struct work_struct *work) { struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, - watchdog_task); + restart_task); struct mlx4_en_dev *mdev = priv->mdev; struct net_device *dev = priv->dev; @@ -2220,7 +2223,7 @@ static int mlx4_en_change_mtu(struct net if (netif_running(dev)) { mutex_lock(&mdev->state_lock); if (!mdev->device_up) { - /* NIC is probably restarting - let watchdog task reset + /* NIC is probably restarting - let restart task reset * the port */ en_dbg(DRV, priv, "Change MTU called with card down!?\n"); } else { @@ -2229,7 +2232,9 @@ static int mlx4_en_change_mtu(struct net if (err) { en_err(priv, "Failed restarting port:%d\n", priv->port); - queue_work(mdev->workqueue, &priv->watchdog_task); + if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, + &priv->state)) + queue_work(mdev->workqueue, &priv->restart_task); } } mutex_unlock(&mdev->state_lock); @@ -2701,7 +2706,8 @@ static int mlx4_xdp_set(struct net_devic if (err) { en_err(priv, "Failed starting port %d for XDP change\n", priv->port); - queue_work(mdev->workqueue, &priv->watchdog_task); + if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state)) + queue_work(mdev->workqueue, &priv->restart_task); } } @@ -3080,7 +3086,7 @@ int mlx4_en_init_netdev(struct mlx4_en_d priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev); spin_lock_init(&priv->stats_lock); INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode); - INIT_WORK(&priv->watchdog_task, mlx4_en_restart); + INIT_WORK(&priv->restart_task, mlx4_en_restart); INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate); INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats); INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task); --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h @@ -522,6 +522,10 @@ struct mlx4_en_stats_bitmap { struct mutex mutex; /* for mutual access to stats bitmap */ }; +enum { + MLX4_EN_STATE_FLAG_RESTARTING, +}; + struct mlx4_en_priv { struct mlx4_en_dev *mdev; struct mlx4_en_port_profile *prof; @@ -586,7 +590,7 @@ struct mlx4_en_priv { struct mlx4_en_cq *rx_cq[MAX_RX_RINGS]; struct mlx4_qp drop_qp; struct work_struct rx_mode_task; - struct work_struct watchdog_task; + struct work_struct restart_task; struct work_struct linkstate_task; struct delayed_work stats_task; struct delayed_work service_task; @@ -632,6 +636,7 @@ struct mlx4_en_priv { u32 pflags; u8 rss_key[MLX4_EN_RSS_KEY_SIZE]; u8 rss_hash_fn; + unsigned long state; }; enum mlx4_en_wol {