Commit 8565d804 authored by Jie Wang's avatar Jie Wang Committed by Hao Chen
Browse files

net: hns3: fix a deadlock problem when config TC during resetting

maillist inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAN3KC
CVE: NA

Reference: https://patchwork.kernel.org/project/netdevbpf/patch/20240813141024.1707252-4-shaojijie@huawei.com/



----------------------------------------------------------------------

When config TC during the reset process, may cause a deadlock, the flow is
as below:
                             pf reset start
                                 │
                                 ▼
                              ......
setup tc                         │
    │                            ▼
    ▼                      DOWN: napi_disable()
napi_disable()(skip)             │
    │                            │
    ▼                            ▼
  ......                      ......
    │                            │
    ▼                            │
napi_enable()                    │
                                 ▼
                           UINIT: netif_napi_del()
                                 │
                                 ▼
                              ......
                                 │
                                 ▼
                           INIT: netif_napi_add()
                                 │
                                 ▼
                              ......                 global reset start
                                 │                      │
                                 ▼                      ▼
                           UP: napi_enable()(skip)    ......
                                 │                      │
                                 ▼                      ▼
                              ......                 napi_disable()

In reset process, the driver will DOWN the port and then UINIT, in this
case, the setup tc process will UP the port before UINIT, so cause the
problem. Adds a DOWN process in UINIT to fix it.

Fixes: bb6b94a8 ("net: hns3: Add reset interface implementation in client")
Signed-off-by: default avatarJie Wang <wangjie125@huawei.com>
Signed-off-by: default avatarJijie Shao <shaojijie@huawei.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 3302f7f9
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -6226,6 +6226,9 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
	struct net_device *netdev = handle->kinfo.netdev;
	struct hns3_nic_priv *priv = netdev_priv(netdev);

	if (!test_bit(HNS3_NIC_STATE_DOWN, &priv->state))
		hns3_nic_net_stop(netdev);

	if (!test_and_clear_bit(HNS3_NIC_STATE_INITED, &priv->state)) {
		netdev_warn(netdev, "already uninitialized\n");
		return 0;