mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:46:16 +00:00
2d6a1c8356
The sysfs_target->regions allocated in damon_sysfs_regions_alloc() is not
freed in damon_sysfs_test_add_targets(), which cause the following memory
leak, free it to fix it.
unreferenced object 0xffffff80c2a8db80 (size 96):
comm "kunit_try_catch", pid 187, jiffies 4294894363
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace (crc 0):
[<0000000001e3714d>] kmemleak_alloc+0x34/0x40
[<000000008e6835c1>] __kmalloc_cache_noprof+0x26c/0x2f4
[<000000001286d9f8>] damon_sysfs_test_add_targets+0x1cc/0x738
[<0000000032ef8f77>] kunit_try_run_case+0x13c/0x3ac
[<00000000f3edea23>] kunit_generic_run_threadfn_adapter+0x80/0xec
[<00000000adf936cf>] kthread+0x2e8/0x374
[<0000000041bb1628>] ret_from_fork+0x10/0x20
Link: https://lkml.kernel.org/r/20241010125323.3127187-1-ruanjinjie@huawei.com
Fixes: b8ee5575f7
("mm/damon/sysfs-test: add a unit test for damon_sysfs_set_targets()")
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Reviewed-by: SeongJae Park <sj@kernel.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
88 lines
1.9 KiB
C
88 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Data Access Monitor Unit Tests
|
|
*
|
|
* Author: SeongJae Park <sj@kernel.org>
|
|
*/
|
|
|
|
#ifdef CONFIG_DAMON_SYSFS_KUNIT_TEST
|
|
|
|
#ifndef _DAMON_SYSFS_TEST_H
|
|
#define _DAMON_SYSFS_TEST_H
|
|
|
|
#include <kunit/test.h>
|
|
|
|
static unsigned int nr_damon_targets(struct damon_ctx *ctx)
|
|
{
|
|
struct damon_target *t;
|
|
unsigned int nr_targets = 0;
|
|
|
|
damon_for_each_target(t, ctx)
|
|
nr_targets++;
|
|
|
|
return nr_targets;
|
|
}
|
|
|
|
static int __damon_sysfs_test_get_any_pid(int min, int max)
|
|
{
|
|
struct pid *pid;
|
|
int i;
|
|
|
|
for (i = min; i <= max; i++) {
|
|
pid = find_get_pid(i);
|
|
if (pid) {
|
|
put_pid(pid);
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static void damon_sysfs_test_add_targets(struct kunit *test)
|
|
{
|
|
struct damon_sysfs_targets *sysfs_targets;
|
|
struct damon_sysfs_target *sysfs_target;
|
|
struct damon_ctx *ctx;
|
|
|
|
sysfs_targets = damon_sysfs_targets_alloc();
|
|
sysfs_targets->nr = 1;
|
|
sysfs_targets->targets_arr = kmalloc_array(1,
|
|
sizeof(*sysfs_targets->targets_arr), GFP_KERNEL);
|
|
|
|
sysfs_target = damon_sysfs_target_alloc();
|
|
sysfs_target->pid = __damon_sysfs_test_get_any_pid(12, 100);
|
|
sysfs_target->regions = damon_sysfs_regions_alloc();
|
|
sysfs_targets->targets_arr[0] = sysfs_target;
|
|
|
|
ctx = damon_new_ctx();
|
|
|
|
damon_sysfs_add_targets(ctx, sysfs_targets);
|
|
KUNIT_EXPECT_EQ(test, 1u, nr_damon_targets(ctx));
|
|
|
|
sysfs_target->pid = __damon_sysfs_test_get_any_pid(
|
|
sysfs_target->pid + 1, 200);
|
|
damon_sysfs_add_targets(ctx, sysfs_targets);
|
|
KUNIT_EXPECT_EQ(test, 2u, nr_damon_targets(ctx));
|
|
|
|
damon_destroy_ctx(ctx);
|
|
kfree(sysfs_targets->targets_arr);
|
|
kfree(sysfs_targets);
|
|
kfree(sysfs_target->regions);
|
|
kfree(sysfs_target);
|
|
}
|
|
|
|
static struct kunit_case damon_sysfs_test_cases[] = {
|
|
KUNIT_CASE(damon_sysfs_test_add_targets),
|
|
{},
|
|
};
|
|
|
|
static struct kunit_suite damon_sysfs_test_suite = {
|
|
.name = "damon-sysfs",
|
|
.test_cases = damon_sysfs_test_cases,
|
|
};
|
|
kunit_test_suite(damon_sysfs_test_suite);
|
|
|
|
#endif /* _DAMON_SYSFS_TEST_H */
|
|
|
|
#endif /* CONFIG_DAMON_SYSFS_KUNIT_TEST */
|