[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <955ed533-dd7e-45e6-a2cb-f379a5878ef7@gmail.com>
Date: Tue, 5 Aug 2025 15:26:16 +0100
From: Usama Arif <usamaarif642@...il.com>
To: David Hildenbrand <david@...hat.com>,
Andrew Morton <akpm@...ux-foundation.org>, linux-mm@...ck.org
Cc: linux-fsdevel@...r.kernel.org, corbet@....net, rppt@...nel.org,
surenb@...gle.com, mhocko@...e.com, hannes@...xchg.org, baohua@...nel.org,
shakeel.butt@...ux.dev, riel@...riel.com, ziy@...dia.com,
laoar.shao@...il.com, dev.jain@....com, baolin.wang@...ux.alibaba.com,
npache@...hat.com, lorenzo.stoakes@...cle.com, Liam.Howlett@...cle.com,
ryan.roberts@....com, vbabka@...e.cz, jannh@...gle.com,
Arnd Bergmann <arnd@...db.de>, sj@...nel.org, linux-kernel@...r.kernel.org,
linux-doc@...r.kernel.org, kernel-team@...a.com
Subject: Re: [PATCH v3 5/6] selftests: prctl: introduce tests for disabling
THPs completely
On 05/08/2025 13:55, David Hildenbrand wrote:
> On 05.08.25 14:46, Usama Arif wrote:
>>
>>
>> On 05/08/2025 13:39, David Hildenbrand wrote:
>>>> +FIXTURE_SETUP(prctl_thp_disable_completely)
>>>> +{
>>>> + 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");
>>>> +
>>>> + thp_save_settings();
>>>> + thp_read_settings(&self->settings);
>>>> + self->settings.thp_enabled = variant->thp_policy;
>>>> + self->settings.hugepages[sz2ord(self->pmdsize, getpagesize())].enabled = THP_INHERIT;
>>>
>>> Oh, one more thing: should we set all other sizes also to THP_INHERIT or (for simplicity) THP_NEVER?
>>>
>>
>> hmm do we need to? I am hoping that we should always get the PMD size THP no matter what the policy
>> for others is in the scenario we have?
>
> Assuming 64K is set to "always", couldn't it mislead us in the "madvise"/"never" test cases in some scenarios?
>
I tried it with 64K to always and seems to be ok. check_huge_anon checks AnonHugepages from smaps which
only indicates the pmd mapped THPs only. So I think should be ok?
Happy to set them to never and the change is probably something simple like below (untested), but
just trying to understand better the need for it.
diff --git a/tools/testing/selftests/mm/prctl_thp_disable.c b/tools/testing/selftests/mm/prctl_thp_disable.c
index 4b072d4ecc30..ee692c397835 100644
--- a/tools/testing/selftests/mm/prctl_thp_disable.c
+++ b/tools/testing/selftests/mm/prctl_thp_disable.c
@@ -142,6 +142,8 @@ FIXTURE_SETUP(prctl_thp_disable_completely)
thp_save_settings();
thp_read_settings(&self->settings);
self->settings.thp_enabled = variant->thp_policy;
+ for (int i = 1; i < sz2ord(self->pmdsize, getpagesize()); i++)
+ self->settings.hugepages[i].enabled = THP_INHERIT;
self->settings.hugepages[sz2ord(self->pmdsize, getpagesize())].enabled = THP_INHERIT;
thp_write_settings(&self->settings);
}
@@ -244,6 +246,8 @@ FIXTURE_SETUP(prctl_thp_disable_except_madvise)
thp_save_settings();
thp_read_settings(&self->settings);
self->settings.thp_enabled = variant->thp_policy;
+ for (int i = 1; i < sz2ord(self->pmdsize, getpagesize()); i++)
+ self->settings.hugepages[i].enabled = THP_INHERIT;
self->settings.hugepages[sz2ord(self->pmdsize, getpagesize())].enabled = THP_INHERIT;
thp_write_settings(&self->settings);
}
[root@vm7 vmuser]# echo always > /sys/kernel/mm/transparent_hugepage/hugepages-64kB/enabled
[root@vm7 vmuser]# ./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
Powered by blists - more mailing lists