Patch "ice: Fix increasing MSI-X on VF" has been added to the 6.11-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

    ice: Fix increasing MSI-X on VF

to the 6.11-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:
     ice-fix-increasing-msi-x-on-vf.patch
and it can be found in the queue-6.11 subdirectory.

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



commit 3a7ef8b9fbce1bc68a6135a05560fa800f9153e1
Author: Marcin Szycik <marcin.szycik@xxxxxxxxxxxxxxx>
Date:   Fri Sep 27 17:15:40 2024 +0200

    ice: Fix increasing MSI-X on VF
    
    [ Upstream commit bce9af1b030bf59d51bbabf909a3ef164787e44e ]
    
    Increasing MSI-X value on a VF leads to invalid memory operations. This
    is caused by not reallocating some arrays.
    
    Reproducer:
      modprobe ice
      echo 0 > /sys/bus/pci/devices/$PF_PCI/sriov_drivers_autoprobe
      echo 1 > /sys/bus/pci/devices/$PF_PCI/sriov_numvfs
      echo 17 > /sys/bus/pci/devices/$VF0_PCI/sriov_vf_msix_count
    
    Default MSI-X is 16, so 17 and above triggers this issue.
    
    KASAN reports:
    
      BUG: KASAN: slab-out-of-bounds in ice_vsi_alloc_ring_stats+0x38d/0x4b0 [ice]
      Read of size 8 at addr ffff8888b937d180 by task bash/28433
      (...)
    
      Call Trace:
       (...)
       ? ice_vsi_alloc_ring_stats+0x38d/0x4b0 [ice]
       kasan_report+0xed/0x120
       ? ice_vsi_alloc_ring_stats+0x38d/0x4b0 [ice]
       ice_vsi_alloc_ring_stats+0x38d/0x4b0 [ice]
       ice_vsi_cfg_def+0x3360/0x4770 [ice]
       ? mutex_unlock+0x83/0xd0
       ? __pfx_ice_vsi_cfg_def+0x10/0x10 [ice]
       ? __pfx_ice_remove_vsi_lkup_fltr+0x10/0x10 [ice]
       ice_vsi_cfg+0x7f/0x3b0 [ice]
       ice_vf_reconfig_vsi+0x114/0x210 [ice]
       ice_sriov_set_msix_vec_count+0x3d0/0x960 [ice]
       sriov_vf_msix_count_store+0x21c/0x300
       (...)
    
      Allocated by task 28201:
       (...)
       ice_vsi_cfg_def+0x1c8e/0x4770 [ice]
       ice_vsi_cfg+0x7f/0x3b0 [ice]
       ice_vsi_setup+0x179/0xa30 [ice]
       ice_sriov_configure+0xcaa/0x1520 [ice]
       sriov_numvfs_store+0x212/0x390
       (...)
    
    To fix it, use ice_vsi_rebuild() instead of ice_vf_reconfig_vsi(). This
    causes the required arrays to be reallocated taking the new queue count
    into account (ice_vsi_realloc_stat_arrays()). Set req_txq and req_rxq
    before ice_vsi_rebuild(), so that realloc uses the newly set queue
    count.
    
    Additionally, ice_vsi_rebuild() does not remove VSI filters
    (ice_fltr_remove_all()), so ice_vf_init_host_cfg() is no longer
    necessary.
    
    Reported-by: Jacob Keller <jacob.e.keller@xxxxxxxxx>
    Fixes: 2a2cb4c6c181 ("ice: replace ice_vf_recreate_vsi() with ice_vf_reconfig_vsi()")
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@xxxxxxxxxxxxxxx>
    Signed-off-by: Marcin Szycik <marcin.szycik@xxxxxxxxxxxxxxx>
    Reviewed-by: Simon Horman <horms@xxxxxxxxxx>
    Tested-by: Rafal Romanowski <rafal.romanowski@xxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c
index 55ef33208456a..78ca6ddc3d03f 100644
--- a/drivers/net/ethernet/intel/ice/ice_sriov.c
+++ b/drivers/net/ethernet/intel/ice/ice_sriov.c
@@ -1119,7 +1119,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
 	if (vf->first_vector_idx < 0)
 		goto unroll;
 
-	if (ice_vf_reconfig_vsi(vf) || ice_vf_init_host_cfg(vf, vsi)) {
+	vsi->req_txq = queues;
+	vsi->req_rxq = queues;
+
+	if (ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT)) {
 		/* Try to rebuild with previous values */
 		needs_rebuild = true;
 		goto unroll;
@@ -1146,8 +1149,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
 		return -EINVAL;
 
 	if (needs_rebuild) {
-		ice_vf_reconfig_vsi(vf);
-		ice_vf_init_host_cfg(vf, vsi);
+		vsi->req_txq = prev_queues;
+		vsi->req_rxq = prev_queues;
+
+		ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT);
 	}
 
 	ice_ena_vf_mappings(vf);
diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.c b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
index 9fe2a309c5ffa..f8fbd49e23105 100644
--- a/drivers/net/ethernet/intel/ice/ice_vf_lib.c
+++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
@@ -256,7 +256,7 @@ static void ice_vf_pre_vsi_rebuild(struct ice_vf *vf)
  *
  * It brings the VSI down and then reconfigures it with the hardware.
  */
-int ice_vf_reconfig_vsi(struct ice_vf *vf)
+static int ice_vf_reconfig_vsi(struct ice_vf *vf)
 {
 	struct ice_vsi *vsi = ice_get_vf_vsi(vf);
 	struct ice_pf *pf = vf->pf;
diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib_private.h b/drivers/net/ethernet/intel/ice/ice_vf_lib_private.h
index 91ba7fe0eaee1..0c7e77c0a09fa 100644
--- a/drivers/net/ethernet/intel/ice/ice_vf_lib_private.h
+++ b/drivers/net/ethernet/intel/ice/ice_vf_lib_private.h
@@ -23,7 +23,6 @@
 #warning "Only include ice_vf_lib_private.h in CONFIG_PCI_IOV virtualization files"
 #endif
 
-int ice_vf_reconfig_vsi(struct ice_vf *vf);
 void ice_initialize_vf_entry(struct ice_vf *vf);
 void ice_dis_vf_qs(struct ice_vf *vf);
 int ice_check_vf_init(struct ice_vf *vf);




[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