| From a273b8b3206adb3c9f1c1f394a65f471fb71d9ca Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 19 Oct 2021 22:16:34 +0800 |
| Subject: net: hns3: fix vf reset workqueue cannot exit |
| |
| From: Yufeng Mo <moyufeng@huawei.com> |
| |
| [ 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 | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| index 22cf66004dfa..b8414f684e89 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| @@ -2271,9 +2271,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)) { |
| -- |
| 2.33.0 |
| |