ice: Change ice_vsi_setup_q_map() to not depend on RSS
authorBrett Creeley <brett.creeley@intel.com>
Tue, 2 Mar 2021 18:15:33 +0000 (10:15 -0800)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Wed, 31 Mar 2021 21:21:28 +0000 (14:21 -0700)
Currently, ice_vsi_setup_q_map() depends on the VSI's rss_size. However,
the Rx Queue Mapping section of the VSI context has no dependency on RSS.
Instead, limit the maximum number of Rx queues per TC based on the Rx
Queue mapping section of the VSI context, which currently allows for up
to 256 Rx queues per TC.

Signed-off-by: Brett Creeley <brett.creeley@intel.com>
Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_lib.c

index 9bf3461..ecbf62e 100644 (file)
@@ -89,6 +89,7 @@
 #define ICE_INVAL_Q_INDEX      0xffff
 #define ICE_INVAL_VFID         256
 
+#define ICE_MAX_RXQS_PER_TC            256     /* Used when setting VSI context per TC Rx queues */
 #define ICE_MAX_RESET_WAIT             20
 
 #define ICE_VSIQF_HKEY_ARRAY_SIZE      ((VSIQF_HKEY_MAX_INDEX + 1) *   4)
index 0763696..f2cf914 100644 (file)
@@ -742,11 +742,10 @@ static void ice_set_dflt_vsi_ctx(struct ice_vsi_ctx *ctxt)
  */
 static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
 {
-       u16 offset = 0, qmap = 0, tx_count = 0;
+       u16 offset = 0, qmap = 0, tx_count = 0, pow = 0;
+       u16 num_txq_per_tc, num_rxq_per_tc;
        u16 qcount_tx = vsi->alloc_txq;
        u16 qcount_rx = vsi->alloc_rxq;
-       u16 tx_numq_tc, rx_numq_tc;
-       u16 pow = 0, max_rss = 0;
        bool ena_tc0 = false;
        u8 netdev_tc = 0;
        int i;
@@ -764,12 +763,15 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
                vsi->tc_cfg.ena_tc |= 1;
        }
 
-       rx_numq_tc = qcount_rx / vsi->tc_cfg.numtc;
-       if (!rx_numq_tc)
-               rx_numq_tc = 1;
-       tx_numq_tc = qcount_tx / vsi->tc_cfg.numtc;
-       if (!tx_numq_tc)
-               tx_numq_tc = 1;
+       num_rxq_per_tc = min_t(u16, qcount_rx / vsi->tc_cfg.numtc, ICE_MAX_RXQS_PER_TC);
+       if (!num_rxq_per_tc)
+               num_rxq_per_tc = 1;
+       num_txq_per_tc = qcount_tx / vsi->tc_cfg.numtc;
+       if (!num_txq_per_tc)
+               num_txq_per_tc = 1;
+
+       /* find the (rounded up) power-of-2 of qcount */
+       pow = (u16)order_base_2(num_rxq_per_tc);
 
        /* TC mapping is a function of the number of Rx queues assigned to the
         * VSI for each traffic class and the offset of these queues.
@@ -782,26 +784,6 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
         *
         * Setup number and offset of Rx queues for all TCs for the VSI
         */
-
-       qcount_rx = rx_numq_tc;
-
-       /* qcount will change if RSS is enabled */
-       if (test_bit(ICE_FLAG_RSS_ENA, vsi->back->flags)) {
-               if (vsi->type == ICE_VSI_PF || vsi->type == ICE_VSI_VF) {
-                       if (vsi->type == ICE_VSI_PF)
-                               max_rss = ICE_MAX_LG_RSS_QS;
-                       else
-                               max_rss = ICE_MAX_RSS_QS_PER_VF;
-                       qcount_rx = min_t(u16, rx_numq_tc, max_rss);
-                       if (!vsi->req_rxq)
-                               qcount_rx = min_t(u16, qcount_rx,
-                                                 vsi->rss_size);
-               }
-       }
-
-       /* find the (rounded up) power-of-2 of qcount */
-       pow = (u16)order_base_2(qcount_rx);
-
        ice_for_each_traffic_class(i) {
                if (!(vsi->tc_cfg.ena_tc & BIT(i))) {
                        /* TC is not enabled */
@@ -815,16 +797,16 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
 
                /* TC is enabled */
                vsi->tc_cfg.tc_info[i].qoffset = offset;
-               vsi->tc_cfg.tc_info[i].qcount_rx = qcount_rx;
-               vsi->tc_cfg.tc_info[i].qcount_tx = tx_numq_tc;
+               vsi->tc_cfg.tc_info[i].qcount_rx = num_rxq_per_tc;
+               vsi->tc_cfg.tc_info[i].qcount_tx = num_txq_per_tc;
                vsi->tc_cfg.tc_info[i].netdev_tc = netdev_tc++;
 
                qmap = ((offset << ICE_AQ_VSI_TC_Q_OFFSET_S) &
                        ICE_AQ_VSI_TC_Q_OFFSET_M) |
                        ((pow << ICE_AQ_VSI_TC_Q_NUM_S) &
                         ICE_AQ_VSI_TC_Q_NUM_M);
-               offset += qcount_rx;
-               tx_count += tx_numq_tc;
+               offset += num_rxq_per_tc;
+               tx_count += num_txq_per_tc;
                ctxt->info.tc_mapping[i] = cpu_to_le16(qmap);
        }
 
@@ -837,7 +819,7 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
        if (offset)
                vsi->num_rxq = offset;
        else
-               vsi->num_rxq = qcount_rx;
+               vsi->num_rxq = num_rxq_per_tc;
 
        vsi->num_txq = tx_count;