diff options
| author | Ma Ke <make24@iscas.ac.cn> | 2025-10-22 19:53:25 +0800 |
|---|---|---|
| committer | Will Deacon <will@kernel.org> | 2025-11-03 14:20:03 +0000 |
| commit | 970e1e41805f0bd49dc234330a9390f4708d097d (patch) | |
| tree | 185fb7d8af280b36e9c47f5a29ad883370f60fc3 | |
| parent | 8fa08f8835e57e1fd5e2994c9cf76c84dadc1235 (diff) | |
perf: arm_cspmu: fix error handling in arm_cspmu_impl_unregister()
driver_find_device() calls get_device() to increment the reference
count once a matching device is found. device_release_driver()
releases the driver, but it does not decrease the reference count that
was incremented by driver_find_device(). At the end of the loop, there
is no put_device() to balance the reference count. To avoid reference
count leakage, add put_device() to decrease the reference count.
Found by code review.
Cc: stable@vger.kernel.org
Fixes: bfc653aa89cb ("perf: arm_cspmu: Separate Arm and vendor module")
Signed-off-by: Ma Ke <make24@iscas.ac.cn>
Signed-off-by: Will Deacon <will@kernel.org>
| -rw-r--r-- | drivers/perf/arm_cspmu/arm_cspmu.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c b/drivers/perf/arm_cspmu/arm_cspmu.c index 33ad2cab5c16..34430b68f602 100644 --- a/drivers/perf/arm_cspmu/arm_cspmu.c +++ b/drivers/perf/arm_cspmu/arm_cspmu.c @@ -1407,8 +1407,10 @@ void arm_cspmu_impl_unregister(const struct arm_cspmu_impl_match *impl_match) /* Unbind the driver from all matching backend devices. */ while ((dev = driver_find_device(&arm_cspmu_driver.driver, NULL, - match, arm_cspmu_match_device))) + match, arm_cspmu_match_device))) { device_release_driver(dev); + put_device(dev); + } mutex_lock(&arm_cspmu_lock); |
