linux/drivers
Lukas Wunner 1aaa8e9e4f PCI/ACPI: Fix runtime PM ref imbalance on Hot-Plug Capable ports
[ Upstream commit 6cff20ce3b ]

pci_bridge_d3_possible() is called from both pcie_portdrv_probe() and
pcie_portdrv_remove() to determine whether runtime power management shall
be enabled (on probe) or disabled (on remove) on a PCIe port.

The underlying assumption is that pci_bridge_d3_possible() always returns
the same value, else a runtime PM reference imbalance would occur.  That
assumption is not given if the PCIe port is inaccessible on remove due to
hot-unplug:  pci_bridge_d3_possible() calls pciehp_is_native(), which
accesses Config Space to determine whether the port is Hot-Plug Capable.
An inaccessible port returns "all ones", which is converted to "all
zeroes" by pcie_capability_read_dword().  Hence the port no longer seems
Hot-Plug Capable on remove even though it was on probe.

The resulting runtime PM ref imbalance causes warning messages such as:

  pcieport 0000:02:04.0: Runtime PM usage count underflow!

Avoid the Config Space access (and thus the runtime PM ref imbalance) by
caching the Hot-Plug Capable bit in struct pci_dev.

The struct already contains an "is_hotplug_bridge" flag, which however is
not only set on Hot-Plug Capable PCIe ports, but also Conventional PCI
Hot-Plug bridges and ACPI slots.  The flag identifies bridges which are
allocated additional MMIO and bus number resources to allow for hierarchy
expansion.

The kernel is somewhat sloppily using "is_hotplug_bridge" in a number of
places to identify Hot-Plug Capable PCIe ports, even though the flag
encompasses other devices.  Subsequent commits replace these occurrences
with the new flag to clearly delineate Hot-Plug Capable PCIe ports from
other kinds of hotplug bridges.

Document the existing "is_hotplug_bridge" and the new "is_pciehp" flag
and document the (non-obvious) requirement that pci_bridge_d3_possible()
always returns the same value across the entire lifetime of a bridge,
including its hot-removal.

