On 05/08/2025 11:36, David Hildenbrand wrote: > On 04.08.25 17:40, Usama Arif wrote: >> The test will set the global system THP setting to never, madvise >> or always depending on the fixture variant and the 2M setting to >> inherit before it starts (and reset to original at teardown) >> >> This tests if the process can: >> - successfully set and get the policy to disable THPs expect for madvise. >> - get hugepages only on MADV_HUGE and MADV_COLLAPSE if the global policy >> is madvise/always and only with MADV_COLLAPSE if the global policy is >> never. >> - successfully reset the policy of the process. >> - after reset, only get hugepages with: >> - MADV_COLLAPSE when policy is set to never. >> - MADV_HUGE and MADV_COLLAPSE when policy is set to madvise. >> - always when policy is set to "always". >> - repeat the above tests in a forked process to make sure the policy is >> carried across forks. >> >> Signed-off-by: Usama Arif <usamaarif642@xxxxxxxxx> >> --- > > [...] > >> +FIXTURE_VARIANT(prctl_thp_disable_except_madvise) >> +{ >> + enum thp_enabled thp_policy; >> +}; >> + >> +FIXTURE_VARIANT_ADD(prctl_thp_disable_except_madvise, never) >> +{ >> + .thp_policy = THP_NEVER, >> +}; >> + >> +FIXTURE_VARIANT_ADD(prctl_thp_disable_except_madvise, madvise) >> +{ >> + .thp_policy = THP_MADVISE, >> +}; >> + >> +FIXTURE_VARIANT_ADD(prctl_thp_disable_except_madvise, always) >> +{ >> + .thp_policy = THP_ALWAYS, >> +}; >> + >> +FIXTURE_SETUP(prctl_thp_disable_except_madvise) >> +{ >> + if (!thp_available()) >> + SKIP(return, "Transparent Hugepages not available\n"); >> + >> + self->pmdsize = read_pmd_pagesize(); >> + if (!self->pmdsize) >> + SKIP(return, "Unable to read PMD size\n"); > > Should we test here if the kernel knows PR_THP_DISABLE_EXCEPT_ADVISED, and if not, skip? > > Might be as simple as trying issuing two prctl, and making sure the first disabling attempt doesn't fail. If so, SKIP. > > Nothing else jumped at me. Can you include a test run result in the patch description? > Instead of 2 prctls, I think doing just the below should be enough: diff --git a/tools/testing/selftests/mm/prctl_thp_disable.c b/tools/testing/selftests/mm/prctl_thp_disable.c index 93cedaa59854..da28bc4441ed 100644 --- a/tools/testing/selftests/mm/prctl_thp_disable.c +++ b/tools/testing/selftests/mm/prctl_thp_disable.c @@ -236,6 +236,9 @@ FIXTURE_SETUP(prctl_thp_disable_except_madvise) if (!self->pmdsize) SKIP(return, "Unable to read PMD size\n"); + if (prctl(PR_SET_THP_DISABLE, 1, PR_THP_DISABLE_EXCEPT_ADVISED, NULL, NULL)) + SKIP(return, "Unable to set PR_THP_DISABLE_EXCEPT_ADVISED\n"); + thp_save_settings(); thp_read_settings(&self->settings); self->settings.thp_enabled = variant->thp_policy; Will include the test run result in the last patch description. Just adding it here as well: ./prctl_thp_disable TAP version 13 1..12 # Starting 12 tests from 6 test cases. # RUN prctl_thp_disable_completely.never.nofork ... # OK prctl_thp_disable_completely.never.nofork ok 1 prctl_thp_disable_completely.never.nofork # RUN prctl_thp_disable_completely.never.fork ... # OK prctl_thp_disable_completely.never.fork ok 2 prctl_thp_disable_completely.never.fork # RUN prctl_thp_disable_completely.madvise.nofork ... # OK prctl_thp_disable_completely.madvise.nofork ok 3 prctl_thp_disable_completely.madvise.nofork # RUN prctl_thp_disable_completely.madvise.fork ... # OK prctl_thp_disable_completely.madvise.fork ok 4 prctl_thp_disable_completely.madvise.fork # RUN prctl_thp_disable_completely.always.nofork ... # OK prctl_thp_disable_completely.always.nofork ok 5 prctl_thp_disable_completely.always.nofork # RUN prctl_thp_disable_completely.always.fork ... # OK prctl_thp_disable_completely.always.fork ok 6 prctl_thp_disable_completely.always.fork # RUN prctl_thp_disable_except_madvise.never.nofork ... # OK prctl_thp_disable_except_madvise.never.nofork ok 7 prctl_thp_disable_except_madvise.never.nofork # RUN prctl_thp_disable_except_madvise.never.fork ... # OK prctl_thp_disable_except_madvise.never.fork ok 8 prctl_thp_disable_except_madvise.never.fork # RUN prctl_thp_disable_except_madvise.madvise.nofork ... # OK prctl_thp_disable_except_madvise.madvise.nofork ok 9 prctl_thp_disable_except_madvise.madvise.nofork # RUN prctl_thp_disable_except_madvise.madvise.fork ... # OK prctl_thp_disable_except_madvise.madvise.fork ok 10 prctl_thp_disable_except_madvise.madvise.fork # RUN prctl_thp_disable_except_madvise.always.nofork ... # OK prctl_thp_disable_except_madvise.always.nofork ok 11 prctl_thp_disable_except_madvise.always.nofork # RUN prctl_thp_disable_except_madvise.always.fork ... # OK prctl_thp_disable_except_madvise.always.fork ok 12 prctl_thp_disable_except_madvise.always.fork # PASSED: 12 / 12 tests passed. # Totals: pass:12 fail:0 xfail:0 xpass:0 skip:0 error:0