Commit d9e2f070d8af for kernel

commit d9e2f070d8af60f2c8c02b2ddf0a9e90b4e9220c
Author: Brett Creeley <brett.creeley@amd.com>
Date:   Mon Apr 21 10:46:03 2025 -0700

    pds_core: Prevent possible adminq overflow/stuck condition

    The pds_core's adminq is protected by the adminq_lock, which prevents
    more than 1 command to be posted onto it at any one time. This makes it
    so the client drivers cannot simultaneously post adminq commands.
    However, the completions happen in a different context, which means
    multiple adminq commands can be posted sequentially and all waiting
    on completion.

    On the FW side, the backing adminq request queue is only 16 entries
    long and the retry mechanism and/or overflow/stuck prevention is
    lacking. This can cause the adminq to get stuck, so commands are no
    longer processed and completions are no longer sent by the FW.

    As an initial fix, prevent more than 16 outstanding adminq commands so
    there's no way to cause the adminq from getting stuck. This works
    because the backing adminq request queue will never have more than 16
    pending adminq commands, so it will never overflow. This is done by
    reducing the adminq depth to 16.

    Fixes: 45d76f492938 ("pds_core: set up device and adminq")
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Signed-off-by: Brett Creeley <brett.creeley@amd.com>
    Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
    Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
    Link: https://patch.msgid.link/20250421174606.3892-2-shannon.nelson@amd.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
index 1eb0d92786f7..55163457f12b 100644
--- a/drivers/net/ethernet/amd/pds_core/core.c
+++ b/drivers/net/ethernet/amd/pds_core/core.c
@@ -325,10 +325,7 @@ static int pdsc_core_init(struct pdsc *pdsc)
 	size_t sz;
 	int err;

-	/* Scale the descriptor ring length based on number of CPUs and VFs */
-	numdescs = max_t(int, PDSC_ADMINQ_MIN_LENGTH, num_online_cpus());
-	numdescs += 2 * pci_sriov_get_totalvfs(pdsc->pdev);
-	numdescs = roundup_pow_of_two(numdescs);
+	numdescs = PDSC_ADMINQ_MAX_LENGTH;
 	err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_ADMINQ, 0, "adminq",
 			     PDS_CORE_QCQ_F_CORE | PDS_CORE_QCQ_F_INTR,
 			     numdescs,
diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h
index 0bf320c43083..199473112c29 100644
--- a/drivers/net/ethernet/amd/pds_core/core.h
+++ b/drivers/net/ethernet/amd/pds_core/core.h
@@ -16,7 +16,7 @@

 #define PDSC_WATCHDOG_SECS	5
 #define PDSC_QUEUE_NAME_MAX_SZ  16
-#define PDSC_ADMINQ_MIN_LENGTH	16	/* must be a power of two */
+#define PDSC_ADMINQ_MAX_LENGTH	16	/* must be a power of two */
 #define PDSC_NOTIFYQ_LENGTH	64	/* must be a power of two */
 #define PDSC_TEARDOWN_RECOVERY	false
 #define PDSC_TEARDOWN_REMOVING	true