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