diff options
| author | Priyank Rathod <rathodpriyank@google.com> | 2026-09-18 17:24:48 +0000 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2026-10-07 02:54:01 -0500 |
| commit | e86ac10110d00e6c3801f38bde1863951315222b (patch) | |
| tree | 439d048528c282be432ccd9e0d4addd16f2fb687 /tools/perf/scripts/python/stackcollapse.py | |
| parent | 622a70a52523008c7d7d3e1fa68d3729f5a982f3 (diff) | |
PCI/AER: Fix struct pci_dev reference leak in aer_process_err_devices()
When an AER error occurs, candidate error-source devices are added to
e_info->dev[] by add_error_device(), which takes a reference with
pci_dev_get().
A device can be recorded without any error status being present: the
Requester ID fast path in is_error_source(),
if (e_info->id == pci_dev_id(dev))
return true;
matches purely on the ID reported by the Root Port and returns true without
reading the device's AER status registers.
In aer_process_err_devices(), handle_error_source() is called only if
aer_get_device_error_info() returns non-zero, i.e. only if an unmasked
error status bit is actually set. It returns 0 if the device has become
inaccessible (status and mask both read as all ones, so
status & ~mask == 0) or if no unmasked status bit is set.
Because handle_error_source() was responsible for calling pci_dev_put(),
skipping it permanently leaks the reference taken in add_error_device().
Decouple reference lifetime from error handling by moving pci_dev_put() out
of handle_error_source() and into the aer_process_err_devices() loop, so
every recorded device is put exactly once.
handle_error_source() is static and aer_process_err_devices() is its only
caller, so no other path is affected.
Fixes: 60271ab044a5 ("PCI/AER: Take reference on error devices")
Signed-off-by: Priyank Rathod <rathodpriyank@google.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20260918-fix-aer-refcount-leak-v2-1-bdd1ff1c35a9@google.com
Diffstat (limited to 'tools/perf/scripts/python/stackcollapse.py')
0 files changed, 0 insertions, 0 deletions
