bnxt_en: Reserve resources for RFS.
authorMichael Chan <michael.chan@broadcom.com>
Wed, 17 Jan 2018 08:21:10 +0000 (03:21 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Jan 2018 19:48:26 +0000 (14:48 -0500)
In bnxt_rfs_capable(), add call to reserve vnic resources to support
NTUPLE.  Return true if we can successfully reserve enough vnics.
Otherwise, reserve the minimum 1 VNIC for normal operations not
supporting NTUPLE and return false.

Also, suppress warning message about not enough resources for NTUPLE when
only 1 RX ring is in use.  NTUPLE filters by definition require multiple
RX rings.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 6fc324f..8b74e6e 100644 (file)
@@ -7064,13 +7064,26 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
        if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
                max_rss_ctxs = max_vnics;
        if (vnics > max_vnics || vnics > max_rss_ctxs) {
-               netdev_warn(bp->dev,
-                           "Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
-                           min(max_rss_ctxs - 1, max_vnics - 1));
+               if (bp->rx_nr_rings > 1)
+                       netdev_warn(bp->dev,
+                                   "Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
+                                   min(max_rss_ctxs - 1, max_vnics - 1));
                return false;
        }
 
-       return true;
+       if (!(bp->flags & BNXT_FLAG_NEW_RM))
+               return true;
+
+       if (vnics == bp->hw_resc.resv_vnics)
+               return true;
+
+       bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, vnics);
+       if (vnics <= bp->hw_resc.resv_vnics)
+               return true;
+
+       netdev_warn(bp->dev, "Unable to reserve resources to support NTUPLE filters.\n");
+       bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, 1);
+       return false;
 #else
        return false;
 #endif