From 7366234eb50930c97519924db69e3bb8f6c297c4 Mon Sep 17 00:00:00 2001 From: liweihang Date: Tue, 11 Jun 2019 10:47:01 +0800 Subject: [PATCH] net: hns3: add exception handling when enable NIC/Roce hw error interrupts driver inclusion category: bugfix bugzilla: NA CVE: NA If we failed to enable NIC/Roce hw error interrupts during client initialization in some cases, we should do exception handling to clear flags and free the resources. Feature or Bugfix: Bugfix Signed-off-by: liweihang Reviewed-by: lipeng Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- .../hisilicon/hns3/hns3pf/hclge_main.c | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 69c58d7ea0c0..115854c8667b 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -8442,25 +8442,30 @@ static int hclge_init_nic_client_instance(struct hnae3_ae_dev *ae_dev, set_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state); if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || rst_cnt != hdev->rst_stats.reset_cnt) { - clear_bit(HCLGE_STATE_NIC_REGISTERED, - &hdev->state); - - client->ops->uninit_instance(&vport->nic, 0); - return -EBUSY; + ret = -EBUSY; + goto init_nic_err; } - hnae3_set_client_init_flag(client, ae_dev, 1); - /* Enable nic hw error interrupts */ ret = hclge_config_nic_hw_error(hdev, true); - if (ret) + if (ret) { dev_err(&ae_dev->pdev->dev, "fail(%d) to enable hw error interrupts\n", ret); + goto init_nic_err; + } + + hnae3_set_client_init_flag(client, ae_dev, 1); if (netif_msg_drv(&hdev->vport->nic)) hclge_info_show(hdev); return ret; + +init_nic_err: + clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state); + client->ops->uninit_instance(&vport->nic, 0); + + return ret; } static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev, @@ -8486,24 +8491,27 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev, set_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || rst_cnt != hdev->rst_stats.reset_cnt) { - clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); + ret = -EBUSY; goto init_roce_err; } - hnae3_set_client_init_flag(client, ae_dev, 1); - /* Enable roce ras interrupts */ ret = hclge_config_rocee_ras_interrupt(hdev, true); - if (ret) + if (ret) { dev_err(&ae_dev->pdev->dev, "fail(%d) to enable roce ras interrupts\n", ret); + goto init_roce_err; + } + + hnae3_set_client_init_flag(client, ae_dev, 1); return ret; init_roce_err: + clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); hdev->roce_client->ops->uninit_instance(&vport->roce, 0); - return -EBUSY; + return ret; } static int hclge_init_client_instance(struct hnae3_client *client, -- GitLab