]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
lib/test_vmalloc: add no_block_alloc_test case
authorUladzislau Rezki (Sony) <urezki@gmail.com>
Tue, 7 Oct 2025 12:20:26 +0000 (14:20 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 15 Oct 2025 04:28:27 +0000 (21:28 -0700)
Patch series "__vmalloc()/kvmalloc() and no-block support", v4.

This patch (of 10):

Introduce a new test case "no_block_alloc_test" that verifies non-blocking
allocations using __vmalloc() with GFP_ATOMIC and GFP_NOWAIT flags.

It is recommended to build kernel with CONFIG_DEBUG_ATOMIC_SLEEP enabled
to help catch "sleeping while atomic" issues.  This test ensures that
memory allocation logic under atomic constraints does not inadvertently
sleep.

Link: https://lkml.kernel.org/r/20251007122035.56347-2-urezki@gmail.com
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Marco Elver <elver@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/test_vmalloc.c

index 2815658ccc37550374f91a677e15a734e62c891d..aae5f4910aff79e969547ed1f870817f1ff3b6e3 100644 (file)
@@ -54,6 +54,7 @@ __param(int, run_test_mask, 7,
                "\t\tid: 256,  name: kvfree_rcu_1_arg_vmalloc_test\n"
                "\t\tid: 512,  name: kvfree_rcu_2_arg_vmalloc_test\n"
                "\t\tid: 1024, name: vm_map_ram_test\n"
+               "\t\tid: 2048, name: no_block_alloc_test\n"
                /* Add a new test case description here. */
 );
 
@@ -283,6 +284,30 @@ static int fix_size_alloc_test(void)
        return 0;
 }
 
+static int no_block_alloc_test(void)
+{
+       void *ptr;
+       int i;
+
+       for (i = 0; i < test_loop_count; i++) {
+               bool use_atomic = !!(get_random_u8() % 2);
+               gfp_t gfp = use_atomic ? GFP_ATOMIC : GFP_NOWAIT;
+               unsigned long size = (nr_pages > 0 ? nr_pages : 1) * PAGE_SIZE;
+
+               preempt_disable();
+               ptr = __vmalloc(size, gfp);
+               preempt_enable();
+
+               if (!ptr)
+                       return -1;
+
+               *((__u8 *)ptr) = 0;
+               vfree(ptr);
+       }
+
+       return 0;
+}
+
 static int
 pcpu_alloc_test(void)
 {
@@ -411,6 +436,7 @@ static struct test_case_desc test_case_array[] = {
        { "kvfree_rcu_1_arg_vmalloc_test", kvfree_rcu_1_arg_vmalloc_test, },
        { "kvfree_rcu_2_arg_vmalloc_test", kvfree_rcu_2_arg_vmalloc_test, },
        { "vm_map_ram_test", vm_map_ram_test, },
+       { "no_block_alloc_test", no_block_alloc_test, true },
        /* Add a new test case here. */
 };