| From 959849037c9521d60ef54209cc5a073ac4f4a78c Mon Sep 17 00:00:00 2001 |
| From: Huazhong Tan <tanhuazhong@huawei.com> |
| Date: Sat, 6 Apr 2019 15:43:36 +0800 |
| Subject: net: hns3: fix keep_alive_timer not stop problem |
| |
| [ Upstream commit e233516e6a92baeec20aa40fa5b63be6b94f1627 ] |
| |
| When hclgevf_client_start() fails or VF driver unloaded, there is |
| nobody to disable keep_alive_timer. |
| |
| So this patch fixes them. |
| |
| Fixes: a6d818e31d08 ("net: hns3: Add vport alive state checking support") |
| Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> |
| Signed-off-by: Peng Li <lipeng321@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| index 8bc28e6f465f1..8dd7fef863f68 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| @@ -2007,9 +2007,15 @@ static int hclgevf_set_alive(struct hnae3_handle *handle, bool alive) |
| static int hclgevf_client_start(struct hnae3_handle *handle) |
| { |
| struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); |
| + int ret; |
| + |
| + ret = hclgevf_set_alive(handle, true); |
| + if (ret) |
| + return ret; |
| |
| mod_timer(&hdev->keep_alive_timer, jiffies + 2 * HZ); |
| - return hclgevf_set_alive(handle, true); |
| + |
| + return 0; |
| } |
| |
| static void hclgevf_client_stop(struct hnae3_handle *handle) |
| @@ -2051,6 +2057,10 @@ static void hclgevf_state_uninit(struct hclgevf_dev *hdev) |
| { |
| set_bit(HCLGEVF_STATE_DOWN, &hdev->state); |
| |
| + if (hdev->keep_alive_timer.function) |
| + del_timer_sync(&hdev->keep_alive_timer); |
| + if (hdev->keep_alive_task.func) |
| + cancel_work_sync(&hdev->keep_alive_task); |
| if (hdev->service_timer.function) |
| del_timer_sync(&hdev->service_timer); |
| if (hdev->service_task.func) |
| -- |
| 2.20.1 |
| |