Netdev List
 help / color / mirror / Atom feed
* [PATCH net v3 0/3] pds_core: fixes for the PCI reset path
@ 2026-09-01  4:42 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
                   ` (2 more replies)
  0 siblings, 3 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

The v2 review raised several issues beyond the cmd_regs race, so v3 is a
series rather than a single patch.

Patch 1 is the v2 patch with the pdsc_core_init() and
pdsc_identify_ver() checks removed. Those checks are dead code. commit
cd09971dcc1c ("pds_core: keep the health thread stopped during reset")
disables health_work across the reset, so the health thread can no
longer reach pdsc_setup() with the BARs unmapped. The only other callers
are probe and pdsc_reset_done(), and both map the BARs earlier in the
same call, so cmd_regs cannot be NULL by the time they get there.

The pdsc_core_init() check is also worse than what it replaces. Its
bail-out jumps to err_out_uninit, which ends up in pdsc_intr_free() and
writes to pdsc->intr_ctrl, also NULL at that point.

On v2 I said I would convert pdsc_identify() and pdsc_core_init() to
pdsc_devcmd_with_data() once the PLDM series landed. Dropping that: the
helper has no read-back path and both callers need one, and giving them
an -ENXIO return means hardening pdsc_intr_free() against a NULL
intr_ctrl on the err_out_uninit path. That is a lot of churn to
deduplicate two call sites.

Patch 2 is the VF pci_release_regions() fix, older than the cmd_regs
race, so it carries its own Fixes tag.

Patch 3 is the identity_show() NULL deref.

The v2 changelog claim that pdsc_unmap_bars() clears db_pages was wrong.
It clears info_regs, cmd_regs, intr_status and intr_ctrl; db_pages is
never mapped.

v2: https://lore.kernel.org/netdev/20260804235946.177762-1-nikhil.rao@amd.com/
v1: https://lore.kernel.org/netdev/20260729055258.1416225-1-nikhil.rao@amd.com/

Nikhil P. Rao (3):
  pds_core: fix cmd_regs access racing BAR unmap on reset
  pds_core: don't release PCI regions for VFs on reset
  pds_core: check info_regs in the identity debugfs reader

 drivers/net/ethernet/amd/pds_core/debugfs.c |  5 +++--
 drivers/net/ethernet/amd/pds_core/fw.c      | 10 +++++++++-
 drivers/net/ethernet/amd/pds_core/main.c    | 10 ++++++++--
 3 files changed, 20 insertions(+), 5 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [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

end of thread, other threads:[~2026-09-01  4:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH net v3 3/3] pds_core: check info_regs in the identity debugfs reader Nikhil P. Rao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox