]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: hns3: refine the process when PF set VF VLAN
authorJian Shen <shenjian15@huawei.com>
Thu, 24 Mar 2022 12:54:50 +0000 (20:54 +0800)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 27 Apr 2022 09:58:16 +0000 (11:58 +0200)
BugLink: https://bugs.launchpad.net/bugs/1969110
[ Upstream commit 190cd8a72b0181c543ecada6243be3a50636941b ]

Currently, when PF set VF VLAN, it sends notify mailbox to VF
if VF alive. VF stop its traffic, and send request mailbox
to PF, then PF updates VF VLAN. It's a bit complex. If VF is
killed before sending request, PF will not set VF VLAN without
any log.

This patch refines the process, PF can set VF VLAN direclty,
and then notify the VF. If VF is resetting at that time, the
notify may be dropped, so VF should query it after reset finished.

Fixes: 92f11ea177cd ("net: hns3: fix set port based VLAN issue for VF")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
(cherry picked from commit 2dc73ba93202960aa6f81572e3de8c53ce8a42e8)
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index 0b0b79eec1a630be05cb0d7584c9756263408609..d3a259ad8ce1d77004546dc28f9b74481062d344 100644 (file)
@@ -9290,11 +9290,16 @@ static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
 
        ether_addr_copy(vport->vf_info.mac, mac_addr);
 
+       /* there is a timewindow for PF to know VF unalive, it may
+        * cause send mailbox fail, but it doesn't matter, VF will
+        * query it when reinit.
+        */
        if (test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
                dev_info(&hdev->pdev->dev,
                         "MAC of VF %d has been set to %s, and it will be reinitialized!\n",
                         vf, format_mac_addr);
-               return hclge_inform_reset_assert_to_vf(vport);
+               (void)hclge_inform_reset_assert_to_vf(vport);
+               return 0;
        }
 
        dev_info(&hdev->pdev->dev, "MAC of VF %d has been set to %s\n",
@@ -10522,14 +10527,17 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
                return ret;
        }
 
-       /* for DEVICE_VERSION_V3, vf doesn't need to know about the port based
+       /* there is a timewindow for PF to know VF unalive, it may
+        * cause send mailbox fail, but it doesn't matter, VF will
+        * query it when reinit.
+        * for DEVICE_VERSION_V3, vf doesn't need to know about the port based
         * VLAN state.
         */
        if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3 &&
            test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state))
-               hclge_push_vf_port_base_vlan_info(&hdev->vport[0],
-                                                 vport->vport_id, state,
-                                                 &vlan_info);
+               (void)hclge_push_vf_port_base_vlan_info(&hdev->vport[0],
+                                                       vport->vport_id,
+                                                       state, &vlan_info);
 
        return 0;
 }
index 98c847fe4c5b5ee7130a316d9bf72874ef2838e0..21678c12afa26f7d88717b582decfd1c59662333 100644 (file)
@@ -3344,6 +3344,11 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
                return ret;
        }
 
+       /* get current port based vlan state from PF */
+       ret = hclgevf_get_port_base_vlan_filter_state(hdev);
+       if (ret)
+               return ret;
+
        set_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);
 
        hclgevf_init_rxd_adv_layout(hdev);