Skip to content

Commit e2a39d1

Browse files
ZideChen0Peter Zijlstra
authored andcommitted
perf/x86/intel/uncore: Fix iounmap() leak on global_init failure
Kernel test robot reported: Unverified Error/Warning (likely false positive, kindly check if interested): arch/x86/events/intel/uncore_discovery.c:293:2-8: ERROR: missing iounmap; ioremap on line 288 and execution via conditional on line 292 If domain->global_init() fails in __parse_discovery_table(), the ioremap'ed MMIO region is not released before returning, resulting in an MMIO mapping leak. Fixes: b575fc0 ("perf/x86/intel/uncore: Add domain global init callback") Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Zide Chen <zide.chen@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Link: https://patch.msgid.link/20260313174050.171704-2-zide.chen@intel.com
1 parent 591cd65 commit e2a39d1

1 file changed

Lines changed: 10 additions & 5 deletions

File tree

arch/x86/events/intel/uncore_discovery.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ static int __parse_discovery_table(struct uncore_discovery_domain *domain,
264264
struct uncore_unit_discovery unit;
265265
void __iomem *io_addr;
266266
unsigned long size;
267+
int ret = 0;
267268
int i;
268269

269270
size = UNCORE_DISCOVERY_GLOBAL_MAP_SIZE;
@@ -273,21 +274,23 @@ static int __parse_discovery_table(struct uncore_discovery_domain *domain,
273274

274275
/* Read Global Discovery State */
275276
memcpy_fromio(&global, io_addr, sizeof(struct uncore_global_discovery));
277+
iounmap(io_addr);
278+
276279
if (uncore_discovery_invalid_unit(global)) {
277280
pr_info("Invalid Global Discovery State: 0x%llx 0x%llx 0x%llx\n",
278281
global.table1, global.ctl, global.table3);
279-
iounmap(io_addr);
280282
return -EINVAL;
281283
}
282-
iounmap(io_addr);
283284

284285
size = (1 + global.max_units) * global.stride * 8;
285286
io_addr = ioremap(addr, size);
286287
if (!io_addr)
287288
return -ENOMEM;
288289

289-
if (domain->global_init && domain->global_init(global.ctl))
290-
return -ENODEV;
290+
if (domain->global_init && domain->global_init(global.ctl)) {
291+
ret = -ENODEV;
292+
goto out;
293+
}
291294

292295
/* Parsing Unit Discovery State */
293296
for (i = 0; i < global.max_units; i++) {
@@ -307,8 +310,10 @@ static int __parse_discovery_table(struct uncore_discovery_domain *domain,
307310
}
308311

309312
*parsed = true;
313+
314+
out:
310315
iounmap(io_addr);
311-
return 0;
316+
return ret;
312317
}
313318

314319
static int parse_discovery_table(struct uncore_discovery_domain *domain,

0 commit comments

Comments
 (0)