On 6/12/26 03:29, SeongJae Park wrote:
> On Thu, 11 Jun 2026 12:01:55 +0200 "David Hildenbrand (Arm)" 
> <[email protected]> wrote:
> 
>> The droppable test currently relies on creating memory pressure in a
>> child process to trigger dropping the droppable pages.
>>
>> That not only takes a long time on some machines (allocating and filling
>> all that memory), on large machines this will not work as we hardcode the
>> area size to 134217728 bytes.
>>
>> ... further, we rely on timeouts to detect that memory was not dropped,
>> which is really suboptimal.
>>
>> Instead, let's just use MADV_PAGEOUT on a 2 MiB region. MADV_PAGEOUT works
>> with droppable memory even without swap.
>>
>> There is the low chance of MADV_PAGEOUT failing to drop a page because
>> of speculative references. We'll wait 1s and retry 10 times to
>> rule that unlikely case out as best as we can.
>>
>> On a machine without swap:
>>
>>      $ ./droppable
>>      TAP version 13
>>      1..1
>>      ok 1 madvise(MADV_PAGEOUT) behavior
>>      # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
>>
>> Reported-by: Aishwarya TCV <[email protected]>
>> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily 
>> freeable mappings")
> 
> Because this is a fix for a test, I think not Cc-ing stable@ is ok.  Further,
> arguably this is not a fix but an improvement?  No strong opinion, just
> thinking loud.

The test will hang forever on very large machines and timeout on large machines,
so it's a fix not just an improvement.

I think Andrew just automatically CCs stable on any test fixes, so yeah, CC;
stable makes sense for this one as well.

> 
>> Signed-off-by: David Hildenbrand (Arm) <[email protected]>
> 
> Reviewed-by: SeongJae Park <[email protected]>
> 
>> ---
>>  tools/testing/selftests/mm/droppable.c | 46 
>> +++++++++++++++++++---------------
>>  1 file changed, 26 insertions(+), 20 deletions(-)
>>
>> diff --git a/tools/testing/selftests/mm/droppable.c 
>> b/tools/testing/selftests/mm/droppable.c
>> index 30c8be37fcb9..57e1b6fc5569 100644
>> --- a/tools/testing/selftests/mm/droppable.c
>> +++ b/tools/testing/selftests/mm/droppable.c
>> @@ -17,10 +17,10 @@
>>  
>>  int main(int argc, char *argv[])
>>  {
>> -    size_t alloc_size = 134217728;
>> -    size_t page_size = getpagesize();
>> +    const size_t alloc_size = 2 * 1024 * 1024;
>> +    int retry_count = 10;
>> +    bool dropped;
>>      void *alloc;
>> -    pid_t child;
>>  
>>      ksft_print_header();
>>      ksft_set_plan(1);
>> @@ -35,26 +35,32 @@ int main(int argc, char *argv[])
>>              exit(KSFT_FAIL);
>>      }
>>      memset(alloc, 'A', alloc_size);
>> -    for (size_t i = 0; i < alloc_size; i += page_size)
>> -            assert(*(uint8_t *)(alloc + i));
>> -
>> -    child = fork();
>> -    assert(child >= 0);
>> -    if (!child) {
>> -            for (;;)
>> -                    *(char *)malloc(page_size) = 'B';
>> -    }
>>  
>> -    for (bool done = false; !done;) {
>> -            for (size_t i = 0; i < alloc_size; i += page_size) {
>> -                    if (!*(uint8_t *)(alloc + i)) {
>> -                            done = true;
>> -                            break;
>> +    while (retry_count--) {
>> +            if (madvise(alloc, alloc_size, MADV_PAGEOUT)) {
>> +                    if (errno == EINVAL) {
>> +                            ksft_test_result_skip("madvise(MADV_PAGEOUT) 
>> not supported\n");
>> +                            exit(KSFT_SKIP);
> 
> This check is for a case that this test is running against an old kernel that
> doesn't have MADV_PAGEOUT?

Yes!

> 
> Assuming so, I was first thinking this check might not really needed, assuming
> the test runner would pick the kselftest code from the running kernel's source
> code.  But I recalled some people do get kselftest code from random place.  So
> this check seems nice to me.

Yeah, we try to handle older kernels on a best-effort basis. This one is rather
simple :)

Thanks!

-- 
Cheers,

David

Reply via email to