[PATCH 0/5] PCI/sysfs: Wait for config access lock in sysfs attributes
From: Matthew Wood
Date: Sat Oct 24 2026 - 20:09:06 EST
Many PCI sysfs attributes that read from config space are using kernel
accessors that don't wait for pci_cfg_access_lock() holders before reading:
- serial_number
- max_link_width
- current_link_*
- *_bus_number
If userspace attempts to read from these attributes while config space is not
available (e.g. during a reset) there's no telling what values will be
returned: All ones, zeros, or garbage.
Looking at attribute addition history it seems like this was an oversight
instead of a specific decision so this series tries to resolve the attributes
above to match the sysfs attributes that do use user accessors: config & vpd.
Patch 1 is a prerequisite for the rest of the series. The kernel
accessors these attributes use today skip devices marked disconnected
but the user accessors don't, so switching over alone would make the
attributes start sending config reads to disconnected devices. Patch 1
adds the same pci_dev_is_disconnected() check to the user read
accessors.
Note: That check also affects their existing callers. On a disconnected
device, VPD reads and writes, VFIO config reads, and VFIO writes to
PCI_COMMAND now fail with -ENODEV, rather than returning ~0 data or,
for VPD writes, timing out with a "firmware bug" warning.
pciconfig_read() fails with -EIO, and the sysfs "config" file and
/proc/bus/pci still return ~0 data.
Changes were successfully tested by continuously reading sysfs attributes
while a reset was issued.
Matthew Wood (5):
PCI: Add disconnected device checks to user config reads
PCI/sysfs: Use user config accessors for bus number attributes
PCI: Add pcie_capability_user_read_{word,dword}()
PCI/sysfs: Use user config accessors for link attributes
PCI/sysfs: Use user config accessors for serial_number
drivers/pci/access.c | 57 +++++++++++++++++++++++++++++++++++++++--
drivers/pci/pci-sysfs.c | 35 ++++++++++++++++++-------
drivers/pci/pci.h | 2 ++
3 files changed, 83 insertions(+), 11 deletions(-)
base-commit: f4319f548f7d8cb595ac1c91bfd459876399eeb3
--
2.53.0-Meta