Hi Mike On 4/6/26 7:46 PM, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" > > Currently khugepaged decides if a test can run using TEST() macro that > checks what mem_ops and collapse_context are set by the command line > arguments. > > For better compatibility with ksefltest framework, add an array of 'struct > test_case's and redefine TEST() macro to conditionally add enabled tests to > that array. > > Then execute the enabled test by looping the test_case's array. > > Signed-off-by: Mike Rapoport (Microsoft) > --- > tools/testing/selftests/mm/khugepaged.c | 43 +++++++++++++++++++++---- > 1 file changed, 36 insertions(+), 7 deletions(-) > > diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c > index e6fb01ca44ed..1cdc5918d20d 100644 > --- a/tools/testing/selftests/mm/khugepaged.c > +++ b/tools/testing/selftests/mm/khugepaged.c > @@ -1161,6 +1161,34 @@ static void parse_test_type(int argc, char **argv) > get_finfo(argv[1]); > } > > +typedef void (*test_fn)(struct collapse_context *c, struct mem_ops *ops); > + > +struct test_case { > + struct collapse_context *ctx; > + struct mem_ops *ops; > + const char *desc; > + test_fn fn; > +}; > + > +#define MAX_TEST_CASES 45 I see 48 tests in |khugepaged.c|, and running |khugepaged all:all| results in the error below. Should |MAX_TEST_CASES| be updated to 48 instead? ./khugepaged all:all . TAP version 13 # Save THP and khugepaged settings... OK Bail out! MAX_ADD_CASES is too small # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0 # Restore THP and khugepaged settings... OK # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0 > +static struct test_case test_cases[MAX_TEST_CASES]; > +static int nr_test_cases; > + > +#define TEST(t, c, o) do { \ > + if (c && o) { \ > + if (nr_test_cases >= MAX_TEST_CASES) { \ I had a small question—since the number of tests is fixed, would this check still be necessary? > + printf("MAX_ADD_CASES is too small\n"); \ > + exit(EXIT_FAILURE); \ > + } \ > + test_cases[nr_test_cases++] = (struct test_case){ \ > + .ctx = c, \ > + .ops = o, \ > + .desc = #t, \ > + .fn = t, \ > + }; \ > + } \ > + } while (0) > + > int main(int argc, char **argv) > { > int hpage_pmd_order; > @@ -1216,13 +1244,6 @@ int main(int argc, char **argv) > > alloc_at_fault(); > > -#define TEST(t, c, o) do { \ > - if (c && o) { \ > - printf("\nRun test: " #t " (%s:%s)\n", c->name, o->name); \ > - t(c, o); \ > - } \ > - } while (0) > - > TEST(collapse_full, khugepaged_context, anon_ops); > TEST(collapse_full, khugepaged_context, file_ops); > TEST(collapse_full, khugepaged_context, shmem_ops); > @@ -1284,5 +1305,13 @@ int main(int argc, char **argv) > TEST(madvise_retracted_page_tables, madvise_context, file_ops); > TEST(madvise_retracted_page_tables, madvise_context, shmem_ops); > > + for (int i = 0; i < nr_test_cases; i++) { > + struct test_case *t = &test_cases[i]; > + > + exit_status = KSFT_PASS; > + printf("\nRun test: %s: (%s:%s)\n", t->desc, t->ctx->name, t->ops->name); > + t->fn(t->ctx, t->ops); > + } > + > restore_settings(0); > } -Donet