From: Lorenzo Stoakes <ljs@kernel.org>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>, Shuah Khan <shuah@kernel.org>,
"Jason A. Donenfeld" <Jason@zx2c4.com>,
Anthony Yznaga <anthony.yznaga@oracle.com>,
Mark Brown <broonie@kernel.org>,
Sarthak Sharma <sarthak.sharma@arm.com>,
linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org,
Aishwarya TCV <Aishwarya.TCV@arm.com>
Subject: Re: [PATCH] selftests: mm: fix and speedup "droppable" test
Date: Fri, 12 Jun 2026 08:58:19 +0100 [thread overview]
Message-ID: <aiu39cOX1w9ICe_U@lucifer> (raw)
In-Reply-To: <20260611-droppable_test-v1-1-b6a73d99f658@kernel.org>
On Thu, Jun 11, 2026 at 12:01:55PM +0200, David Hildenbrand (Arm) wrote:
> The droppable test currently relies on creating memory pressure in a
> child process to trigger dropping the droppable pages.
Good lord.
>
> 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.
Good idea.
>
> 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
On my box, before:
$ time ./droppable
TAP version 13
1..1
ok 1 MAP_DROPPABLE: PASS
./droppable 5.89s user 0.01s system 99% cpu 5.921 total
After:
$ time ./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
./droppable 0.00s user 0.00s system 87% cpu 0.001 total
That's um. That's quite a difference.
It's good that we're doing something about slower tests :)
>
> Reported-by: Aishwarya TCV <Aishwarya.TCV@arm.com>
> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
Big improvement, thanks :)
Feel free to add:
Tested-by: Lorenzo Stoakes <ljs@kernel.org>
Reviewed-by: Lorenzo Stoakes <ljs@kernel.org>
> ---
> 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;
I guess regardless of page size this suffices as an arbitrary range over which
to check things work.
> + 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);
> }
> + ksft_test_result_fail("madvise(MADV_PAGEOUT) error: %s\n", strerror(errno));
> + exit(KSFT_FAIL);
> }
> +
> + dropped = memchr(alloc, 'A', alloc_size) == NULL;
> +
> + /*
> + * Speculative reference can temporarily prevent some
> + * pages from getting dropped. So sleep and retry.
> + *
> + * If a page is not droppable for 10s, something
> + * is seriously messed up and we want to fail.
> + */
> + if (dropped)
> + break;
> + sleep(1);
> }
> - kill(child, SIGTERM);
>
> - ksft_test_result_pass("MAP_DROPPABLE: PASS\n");
> - exit(KSFT_PASS);
> + ksft_test_result(dropped, "madvise(MADV_PAGEOUT) behavior\n");
> +
> + ksft_finished();
> }
>
> ---
>
> base-commit: d401506a8ee8ac6bc4a7767c17da036e9434a4a3
>
> change-id: 20260611-droppable_test-3737bd791dfb
>
> --
>
> Cheers,
>
> David
>
Thanks, Lorenzo
next prev parent reply other threads:[~2026-06-12 7:58 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-11 10:01 [PATCH] selftests: mm: fix and speedup "droppable" test David Hildenbrand (Arm)
2026-06-11 11:07 ` Sarthak Sharma
2026-06-11 11:26 ` David Hildenbrand (Arm)
2026-06-11 11:32 ` Lance Yang
2026-06-11 12:13 ` Sarthak Sharma
2026-06-11 11:15 ` Lance Yang
2026-06-11 11:19 ` Dev Jain
2026-06-11 11:26 ` David Hildenbrand (Arm)
2026-06-11 11:28 ` Dev Jain
2026-06-12 1:29 ` SeongJae Park
2026-06-12 7:35 ` David Hildenbrand (Arm)
2026-06-12 7:58 ` Lorenzo Stoakes [this message]
2026-06-12 8:00 ` David Hildenbrand (Arm)
2026-06-12 8:26 ` Lorenzo Stoakes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aiu39cOX1w9ICe_U@lucifer \
--to=ljs@kernel.org \
--cc=Aishwarya.TCV@arm.com \
--cc=Jason@zx2c4.com \
--cc=akpm@linux-foundation.org \
--cc=anthony.yznaga@oracle.com \
--cc=broonie@kernel.org \
--cc=david@kernel.org \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=sarthak.sharma@arm.com \
--cc=shuah@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.