Fixes: 5352a44a56 ("PCI: pciehp: Make pciehp_is_native() stricter")
Reported-by: Laurent Bigonville <bigon@bigon.be>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220216
Reported-by: Mario Limonciello <mario.limonciello@amd.com>
Closes: https://lore.kernel.org/r/20250609020223.269407-3-superm1@kernel.org/
Link: https://lore.kernel.org/all/20250620025535.3425049-3-superm1@kernel.org/T/#u
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
Cc: stable@vger.kernel.org # v4.18+
Link: https://patch.msgid.link/fe5dcc3b2e62ee1df7905d746bde161eb1b3291c.1752390101.git.lukas@wunner.de
[ changed "recent enough PCIe ports" comment to "some PCIe ports" ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-08-28 16:24:31 +02:00
..
accessibility speakup: Fix sizeof() vs ARRAY_SIZE() bug 2024-06-16 13:39:11 +02:00
acpi ACPI: APEI: GHES: add TAINT_MACHINE_CHECK on GHES panic path 2025-08-28 16:24:18 +02:00
amba amba: bus: fix refcount leak 2023-09-19 12:22:47 +02:00
android binder: fix UAF caused by offsets overwrite 2024-09-12 11:07:51 +02:00
ata ata: libata-scsi: Fix ata_to_sense_error() status handling 2025-08-28 16:24:28 +02:00
atm atm: idt77252: Add missing dma_map_error() 2025-07-17 18:30:54 +02:00
auxdisplay auxdisplay: charlcd: Partially revert "Move hwidth and bwidth to struct hd44780_common" 2025-06-04 14:37:57 +02:00
base PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit() 2025-08-28 16:24:18 +02:00
bcma Driver core update for 5.15-rc1 2021-09-01 08:44:42 -07:00
block drbd: add missing kref_get in handle_write_conflicts 2025-08-28 16:24:16 +02:00
bluetooth Bluetooth: btrtl: Prevent potential NULL dereference 2025-05-02 07:44:09 +02:00
bus bus: mhi: host: Fix endianness of BHI vector table 2025-08-28 16:24:27 +02:00
cdrom scsi: sr: cdrom: Move cdrom_read_cdda_bpc() into the sr driver 2021-07-30 22:13:09 -04:00
char ipmi: Fix strcpy source and destination the same 2025-08-28 16:24:25 +02:00
clk clk: sunxi-ng: v3s: Fix de clock definition 2025-08-28 16:24:10 +02:00
clocksource clocksource: mips-gic-timer: Enable counter when CPUs start 2025-06-04 14:38:01 +02:00
comedi comedi: fix race between polling and detaching 2025-08-28 16:24:26 +02:00
connector net/connector: Add const qualifier to cb_id 2020-12-16 11:06:49 -08:00
counter counter: microchip-tcb-capture: Fix undefined counter channel state on probe 2025-04-10 14:31:56 +02:00
cpufreq cpufreq: armada-8k: Fix off by one in armada_8k_cpufreq_free_table() 2025-08-28 16:24:27 +02:00
cpuidle cpuidle: governors: menu: Avoid using invalid recent intervals data 2025-08-28 16:24:16 +02:00
crypto crypto: octeontx2 - add timeout for load_fvc completion poll 2025-08-28 16:24:24 +02:00
cxl cxl/mem: Fix shutdown order 2023-11-20 11:08:27 +01:00
dax dax/kmem: Pass valid argument to memory_group_register_static 2023-07-23 13:47:17 +02:00
dca dca: Use PTR_ERR_OR_ZERO() to simplify code 2020-05-15 16:25:20 +02:00
devfreq PM / devfreq: governor: Replace sscanf() with kstrtoul() in set_freq_store() 2025-08-28 16:24:17 +02:00
dio drivers: dio: fix possible memory leak in dio_init() 2022-12-31 13:14:27 +01:00
dma dmaengine: nbpfaxi: Add missing check after DMA map 2025-08-28 16:24:11 +02:00
dma-buf dma-buf: fix timeout handling in dma_resv_wait_timeout v2 2025-07-17 18:30:52 +02:00
edac EDAC/synopsys: Clear the ECC counters on init 2025-08-28 16:24:18 +02:00
eisa EISA: use DEVICE_ATTR_RO() helper macro 2021-06-04 15:28:34 +02:00
extcon extcon: max8997: select IRQ_DOMAIN instead of depending on it 2024-06-16 13:39:39 +02:00
firewire firewire: nosy: ensure user_length is taken into account when fetching packet contents 2024-05-17 11:51:01 +02:00
firmware firmware: SDEI: Allow sdei initialization without ACPI_APEI_GHES 2025-06-27 11:05:11 +01:00
fpga zynq_fpga: use sgtable-based scatterlist wrappers 2025-08-28 16:24:28 +02:00
fsi fsi: aspeed: Reset master errors after CFAM reset 2023-09-19 12:22:46 +02:00
gnss treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
gpio gpio: tps65912: check the return value of regmap_update_bits() 2025-08-28 16:24:18 +02:00
gpu drm/sched: Remove optimization that causes hang when killing dependent jobs 2025-08-28 16:24:30 +02:00
greybus greybus: Fix use-after-free bug in gb_interface_release due to race condition. 2024-07-05 09:14:23 +02:00
hid HID: magicmouse: avoid setting up battery timer when not needed 2025-08-28 16:24:27 +02:00
hsi HSI: ssi_protocol: Fix use after free vulnerability in ssi_protocol Driver Due to Race Condition 2025-05-02 07:44:06 +02:00
hv Drivers: hv: vmbus: Add utility function for querying ring size 2025-07-10 15:57:36 +02:00
hwmon hwmon: (gsc-hwmon) fix fan pwm setpoint show functions 2025-08-28 16:24:28 +02:00
hwspinlock hwspinlock: Introduce hwspin_lock_bust() 2024-09-12 11:07:41 +02:00
hwtracing coresight: Only check bottom two claim bits 2025-07-10 15:57:33 +02:00
i2c i2c: Force DLL0945 touchpad i2c freq to 100khz 2025-08-28 16:24:24 +02:00
i3c i3c: don't fail if GETHDRCAP is unsupported 2025-08-28 16:24:24 +02:00
idle intel_idle: Allow loading ACPI tables for any family 2025-08-28 16:24:16 +02:00
iio iio: hid-sensor-prox: Fix incorrect OFFSET calculation 2025-08-28 16:24:31 +02:00
infiniband RDMA/core: reduce stack using in nldev_stat_get_doit() 2025-08-28 16:24:23 +02:00
input Input: gpio-keys - fix a sleep while atomic with PREEMPT_RT 2025-08-28 16:24:03 +02:00
interconnect interconnect: qcom: sc7280: Add missing num_links to xm_pcie3_1 node 2025-08-28 16:24:03 +02:00
iommu iommu/amd: Ensure GA log notifier callbacks finish running before module unload 2025-06-27 11:05:32 +01:00
ipack ipack: ipoctal: fix module reference leak 2021-09-27 17:38:49 +02:00
irqchip irqchip/gic-v2m: Prevent use after free of gicv2m_get_fwnode() 2025-05-09 09:39:42 +02:00
isdn mISDN: Fix a use after free in hfcmulti_tx() 2024-08-19 05:45:25 +02:00
leds leds: leds-lp50xx: Handle reg to get correct multi_index 2025-08-28 16:24:23 +02:00
macintosh macintosh/therm_windtunnel: fix module unload. 2024-08-19 05:45:06 +02:00
mailbox mailbox: Not protect module_put with spin_lock_irqsave 2025-07-10 15:57:32 +02:00
mcb mcb: fix a double free bug in chameleon_parse_gdd() 2025-05-02 07:44:31 +02:00
md dm-mpath: don't print the "loaded" message if registering fails 2025-08-28 16:24:24 +02:00
media media: venus: venc: Clamp param smaller than 1fps and bigger than 240 2025-08-28 16:24:29 +02:00
memory memory: tegra20-emc: Correct memory device mask 2025-03-13 12:50:34 +01:00
memstick memstick: core: Zero initialize id_reg in h_memstick_read_dev_id() 2025-08-28 16:23:59 +02:00
message scsi: fusion: Remove unused variable 'rc' 2024-12-14 19:51:02 +01:00
mfd mfd: max14577: Fix wakeup source leaks on device unbind 2025-07-10 15:57:32 +02:00
misc misc: rtsx: usb: Ensure mmc child device is active when card is present 2025-08-28 16:24:26 +02:00
mmc mmc: rtsx_usb_sdmmc: Fix error-path in sd_set_power_mode() 2025-08-28 16:24:18 +02:00
most most: fix control-message timeouts 2021-11-18 19:16:08 +01:00
mtd mtd: rawnand: fsmc: Add missing check after DMA map 2025-08-28 16:24:28 +02:00
mux mux: gpio: Simplify code by using dev_err_probe() 2021-04-02 16:28:53 +02:00
net hv_netvsc: Fix panic during namespace deletion with VF 2025-08-28 16:24:31 +02:00
nfc nfc: pn533: Add poll mod list filling check 2024-09-04 13:23:40 +02:00
ntb ntb: reduce stack usage in idt_scan_mws 2025-05-02 07:44:36 +02:00
nubus nubus: Partially revert proc_create_single_data() conversion 2023-07-05 18:25:05 +01:00
nvdimm libnvdimm/labels: Fix divide error in nd_label_data_init() 2025-06-04 14:37:55 +02:00
nvme nvme: fix misaccounting of nvme-mpath inflight I/O 2025-08-28 16:24:01 +02:00
nvmem nvmem: core: improve range check for nvmem_cell_write() 2025-03-13 12:50:32 +01:00
of of: module: add buffer overflow check in of_modalias() 2025-05-09 09:39:41 +02:00
opp OPP: debugfs: Fix warning around icc_get_name() 2024-03-26 18:21:23 -04:00
parisc parisc: iosapic.c: Fix sparse warnings 2023-10-06 13:18:15 +02:00
parport parport_pc: add support for ASIX AX99100 2025-03-13 12:50:46 +01:00
pci PCI/ACPI: Fix runtime PM ref imbalance on Hot-Plug Capable ports 2025-08-28 16:24:31 +02:00
pcmcia pcmcia: Use resource_size function on resource object 2024-09-12 11:07:46 +02:00
perf perf/arm-cmn: Initialise cmn->cpu earlier 2025-06-04 14:38:08 +02:00
phy phy: tegra: xusb: Fix unbalanced regulator disable in UTMI PHY mode 2025-08-28 16:23:58 +02:00
pinctrl pinctrl: stm32: Manage irq affinity settings 2025-08-28 16:24:24 +02:00
platform platform/chrome: cros_ec_typec: Defer probe on missing EC parent 2025-08-28 16:24:19 +02:00
pnp PNP: ACPI: fix fortify warning 2024-02-23 08:54:38 +01:00
power power: supply: max14577: Handle NULL pdata when CONFIG_OF is not set 2025-08-28 16:24:09 +02:00
powercap powercap: intel_rapl: Do not change CLAMPING bit if ENABLE bit cannot be changed 2025-08-28 16:24:03 +02:00
pps pps: clients: gpio: fix interrupt handling order in remove path 2025-08-28 16:24:18 +02:00
ps3 powerpc/ps3: Warn on PS3 device errors 2021-06-10 21:44:58 +10:00
ptp ptp: prevent possible ABBA deadlock in ptp_clock_freerun() 2025-08-28 16:24:16 +02:00
pwm pwm: imx-tpm: Reset counter if CMOD is 0 2025-08-28 16:24:28 +02:00
rapidio drivers/rapidio/rio_cm.c: prevent possible heap overwrite 2025-06-27 11:05:33 +01:00
ras RAS/CEC: Correct ce_add_elem()'s returned values 2021-04-07 11:52:26 +02:00
regulator regulator: core: fix NULL dereference on unbind due to stale coupling data 2025-08-28 16:24:03 +02:00
remoteproc remoteproc: core: Release rproc->clean_table after rproc_attach() fails 2025-06-27 11:05:27 +01:00
reset reset: brcmstb: Enable reset drivers for ARCH_BCM2835 2025-08-28 16:24:18 +02:00
rpmsg rpmsg: qcom_smd: Fix uninitialized return variable in __qcom_smd_send() 2025-06-27 11:05:15 +01:00
rtc rtc: ds1307: remove clear of oscillator stop flag (OSF) in probe 2025-08-28 16:24:26 +02:00
s390 s390/pkey: Prevent overflow in size calculation for memdup_user() 2025-07-10 15:57:37 +02:00
sbus module: remove never implemented MODULE_SUPPORTED_DEVICE 2021-03-17 13:16:18 -07:00
scsi scsi: mpi3mr: Fix race between config read submit and interrupt completion 2025-08-28 16:24:28 +02:00
sh sh: clk: Fix clk_enable() to return 0 on NULL clk 2025-01-09 13:28:34 +01:00
siox siox: fix possible memory leak in siox_device_add() 2022-11-26 09:24:36 +01:00
slimbus slimbus: messaging: Free transaction ID in delayed interrupt scenario 2025-03-13 12:51:10 +01:00
soc soc/tegra: pmc: Ensure power-domains are in a known state 2025-08-28 16:24:29 +02:00
soundwire soundwire: stream: restore params when prepare ports fail 2025-08-28 16:24:10 +02:00
spi spi: spi-fsl-dspi: Clear completion counter before initiating transfer 2025-07-10 15:57:45 +02:00
spmi spmi: hisi-spmi-controller: Do not override device identifier 2024-07-05 09:14:20 +02:00
ssb ssb: Fix division by zero issue in ssb_calc_clock_rate 2024-09-04 13:23:20 +02:00
staging media: imx: fix a potential memory leak in imx_media_csc_scaler_device_init() 2025-08-28 16:24:29 +02:00
target scsi: target: core: Generate correct identifiers for PR OUT transport IDs 2025-08-28 16:24:25 +02:00
tc The main MIPS changes for 5.6: 2020-01-31 11:28:31 -08:00
tee tee: Prevent size calculation wraparound on 32-bit kernels 2025-06-27 11:05:33 +01:00
thermal thermal: sysfs: Return ENODATA instead of EAGAIN for reads 2025-08-28 16:24:18 +02:00
thunderbolt thunderbolt: Fix copy+paste error in match_service_id() 2025-08-28 16:24:26 +02:00
tty vt: defkeymap: Map keycodes above 127 to K_HOLE 2025-08-28 16:24:27 +02:00
uio uio_hv_generic: Align ring size to system page 2025-07-10 15:57:36 +02:00
usb usb: typec: fusb302: cache PD RX state 2025-08-28 16:24:31 +02:00
vdpa vdpa/mlx5: Fix oversized null mkey longer than 32bit 2025-05-02 07:44:02 +02:00
vfio vfio/type1: Fix error unwind in migration dirty bitmap allocation 2025-06-27 11:05:13 +01:00
vhost vhost: fail early when __vhost_add_used() fails 2025-08-28 16:24:22 +02:00
video Revert "vgacon: Add check for vc_origin address range in vgacon_scroll()" 2025-08-28 16:24:27 +02:00
virt drivers: virt: acrn: hsm: Use kzalloc to avoid info leak in pmcmd_ioctl 2025-03-13 12:51:11 +01:00
virtio virtio_ring: Fix data race by tagging event_triggered as racy for KCSAN 2025-06-04 14:37:54 +02:00
visorbus visorbus: fix error return code in visorchipset_init() 2021-06-04 15:27:26 +02:00
vlynq bus: Make remove callback return void 2021-07-21 11:53:42 +02:00
vme vme: Fix error not catched in fake_init() 2022-12-31 13:14:30 +01:00
w1 w1: fix loop in w1_fini() 2023-07-23 13:47:20 +02:00
watchdog watchdog: iTCO_wdt: Report error if timeout configuration fails 2025-08-28 16:24:23 +02:00
xen xen/gntdev: remove struct gntdev_copy_batch from stack 2025-08-28 16:24:08 +02:00
zorro zorro: Drop useless (and hardly used) .driver member in struct zorro_dev 2021-08-05 14:37:04 +02:00
Kconfig firmware: include drivers/firmware/Kconfig unconditionally 2021-10-07 16:51:26 +02:00
Makefile virtio: always enter drivers/virtio/ 2021-12-22 09:32:39 +01:00