Skip to content

Commit 35d92ab

Browse files
liuyonglong86Paolo Abeni
authored andcommitted
net: hns3: fix kernel crash when devlink reload during initialization
The devlink reload process will access the hardware resources, but the register operation is done before the hardware is initialized. So, processing the devlink reload during initialization may lead to kernel crash. This patch fixes this by registering the devlink after hardware initialization. Fixes: cd62429 ("net: hns3: add support for registering devlink for VF") Fixes: 93305b7 ("net: hns3: fix kernel crash when devlink reload during pf initialization") Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> Signed-off-by: Jijie Shao <shaojijie@huawei.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent f5db7a3 commit 35d92ab

File tree

2 files changed

+9
-18
lines changed

2 files changed

+9
-18
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11631,16 +11631,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1163111631
if (ret)
1163211632
goto out;
1163311633

11634-
ret = hclge_devlink_init(hdev);
11635-
if (ret)
11636-
goto err_pci_uninit;
11637-
11638-
devl_lock(hdev->devlink);
11639-
1164011634
/* Firmware command queue initialize */
1164111635
ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
1164211636
if (ret)
11643-
goto err_devlink_uninit;
11637+
goto err_pci_uninit;
1164411638

1164511639
/* Firmware command initialize */
1164611640
ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version,
@@ -11808,15 +11802,17 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1180811802
dev_warn(&pdev->dev,
1180911803
"failed to wake on lan init, ret = %d\n", ret);
1181011804

11805+
ret = hclge_devlink_init(hdev);
11806+
if (ret)
11807+
goto err_ptp_uninit;
11808+
1181111809
hclge_state_init(hdev);
1181211810
hdev->last_reset_time = jiffies;
1181311811

1181411812
dev_info(&hdev->pdev->dev, "%s driver initialization finished.\n",
1181511813
HCLGE_DRIVER_NAME);
1181611814

1181711815
hclge_task_schedule(hdev, round_jiffies_relative(HZ));
11818-
11819-
devl_unlock(hdev->devlink);
1182011816
return 0;
1182111817

1182211818
err_ptp_uninit:
@@ -11830,9 +11826,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1183011826
pci_free_irq_vectors(pdev);
1183111827
err_cmd_uninit:
1183211828
hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
11833-
err_devlink_uninit:
11834-
devl_unlock(hdev->devlink);
11835-
hclge_devlink_uninit(hdev);
1183611829
err_pci_uninit:
1183711830
pcim_iounmap(pdev, hdev->hw.hw.io_base);
1183811831
pci_release_regions(pdev);

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2845,10 +2845,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
28452845
if (ret)
28462846
return ret;
28472847

2848-
ret = hclgevf_devlink_init(hdev);
2849-
if (ret)
2850-
goto err_devlink_init;
2851-
28522848
ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
28532849
if (ret)
28542850
goto err_cmd_queue_init;
@@ -2941,6 +2937,10 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
29412937

29422938
hclgevf_init_rxd_adv_layout(hdev);
29432939

2940+
ret = hclgevf_devlink_init(hdev);
2941+
if (ret)
2942+
goto err_config;
2943+
29442944
set_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state);
29452945

29462946
hdev->last_reset_time = jiffies;
@@ -2960,8 +2960,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
29602960
err_cmd_init:
29612961
hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
29622962
err_cmd_queue_init:
2963-
hclgevf_devlink_uninit(hdev);
2964-
err_devlink_init:
29652963
hclgevf_pci_uninit(hdev);
29662964
clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);
29672965
return ret;

0 commit comments

Comments
 (0)