Patch "i40e: Fix changing previously set num_queue_pairs for PFs" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    i40e: Fix changing previously set num_queue_pairs for PFs

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     i40e-fix-changing-previously-set-num_queue_pairs-for.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit cf24e165dc2c002895ba3dc216ff66bfbc62bd3d
Author: Eryk Rybak <eryk.roch.rybak@xxxxxxxxx>
Date:   Fri Apr 23 13:43:25 2021 +0200

    i40e: Fix changing previously set num_queue_pairs for PFs
    
    [ Upstream commit d2a69fefd75683004ffe87166de5635b3267ee07 ]
    
    Currently, the i40e_vsi_setup_queue_map is basing the count of queues in
    TCs on a VSI's alloc_queue_pairs member which is not changed throughout
    any user's action (for example via ethtool's set_channels callback).
    
    This implies that vsi->tc_config.tc_info[n].qcount value that is given
    to the kernel via netdev_set_tc_queue() that notifies about the count of
    queues per particular traffic class is constant even if user has changed
    the total count of queues.
    
    This in turn caused the kernel warning after setting the queue count to
    the lower value than the initial one:
    
    $ ethtool -l ens801f0
    Channel parameters for ens801f0:
    Pre-set maximums:
    RX:             0
    TX:             0
    Other:          1
    Combined:       64
    Current hardware settings:
    RX:             0
    TX:             0
    Other:          1
    Combined:       64
    
    $ ethtool -L ens801f0 combined 40
    
    [dmesg]
    Number of in use tx queues changed invalidating tc mappings. Priority
    traffic classification disabled!
    
    Reason was that vsi->alloc_queue_pairs stayed at 64 value which was used
    to set the qcount on TC0 (by default only TC0 exists so all of the
    existing queues are assigned to TC0). we update the offset/qcount via
    netdev_set_tc_queue() back to the old value but then the
    netif_set_real_num_tx_queues() is using the vsi->num_queue_pairs as a
    value which got set to 40.
    
    Fix it by using vsi->req_queue_pairs as a queue count that will be
    distributed across TCs. Do it only for non-zero values, which implies
    that user actually requested the new count of queues.
    
    For VSIs other than main, stay with the vsi->alloc_queue_pairs as we
    only allow manipulating the queue count on main VSI.
    
    Fixes: bc6d33c8d93f ("i40e: Fix the number of queues available to be mapped for use")
    Co-developed-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx>
    Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx>
    Co-developed-by: Przemyslaw Patynowski <przemyslawx.patynowski@xxxxxxxxx>
    Signed-off-by: Przemyslaw Patynowski <przemyslawx.patynowski@xxxxxxxxx>
    Signed-off-by: Eryk Rybak <eryk.roch.rybak@xxxxxxxxx>
    Tested-by: Tony Brelinski <tony.brelinski@xxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index dcad4a3191cb8..34c453c2b22da 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -1776,6 +1776,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 				     bool is_add)
 {
 	struct i40e_pf *pf = vsi->back;
+	u16 num_tc_qps = 0;
 	u16 sections = 0;
 	u8 netdev_tc = 0;
 	u16 numtc = 1;
@@ -1783,13 +1784,29 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 	u8 offset;
 	u16 qmap;
 	int i;
-	u16 num_tc_qps = 0;
 
 	sections = I40E_AQ_VSI_PROP_QUEUE_MAP_VALID;
 	offset = 0;
 
+	if (vsi->type == I40E_VSI_MAIN) {
+		/* This code helps add more queue to the VSI if we have
+		 * more cores than RSS can support, the higher cores will
+		 * be served by ATR or other filters. Furthermore, the
+		 * non-zero req_queue_pairs says that user requested a new
+		 * queue count via ethtool's set_channels, so use this
+		 * value for queues distribution across traffic classes
+		 */
+		if (vsi->req_queue_pairs > 0)
+			vsi->num_queue_pairs = vsi->req_queue_pairs;
+		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
+			vsi->num_queue_pairs = pf->num_lan_msix;
+	}
+
 	/* Number of queues per enabled TC */
-	num_tc_qps = vsi->alloc_queue_pairs;
+	if (vsi->type == I40E_VSI_MAIN)
+		num_tc_qps = vsi->num_queue_pairs;
+	else
+		num_tc_qps = vsi->alloc_queue_pairs;
 	if (enabled_tc && (vsi->back->flags & I40E_FLAG_DCB_ENABLED)) {
 		/* Find numtc from enabled TC bitmap */
 		for (i = 0, numtc = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
@@ -1867,16 +1884,10 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 		}
 		ctxt->info.tc_mapping[i] = cpu_to_le16(qmap);
 	}
-
-	/* Set actual Tx/Rx queue pairs */
-	vsi->num_queue_pairs = offset;
-	if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) {
-		if (vsi->req_queue_pairs > 0)
-			vsi->num_queue_pairs = vsi->req_queue_pairs;
-		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
-			vsi->num_queue_pairs = pf->num_lan_msix;
-	}
-
+	/* Do not change previously set num_queue_pairs for PFs */
+	if ((vsi->type == I40E_VSI_MAIN && numtc != 1) ||
+	    vsi->type != I40E_VSI_MAIN)
+		vsi->num_queue_pairs = offset;
 	/* Scheduler section valid can only be set for ADD VSI */
 	if (is_add) {
 		sections |= I40E_AQ_VSI_PROP_SCHED_VALID;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux