Message ID | 20250411003209.44053-2-shannon.nelson@amd.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | pds_core: updates and fixes | expand |
On Thu, Apr 10, 2025 at 05:32:05PM -0700, Shannon Nelson wrote: > From: Brett Creeley <brett.creeley@amd.com> > > 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> > Signed-off-by: Brett Creeley <brett.creeley@amd.com> > Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Simon Horman <horms@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