]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qed: Prevent over-usage of vlan credits by PF
authorYuval Mintz <Yuval.Mintz@qlogic.com>
Wed, 27 Jul 2016 11:45:24 +0000 (14:45 +0300)
committerChuck Anderson <chuck.anderson@oracle.com>
Mon, 6 Mar 2017 04:59:26 +0000 (20:59 -0800)
Orabug: 25477939

Each PF/VF has a limited number of vlan filters for
configuration purposes; This information is passed to qede
and is used to prevent over-usage - once a vlan is to be
configured and no filter credit is available, the driver
would switch into working in vlan-promisc mode.

Problem is the credit pool is shared by both PFs and VFs,
and currently PFs aren't deducting the filters that are
reserved for their VFs from their quota, which may lead
to some vlan filters failing unknowingly due to lack of credit.

Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 25eb8d46e4a0ad7aea11e73e47c20c0e400e57f1)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/qlogic/qed/qed_l2.c

index 6ccf32795ea7badfa3aab942013e643e4d704228..401e738543b5080a0fe1f394c19f18728c533c59 100644 (file)
@@ -1664,6 +1664,8 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
        info->num_tc = 1;
 
        if (IS_PF(cdev)) {
+               int max_vf_vlan_filters = 0;
+
                if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
                        for_each_hwfn(cdev, i)
                            info->num_queues +=
@@ -1676,7 +1678,12 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
                        info->num_queues = cdev->num_hwfns;
                }
 
-               info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN);
+               if (IS_QED_SRIOV(cdev))
+                       max_vf_vlan_filters = cdev->p_iov_info->total_vfs *
+                                             QED_ETH_VF_NUM_VLAN_FILTERS;
+               info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN) -
+                                        max_vf_vlan_filters;
+
                ether_addr_copy(info->port_mac,
                                cdev->hwfns[0].hw_info.hw_mac_addr);
        } else {