On Fri, 16 Oct 2026 20:54:48 +0800 Qiliang Yuan <[email protected]> wrote:

> With -cgroup-v2, charge_reserved_hugetlb.sh and
> hugetlb_reparenting_test.sh mount a cgroup2 hierarchy on a temporary
> directory when none is mounted and enable the hugetlb controller
> (hugetlb_reparenting_test.sh also enables memory) in its
> cgroup.subtree_control.
> 
> On a system that still binds these controllers to cgroup v1, they are
> not available in the new hierarchy. Writing to cgroup.subtree_control
> fails with ENOENT, "set -e" aborts the script, the test is reported as
> failed, and the temporary cgroup2 mount is left behind.
> 
> Check cgroup.controllers first, and skip the test when a controller is
> missing, after unmounting the hierarchy and removing the directory the
> script created.
> 
> With hugetlb and memory bound to cgroup v1, per script:
> 
>                                 before      after
>   result                        fail        skip
>   cgroup2 mounts left behind       1           0
> 
> Fixes: 29750f71a9b4 ("hugetlb_cgroup: add hugetlb_cgroup reservation tests")
> Signed-off-by: Qiliang Yuan <[email protected]>

Hi Qiliang,

Thanks for the fixes. I think the problem you're describing is real and
the fix does address it. Sashiko raised a concern about failing tests
after this and leading to leaks [1].

At first I thought what Sashiko said made sense, but taking a step back
this SKIP path can be taken when we're mounted with v1, and the new
skip would prevent us from failing anyways so... I think it might
actually be OK, we probably can't reach the failure case once we skip.

( of course unless, I'm missing something ; -) )

LGTM!

Reviewed-by: Joshua Hahn <[email protected]>

[1] https://fb.workplace.com/photo/?fbid=2894459417496799&set=g.190352285091763

> ---
>  tools/testing/selftests/mm/charge_reserved_hugetlb.sh  |  8 ++++++++
>  tools/testing/selftests/mm/hugetlb_reparenting_test.sh | 10 ++++++++++
>  2 files changed, 18 insertions(+)
> 
> diff --git a/tools/testing/selftests/mm/charge_reserved_hugetlb.sh 
> b/tools/testing/selftests/mm/charge_reserved_hugetlb.sh
> index a1cfd3a349db6..65065b1377b24 100755
> --- a/tools/testing/selftests/mm/charge_reserved_hugetlb.sh
> +++ b/tools/testing/selftests/mm/charge_reserved_hugetlb.sh
> @@ -39,6 +39,14 @@ if [[ $cgroup2 ]]; then
>      mount -t cgroup2 none $cgroup_path
>      do_umount=1
>    fi
> +  if ! grep -qw hugetlb $cgroup_path/cgroup.controllers; then
> +    echo "hugetlb controller not available in cgroup v2. Skipping..."
> +    if [[ $do_umount ]]; then
> +      umount $cgroup_path
> +      rmdir $cgroup_path
> +    fi
> +    exit $ksft_skip
> +  fi
>    echo "+hugetlb" >$cgroup_path/cgroup.subtree_control
>  else
>    cgroup_path=$(mount -t cgroup | grep ",hugetlb" | awk '{print $3}')
> diff --git a/tools/testing/selftests/mm/hugetlb_reparenting_test.sh 
> b/tools/testing/selftests/mm/hugetlb_reparenting_test.sh
> index 95f517c3bd167..811912ae7d975 100755
> --- a/tools/testing/selftests/mm/hugetlb_reparenting_test.sh
> +++ b/tools/testing/selftests/mm/hugetlb_reparenting_test.sh
> @@ -29,6 +29,16 @@ if [[ $cgroup2 ]]; then
>      mount -t cgroup2 none $CGROUP_ROOT
>      do_umount=1
>    fi
> +  for ctrl in hugetlb memory; do
> +    if ! grep -qw $ctrl $CGROUP_ROOT/cgroup.controllers; then
> +      echo "$ctrl controller not available in cgroup v2. Skipping..."
> +      if [[ $do_umount ]]; then
> +        umount $CGROUP_ROOT
> +        rmdir $CGROUP_ROOT
> +      fi
> +      exit $ksft_skip
> +    fi
> +  done
>    echo "+hugetlb +memory" >$CGROUP_ROOT/cgroup.subtree_control
>  else
>    CGROUP_ROOT=$(mount -t cgroup | grep ",hugetlb" | awk '{print $3}')
> 
> ---
> base-commit: 437a7e839def0f505277022622fc59a8b071d6cf
> change-id: 20261016-bug-selftests-mm-hugetlb-cgroup2-skip-7fc0316486f2
> 
> Best regards,
> -- 
> Qiliang Yuan <[email protected]>

Reply via email to