net: hns3: add reset check for VF updating port based VLAN
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: 92f11ea177
("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>
This commit is contained in:
Родитель
a7e90ee596
Коммит
a6f7bfdc78
|
@ -3439,23 +3439,35 @@ void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state,
|
||||||
{
|
{
|
||||||
struct hnae3_handle *nic = &hdev->nic;
|
struct hnae3_handle *nic = &hdev->nic;
|
||||||
struct hclge_vf_to_pf_msg send_msg;
|
struct hclge_vf_to_pf_msg send_msg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
rtnl_lock();
|
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 */
|
/* send msg to PF and wait update port based vlan info */
|
||||||
hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
|
hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
|
||||||
HCLGE_MBX_PORT_BASE_VLAN_CFG);
|
HCLGE_MBX_PORT_BASE_VLAN_CFG);
|
||||||
memcpy(send_msg.data, port_base_vlan_info, data_size);
|
memcpy(send_msg.data, port_base_vlan_info, data_size);
|
||||||
hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
rtnl_lock();
|
|
||||||
hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);
|
hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче