OSDN Git Service

net: hns3: add reset check for VF updating port based VLAN
authorJian Shen <shenjian15@huawei.com>
Tue, 28 Jul 2020 02:16:50 +0000 (10:16 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 Jul 2020 19:54:48 +0000 (12:54 -0700)
Currently hclgevf_update_port_base_vlan_info() may be called when
VF is resetting,  which may cause hns3_nic_net_open() being called
twice unexpectedly.

So fix it by adding a reset check for it, and extend critical
region for rntl_lock in hclgevf_update_port_base_vlan_info().

Fixes: 92f11ea177cd ("net: hns3: fix set port based VLAN issue for VF")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index a10b022..b8b72ac 100644 (file)
@@ -3439,23 +3439,35 @@ void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state,
 {
        struct hnae3_handle *nic = &hdev->nic;
        struct hclge_vf_to_pf_msg send_msg;
+       int ret;
 
        rtnl_lock();
-       hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);
-       rtnl_unlock();
+
+       if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) {
+               dev_warn(&hdev->pdev->dev,
+                        "is resetting when updating port based vlan info\n");
+               rtnl_unlock();
+               return;
+       }
+
+       ret = hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);
+       if (ret) {
+               rtnl_unlock();
+               return;
+       }
 
        /* send msg to PF and wait update port based vlan info */
        hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
                               HCLGE_MBX_PORT_BASE_VLAN_CFG);
        memcpy(send_msg.data, port_base_vlan_info, data_size);
-       hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
-
-       if (state == HNAE3_PORT_BASE_VLAN_DISABLE)
-               nic->port_base_vlan_state = HNAE3_PORT_BASE_VLAN_DISABLE;
-       else
-               nic->port_base_vlan_state = HNAE3_PORT_BASE_VLAN_ENABLE;
+       ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
+       if (!ret) {
+               if (state == HNAE3_PORT_BASE_VLAN_DISABLE)
+                       nic->port_base_vlan_state = state;
+               else
+                       nic->port_base_vlan_state = HNAE3_PORT_BASE_VLAN_ENABLE;
+       }
 
-       rtnl_lock();
        hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);
        rtnl_unlock();
 }