]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
octeontx2-pf: Fix promisc mcam entry action
authorHariprasad Kelam <hkelam@marvell.com>
Fri, 8 Dec 2023 06:56:09 +0000 (12:26 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Dec 2023 10:06:04 +0000 (10:06 +0000)
Current implementation is such that, promisc mcam entry action
is set as multicast even when there are no trusted VFs. multicast
action causes the hardware to copy packet data, which reduces
the performance.

This patch fixes this issue by setting the promisc mcam entry action to
unicast instead of multicast when there are no trusted VFs. The same
change is made for the 'allmulti' mcam entry action.

Fixes: ffd2f89ad05c ("octeontx2-pf: Enable promisc/allmulti match MCAM entries.")
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c

index 0c17ebdda148735b0e2954778ca8cb777696cc97..a57455aebff6fc58e24c4a4da2d60d78e59f439f 100644 (file)
@@ -1650,6 +1650,21 @@ static void otx2_free_hw_resources(struct otx2_nic *pf)
        mutex_unlock(&mbox->lock);
 }
 
+static bool otx2_promisc_use_mce_list(struct otx2_nic *pfvf)
+{
+       int vf;
+
+       /* The AF driver will determine whether to allow the VF netdev or not */
+       if (is_otx2_vf(pfvf->pcifunc))
+               return true;
+
+       /* check if there are any trusted VFs associated with the PF netdev */
+       for (vf = 0; vf < pci_num_vf(pfvf->pdev); vf++)
+               if (pfvf->vf_configs[vf].trusted)
+                       return true;
+       return false;
+}
+
 static void otx2_do_set_rx_mode(struct otx2_nic *pf)
 {
        struct net_device *netdev = pf->netdev;
@@ -1682,7 +1697,8 @@ static void otx2_do_set_rx_mode(struct otx2_nic *pf)
        if (netdev->flags & (IFF_ALLMULTI | IFF_MULTICAST))
                req->mode |= NIX_RX_MODE_ALLMULTI;
 
-       req->mode |= NIX_RX_MODE_USE_MCE;
+       if (otx2_promisc_use_mce_list(pf))
+               req->mode |= NIX_RX_MODE_USE_MCE;
 
        otx2_sync_mbox_msg(&pf->mbox);
        mutex_unlock(&pf->mbox.lock);
@@ -2691,11 +2707,14 @@ static int otx2_ndo_set_vf_trust(struct net_device *netdev, int vf,
        pf->vf_configs[vf].trusted = enable;
        rc = otx2_set_vf_permissions(pf, vf, OTX2_TRUSTED_VF);
 
-       if (rc)
+       if (rc) {
                pf->vf_configs[vf].trusted = !enable;
-       else
+       } else {
                netdev_info(pf->netdev, "VF %d is %strusted\n",
                            vf, enable ? "" : "not ");
+               otx2_set_rx_mode(netdev);
+       }
+
        return rc;
 }