On Wed, Aug 5, 2026 at 7:24 PM Shivam Kalra via B4 Relay
<[email protected]> wrote:
>
> From: Shivam Kalra <[email protected]>
>
> Add focused coverage for the folio_check_splittable() eligibility checks.
> Verify that an ordinary mappingless folio is rejected, a mappingless
> swapcache folio is accepted, and unsupported target orders and split types
> remain rejected.
>
> Build the test only when KUnit is built in because
> folio_check_splittable() is intentionally not exported.
>
> Signed-off-by: Shivam Kalra <[email protected]>

Hello, thanks for the patch. A few concerns on this...

> ---
>  mm/Kconfig                   | 14 ++++++++++++
>  mm/Makefile                  |  1 +
>  mm/tests/folio_split_kunit.c | 52 
> ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 67 insertions(+)
>
> diff --git a/mm/Kconfig b/mm/Kconfig
> index 331daf7fcfab..164dc1438900 100644
> --- a/mm/Kconfig
> +++ b/mm/Kconfig
> @@ -1503,6 +1503,20 @@ config LAZY_MMU_MODE_KUNIT_TEST
>
>           If unsure, say N.
>
> +config FOLIO_SPLIT_KUNIT_TEST
> +       bool "KUnit tests for folio splitting" if !KUNIT_ALL_TESTS
> +       depends on KUNIT=y
> +       depends on TRANSPARENT_HUGEPAGE
> +       depends on SWAP

Just BTW, we already have a tools/testing/selftests/mm/split_huge_page_test.c.

> +       help
> +         Enable this option to test folio split eligibility checks. The tests
> +         verify support for mappingless folios in the swap cache and ensure

FOLIO_SPLIT_KUNIT_TEST seems a generic test and not limited to SWAP,
but it relys on SWAP, looks a bit strange to me.

...

> +static void folio_check_splittable_mappingless_swapcache(struct kunit *test)
> +{
> +       struct folio *folio;
> +       int ret;
> +
> +       folio = folio_alloc(GFP_KERNEL, 2);
> +       KUNIT_ASSERT_NOT_NULL(test, folio);
> +       folio_lock(folio);
> +
> +       KUNIT_EXPECT_PTR_EQ(test, folio->mapping, NULL);
> +       ret = folio_check_splittable(folio, 0, SPLIT_TYPE_UNIFORM);
> +       KUNIT_EXPECT_EQ(test, ret, -EBUSY);
> +
> +       /* Only the eligibility check is exercised here. */
> +       folio_set_swapbacked(folio);
> +       folio_set_swapcache(folio);

Faking a swapcache with folio->swap == 0 looks hacky, could go very
wrong if you do any actual work on it.

> +
> +       ret = folio_check_splittable(folio, 0, SPLIT_TYPE_UNIFORM);
> +       KUNIT_EXPECT_EQ(test, ret, 0);
> +       ret = folio_check_splittable(folio, 1, SPLIT_TYPE_UNIFORM);
> +       KUNIT_EXPECT_EQ(test, ret, -EINVAL);
> +       ret = folio_check_splittable(folio, 0, SPLIT_TYPE_NON_UNIFORM);
> +       KUNIT_EXPECT_EQ(test, ret, -EINVAL);

Hmm... you are just testing the gating, not the actual split, that
makes the test not very meaningful I think. And we should not block
non-uniform or high order split for swap cache after sorting things
out, then this test will be doing nothing :)

Reply via email to