mm/damon/tests/core-kunit: add damos_commit_dests() test

Add a new unit test for damos_commit_dests().

Link: https://lkml.kernel.org/r/20251111184415.141757-10-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: David Gow <davidgow@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park 2025-11-11 10:44:08 -08:00 committed by Andrew Morton
parent c1cefda776
commit eec573b8dd

View File

@ -692,6 +692,102 @@ static void damos_test_commit_quota(struct kunit *test)
KUNIT_EXPECT_EQ(test, dst.weight_age, src.weight_age);
}
static int damos_test_help_dests_setup(struct damos_migrate_dests *dests,
unsigned int *node_id_arr, unsigned int *weight_arr,
size_t nr_dests)
{
size_t i;
dests->node_id_arr = kmalloc_array(nr_dests,
sizeof(*dests->node_id_arr), GFP_KERNEL);
if (!dests->node_id_arr)
return -ENOMEM;
dests->weight_arr = kmalloc_array(nr_dests,
sizeof(*dests->weight_arr), GFP_KERNEL);
if (!dests->weight_arr) {
kfree(dests->node_id_arr);
dests->node_id_arr = NULL;
return -ENOMEM;
}
for (i = 0; i < nr_dests; i++) {
dests->node_id_arr[i] = node_id_arr[i];
dests->weight_arr[i] = weight_arr[i];
}
dests->nr_dests = nr_dests;
return 0;
}
static void damos_test_help_dests_free(struct damos_migrate_dests *dests)
{
kfree(dests->node_id_arr);
kfree(dests->weight_arr);
}
static void damos_test_commit_dests_for(struct kunit *test,
unsigned int *dst_node_id_arr, unsigned int *dst_weight_arr,
size_t dst_nr_dests,
unsigned int *src_node_id_arr, unsigned int *src_weight_arr,
size_t src_nr_dests)
{
struct damos_migrate_dests dst = {}, src = {};
int i, err;
bool skip = true;
err = damos_test_help_dests_setup(&dst, dst_node_id_arr,
dst_weight_arr, dst_nr_dests);
if (err)
kunit_skip(test, "dests setup fail");
err = damos_test_help_dests_setup(&src, src_node_id_arr,
src_weight_arr, src_nr_dests);
if (err) {
damos_test_help_dests_free(&dst);
kunit_skip(test, "src setup fail");
}
err = damos_commit_dests(&dst, &src);
if (err)
goto out;
skip = false;
KUNIT_EXPECT_EQ(test, dst.nr_dests, src_nr_dests);
for (i = 0; i < dst.nr_dests; i++) {
KUNIT_EXPECT_EQ(test, dst.node_id_arr[i], src_node_id_arr[i]);
KUNIT_EXPECT_EQ(test, dst.weight_arr[i], src_weight_arr[i]);
}
out:
damos_test_help_dests_free(&dst);
damos_test_help_dests_free(&src);
if (skip)
kunit_skip(test, "skip");
}
static void damos_test_commit_dests(struct kunit *test)
{
damos_test_commit_dests_for(test,
(unsigned int[]){1, 2, 3}, (unsigned int[]){2, 3, 4},
3,
(unsigned int[]){4, 5, 6}, (unsigned int[]){5, 6, 7},
3);
damos_test_commit_dests_for(test,
(unsigned int[]){1, 2}, (unsigned int[]){2, 3},
2,
(unsigned int[]){4, 5, 6}, (unsigned int[]){5, 6, 7},
3);
damos_test_commit_dests_for(test,
NULL, NULL, 0,
(unsigned int[]){4, 5, 6}, (unsigned int[]){5, 6, 7},
3);
damos_test_commit_dests_for(test,
(unsigned int[]){1, 2, 3}, (unsigned int[]){2, 3, 4},
3,
(unsigned int[]){4, 5}, (unsigned int[]){5, 6}, 2);
damos_test_commit_dests_for(test,
(unsigned int[]){1, 2, 3}, (unsigned int[]){2, 3, 4},
3,
NULL, NULL, 0);
}
static void damos_test_commit_filter_for(struct kunit *test,
struct damos_filter *dst, struct damos_filter *src)
{
@ -980,6 +1076,7 @@ static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damos_test_commit_quota_goal),
KUNIT_CASE(damos_test_commit_quota_goals),
KUNIT_CASE(damos_test_commit_quota),
KUNIT_CASE(damos_test_commit_dests),
KUNIT_CASE(damos_test_commit_filter),
KUNIT_CASE(damos_test_filter_out),
KUNIT_CASE(damon_test_feed_loop_next_input),