* [PATCH net v3 1/3] pds_core: fix cmd_regs access racing BAR unmap on reset
2026-09-01 4:42 [PATCH net v3 0/3] pds_core: fixes for the PCI reset path Nikhil P. Rao
@ 2026-09-01 4:42 ` Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 2/3] pds_core: don't release PCI regions for VFs " Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 3/3] pds_core: check info_regs in the identity debugfs reader Nikhil P. Rao
2 siblings, 0 replies; 4+ messages in thread
From: Nikhil P. Rao @ 2026-09-01 4:42 UTC (permalink / raw)
To: netdev
Cc: kuba, pabeni, brett.creeley, eric.joyner, andrew+netdev, davem,
edumazet, Nikhil P. Rao
pdsc_reset_prepare() and pdsc_reset_done()'s pdsc_map_bars() error path
clear/iounmap cmd_regs without devcmd_lock, and
pdsc_legacy_firmware_update()'s download loop derefs cmd_regs after
dropping and retaking the lock without re-checking. An FLR concurrent
with a devlink flash can unmap cmd_regs under an in-flight devcmd,
causing a NULL deref or a write to unmapped MMIO.
Take devcmd_lock across the BAR unmap/remap, and re-check cmd_regs in
the download loop. Only the PF maps cmd_regs and runs devcmd, so skip
the unmap on a VF, as pdsc_remove() and pdsc_reset_done() already do.
A reset that completes entirely within the unlocked window is not a
correctness problem for the image: the device clears its update session,
so a resumed download is rejected, and it verifies the staged image
before writing a flash slot, reporting PDS_RC_BAD_FW rather than
activating it.
pdsc_unmap_bars() also clears info_regs, intr_status and intr_ctrl. The
interrupt and start/stop readers of those are quiesced before the unmap
by pdsc_fw_down(), which frees the interrupts and tears down the queues.
The debugfs readers are not, since those files outlive a reset; that is
pre-existing and out of scope here.
Fixes: e96094c1d11c ("pds_core: Clear BARs on reset")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260708212222.296202-1-nikhil.rao%40amd.com?part=3
Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Nikhil P. Rao <nikhil.rao@amd.com>
---
drivers/net/ethernet/amd/pds_core/fw.c | 10 +++++++++-
drivers/net/ethernet/amd/pds_core/main.c | 8 +++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c
index 5ccf017f6af4..19899bf38d40 100644
--- a/drivers/net/ethernet/amd/pds_core/fw.c
+++ b/drivers/net/ethernet/amd/pds_core/fw.c
@@ -171,8 +171,10 @@ pdsc_legacy_firmware_update(struct pdsc *pdsc,
dev_info(pdsc->dev, "Installing firmware\n");
- if (!pdsc->cmd_regs)
+ if (!pdsc->cmd_regs) {
+ NL_SET_ERR_MSG_MOD(extack, "BARs not mapped");
return -ENXIO;
+ }
dl = priv_to_devlink(pdsc);
devlink_flash_update_status_notify(dl, "Preparing to flash",
@@ -198,6 +200,12 @@ pdsc_legacy_firmware_update(struct pdsc *pdsc,
copy_sz = min_t(unsigned int, buf_sz, fw->size - offset);
mutex_lock(&pdsc->devcmd_lock);
+ if (!pdsc->cmd_regs) {
+ mutex_unlock(&pdsc->devcmd_lock);
+ err = -ENXIO;
+ NL_SET_ERR_MSG_MOD(extack, "Device reset during flash");
+ goto err_out;
+ }
memcpy_toio(&pdsc->cmd_regs->data, fw->data + offset, copy_sz);
err = pdsc_devcmd_fw_download_locked(pdsc, data_addr,
offset, copy_sz);
diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
index bb79e7476370..6e1079f9ba0f 100644
--- a/drivers/net/ethernet/amd/pds_core/main.c
+++ b/drivers/net/ethernet/amd/pds_core/main.c
@@ -513,7 +513,11 @@ static void pdsc_reset_prepare(struct pci_dev *pdev)
pdsc_auxbus_dev_del(pdsc, pdsc, &pdsc->padev);
}
- pdsc_unmap_bars(pdsc);
+ if (!pdev->is_virtfn) {
+ mutex_lock(&pdsc->devcmd_lock);
+ pdsc_unmap_bars(pdsc);
+ mutex_unlock(&pdsc->devcmd_lock);
+ }
pci_release_regions(pdev);
if (pci_is_enabled(pdev))
pci_disable_device(pdev);
@@ -543,7 +547,9 @@ static void pdsc_reset_done(struct pci_dev *pdev)
return;
}
+ mutex_lock(&pdsc->devcmd_lock);
err = pdsc_map_bars(pdsc);
+ mutex_unlock(&pdsc->devcmd_lock);
if (err)
return;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH net v3 2/3] pds_core: don't release PCI regions for VFs on reset
2026-09-01 4:42 [PATCH net v3 0/3] pds_core: fixes for the PCI reset path Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 1/3] pds_core: fix cmd_regs access racing BAR unmap on reset Nikhil P. Rao
@ 2026-09-01 4:42 ` Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 3/3] pds_core: check info_regs in the identity debugfs reader Nikhil P. Rao
2 siblings, 0 replies; 4+ messages in thread
From: Nikhil P. Rao @ 2026-09-01 4:42 UTC (permalink / raw)
To: netdev
Cc: kuba, pabeni, brett.creeley, eric.joyner, andrew+netdev, davem,
edumazet, Nikhil P. Rao
pdsc_reset_prepare() called pci_release_regions() unconditionally, but
only PFs call pci_request_regions() (pdsc_init_pf). On a VF FLR this
makes the kernel warn "Trying to free nonexistent resource".
Fixes: ffa55858330f ("pds_core: implement pci reset handlers")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Closes: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260804235946.177762-1-nikhil.rao%40amd.com
Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Nikhil P. Rao <nikhil.rao@amd.com>
---
drivers/net/ethernet/amd/pds_core/main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
index 6e1079f9ba0f..a971c66d36f9 100644
--- a/drivers/net/ethernet/amd/pds_core/main.c
+++ b/drivers/net/ethernet/amd/pds_core/main.c
@@ -517,8 +517,8 @@ static void pdsc_reset_prepare(struct pci_dev *pdev)
mutex_lock(&pdsc->devcmd_lock);
pdsc_unmap_bars(pdsc);
mutex_unlock(&pdsc->devcmd_lock);
+ pci_release_regions(pdev);
}
- pci_release_regions(pdev);
if (pci_is_enabled(pdev))
pci_disable_device(pdev);
pdsc_deferred_dma_free(pdsc);
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH net v3 3/3] pds_core: check info_regs in the identity debugfs reader
2026-09-01 4:42 [PATCH net v3 0/3] pds_core: fixes for the PCI reset path Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 1/3] pds_core: fix cmd_regs access racing BAR unmap on reset Nikhil P. Rao
2026-09-01 4:42 ` [PATCH net v3 2/3] pds_core: don't release PCI regions for VFs " Nikhil P. Rao
@ 2026-09-01 4:42 ` Nikhil P. Rao
2 siblings, 0 replies; 4+ messages in thread
From: Nikhil P. Rao @ 2026-09-01 4:42 UTC (permalink / raw)
To: netdev
Cc: kuba, pabeni, brett.creeley, eric.joyner, andrew+netdev, davem,
edumazet, Nikhil P. Rao
identity_show() reads fw_heartbeat from info_regs with no NULL check,
unlike every other reader of that register. pdsc_unmap_bars() sets
info_regs to NULL on reset and on remove, and the identity file survives
a reset.
Fixes: e96094c1d11c ("pds_core: Clear BARs on reset")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Closes: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260804235946.177762-1-nikhil.rao%40amd.com
Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Nikhil P. Rao <nikhil.rao@amd.com>
---
drivers/net/ethernet/amd/pds_core/debugfs.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/amd/pds_core/debugfs.c b/drivers/net/ethernet/amd/pds_core/debugfs.c
index ef0a1b7d159b..c458e6758959 100644
--- a/drivers/net/ethernet/amd/pds_core/debugfs.c
+++ b/drivers/net/ethernet/amd/pds_core/debugfs.c
@@ -38,8 +38,9 @@ static int identity_show(struct seq_file *seq, void *v)
ident = &pdsc->dev_ident;
- seq_printf(seq, "fw_heartbeat: 0x%x\n",
- ioread32(&pdsc->info_regs->fw_heartbeat));
+ if (pdsc->info_regs)
+ seq_printf(seq, "fw_heartbeat: 0x%x\n",
+ ioread32(&pdsc->info_regs->fw_heartbeat));
seq_printf(seq, "nlifs: %d\n",
le32_to_cpu(ident->nlifs));
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread