Re: [PATCH] PCI/sysfs: Avoid spurious runtime PM wakeup on config space accesses

Krzysztof WilczyƄski <[email protected]> Sat, 1 Aug 2026 13:08:09 +0900
Newsgroups org.kernel.vger.linux-pci
Message-ID <20260801040752.GE3183355@rocinante>
Hello,

> Currently, the boundary checks in pci_read_config() and
> pci_write_config() reject only offsets beyond the effective
> configuration space size.
> 
> Thus, an access at an offset exactly equal to that size passes
> the check, has its length clamped to zero, and then invokes
> pci_config_pm_runtime_get() and pci_config_pm_runtime_put()
> around transfer blocks that do nothing.
> 
> This is a problem because pci_config_pm_runtime_get() synchronously
> resumes the upstream bridge through pm_runtime_get_sync(), and resumes
> the device itself through pm_runtime_resume() when it is in D3cold,
> only for the handler to return zero immediately afterwards.  Such a
> spurious wakeup wastes power and adds needless resume latency.
> 
> The sysfs core already clamps accesses against the attribute size set
> through the bin_size() callback, which reports either 256 or 4096
> bytes.  As such, the affected accesses are reads at offset 64 (or 128
> for CardBus devices) through files opened without CAP_SYS_ADMIN, and
> reads and writes at the exact configuration space size on devices
> where a quirk sets a non-standard size.
> 
> Therefore, reject accesses at the boundary offset as well, so that
> they return early before any runtime PM involvement, matching the
> procfs implementations in proc_bus_pci_read() and proc_bus_pci_write().
> 
> The value returned to userspace at these offsets remains zero,
> so the change is not visible to userspace.

Applied to the sysfs branch.

Thank you!

	Krzysztof