]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
net: hns3: fix vf reset workqueue cannot exit
authorYufeng Mo <moyufeng@huawei.com>
Tue, 19 Oct 2021 14:16:34 +0000 (22:16 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Oct 2021 07:56:49 +0000 (09:56 +0200)
[ Upstream commit 1385cc81baeb3bd8cbbbcdc1557f038ac1712529 ]

The task of VF reset is performed through the workqueue. It checks the
value of hdev->reset_pending to determine whether to exit the loop.
However, the value of hdev->reset_pending may also be assigned by
the interrupt function hclgevf_misc_irq_handle(), which may cause the
loop fail to exit and keep occupying the workqueue. This loop is not
necessary, so remove it and the workqueue will be rescheduled if the
reset needs to be retried or a new reset occurs.

Fixes: 1cc9bc6e5867 ("net: hns3: split hclgevf_reset() into preparing and rebuilding part")
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index 3641d7c31451c2c25c24efbed37af6fd7da4533f..a47f23f27a11cd0cb75a2bb1a347ceb682be48e3 100644 (file)
@@ -2160,9 +2160,9 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
                hdev->reset_attempts = 0;
 
                hdev->last_reset_time = jiffies;
-               while ((hdev->reset_type =
-                       hclgevf_get_reset_level(hdev, &hdev->reset_pending))
-                      != HNAE3_NONE_RESET)
+               hdev->reset_type =
+                       hclgevf_get_reset_level(hdev, &hdev->reset_pending);
+               if (hdev->reset_type != HNAE3_NONE_RESET)
                        hclgevf_reset(hdev);
        } else if (test_and_clear_bit(HCLGEVF_RESET_REQUESTED,
                                      &hdev->reset_state)) {