13f21a6b7SUladzislau Rezki (Sony) // SPDX-License-Identifier: GPL-2.0 23f21a6b7SUladzislau Rezki (Sony) 33f21a6b7SUladzislau Rezki (Sony) /* 43f21a6b7SUladzislau Rezki (Sony) * Test module for stress and analyze performance of vmalloc allocator. 53f21a6b7SUladzislau Rezki (Sony) * (C) 2018 Uladzislau Rezki (Sony) <[email protected]> 63f21a6b7SUladzislau Rezki (Sony) */ 73f21a6b7SUladzislau Rezki (Sony) #include <linux/init.h> 83f21a6b7SUladzislau Rezki (Sony) #include <linux/kernel.h> 93f21a6b7SUladzislau Rezki (Sony) #include <linux/module.h> 103f21a6b7SUladzislau Rezki (Sony) #include <linux/vmalloc.h> 113f21a6b7SUladzislau Rezki (Sony) #include <linux/random.h> 123f21a6b7SUladzislau Rezki (Sony) #include <linux/kthread.h> 133f21a6b7SUladzislau Rezki (Sony) #include <linux/moduleparam.h> 143f21a6b7SUladzislau Rezki (Sony) #include <linux/completion.h> 153f21a6b7SUladzislau Rezki (Sony) #include <linux/delay.h> 163f21a6b7SUladzislau Rezki (Sony) #include <linux/rwsem.h> 173f21a6b7SUladzislau Rezki (Sony) #include <linux/mm.h> 18*da4fc00aSUladzislau Rezki (Sony) #include <linux/rcupdate.h> 19*da4fc00aSUladzislau Rezki (Sony) #include <linux/slab.h> 203f21a6b7SUladzislau Rezki (Sony) 213f21a6b7SUladzislau Rezki (Sony) #define __param(type, name, init, msg) \ 223f21a6b7SUladzislau Rezki (Sony) static type name = init; \ 233f21a6b7SUladzislau Rezki (Sony) module_param(name, type, 0444); \ 243f21a6b7SUladzislau Rezki (Sony) MODULE_PARM_DESC(name, msg) \ 253f21a6b7SUladzislau Rezki (Sony) 263f21a6b7SUladzislau Rezki (Sony) __param(bool, single_cpu_test, false, 273f21a6b7SUladzislau Rezki (Sony) "Use single first online CPU to run tests"); 283f21a6b7SUladzislau Rezki (Sony) 293f21a6b7SUladzislau Rezki (Sony) __param(bool, sequential_test_order, false, 303f21a6b7SUladzislau Rezki (Sony) "Use sequential stress tests order"); 313f21a6b7SUladzislau Rezki (Sony) 323f21a6b7SUladzislau Rezki (Sony) __param(int, test_repeat_count, 1, 333f21a6b7SUladzislau Rezki (Sony) "Set test repeat counter"); 343f21a6b7SUladzislau Rezki (Sony) 353f21a6b7SUladzislau Rezki (Sony) __param(int, test_loop_count, 1000000, 363f21a6b7SUladzislau Rezki (Sony) "Set test loop counter"); 373f21a6b7SUladzislau Rezki (Sony) 383f21a6b7SUladzislau Rezki (Sony) __param(int, run_test_mask, INT_MAX, 393f21a6b7SUladzislau Rezki (Sony) "Set tests specified in the mask.\n\n" 403f21a6b7SUladzislau Rezki (Sony) "\t\tid: 1, name: fix_size_alloc_test\n" 413f21a6b7SUladzislau Rezki (Sony) "\t\tid: 2, name: full_fit_alloc_test\n" 423f21a6b7SUladzislau Rezki (Sony) "\t\tid: 4, name: long_busy_list_alloc_test\n" 433f21a6b7SUladzislau Rezki (Sony) "\t\tid: 8, name: random_size_alloc_test\n" 443f21a6b7SUladzislau Rezki (Sony) "\t\tid: 16, name: fix_align_alloc_test\n" 453f21a6b7SUladzislau Rezki (Sony) "\t\tid: 32, name: random_size_align_alloc_test\n" 463f21a6b7SUladzislau Rezki (Sony) "\t\tid: 64, name: align_shift_alloc_test\n" 473f21a6b7SUladzislau Rezki (Sony) "\t\tid: 128, name: pcpu_alloc_test\n" 48*da4fc00aSUladzislau Rezki (Sony) "\t\tid: 256, name: kvfree_rcu_1_arg_vmalloc_test\n" 49*da4fc00aSUladzislau Rezki (Sony) "\t\tid: 512, name: kvfree_rcu_2_arg_vmalloc_test\n" 50*da4fc00aSUladzislau Rezki (Sony) "\t\tid: 1024, name: kvfree_rcu_1_arg_slab_test\n" 51*da4fc00aSUladzislau Rezki (Sony) "\t\tid: 2048, name: kvfree_rcu_2_arg_slab_test\n" 523f21a6b7SUladzislau Rezki (Sony) /* Add a new test case description here. */ 533f21a6b7SUladzislau Rezki (Sony) ); 543f21a6b7SUladzislau Rezki (Sony) 553f21a6b7SUladzislau Rezki (Sony) /* 563f21a6b7SUladzislau Rezki (Sony) * Depends on single_cpu_test parameter. If it is true, then 573f21a6b7SUladzislau Rezki (Sony) * use first online CPU to trigger a test on, otherwise go with 583f21a6b7SUladzislau Rezki (Sony) * all online CPUs. 593f21a6b7SUladzislau Rezki (Sony) */ 603f21a6b7SUladzislau Rezki (Sony) static cpumask_t cpus_run_test_mask = CPU_MASK_NONE; 613f21a6b7SUladzislau Rezki (Sony) 623f21a6b7SUladzislau Rezki (Sony) /* 633f21a6b7SUladzislau Rezki (Sony) * Read write semaphore for synchronization of setup 643f21a6b7SUladzislau Rezki (Sony) * phase that is done in main thread and workers. 653f21a6b7SUladzislau Rezki (Sony) */ 663f21a6b7SUladzislau Rezki (Sony) static DECLARE_RWSEM(prepare_for_test_rwsem); 673f21a6b7SUladzislau Rezki (Sony) 683f21a6b7SUladzislau Rezki (Sony) /* 693f21a6b7SUladzislau Rezki (Sony) * Completion tracking for worker threads. 703f21a6b7SUladzislau Rezki (Sony) */ 713f21a6b7SUladzislau Rezki (Sony) static DECLARE_COMPLETION(test_all_done_comp); 723f21a6b7SUladzislau Rezki (Sony) static atomic_t test_n_undone = ATOMIC_INIT(0); 733f21a6b7SUladzislau Rezki (Sony) 743f21a6b7SUladzislau Rezki (Sony) static inline void 753f21a6b7SUladzislau Rezki (Sony) test_report_one_done(void) 763f21a6b7SUladzislau Rezki (Sony) { 773f21a6b7SUladzislau Rezki (Sony) if (atomic_dec_and_test(&test_n_undone)) 783f21a6b7SUladzislau Rezki (Sony) complete(&test_all_done_comp); 793f21a6b7SUladzislau Rezki (Sony) } 803f21a6b7SUladzislau Rezki (Sony) 813f21a6b7SUladzislau Rezki (Sony) static int random_size_align_alloc_test(void) 823f21a6b7SUladzislau Rezki (Sony) { 833f21a6b7SUladzislau Rezki (Sony) unsigned long size, align, rnd; 843f21a6b7SUladzislau Rezki (Sony) void *ptr; 853f21a6b7SUladzislau Rezki (Sony) int i; 863f21a6b7SUladzislau Rezki (Sony) 873f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 883f21a6b7SUladzislau Rezki (Sony) get_random_bytes(&rnd, sizeof(rnd)); 893f21a6b7SUladzislau Rezki (Sony) 903f21a6b7SUladzislau Rezki (Sony) /* 913f21a6b7SUladzislau Rezki (Sony) * Maximum 1024 pages, if PAGE_SIZE is 4096. 923f21a6b7SUladzislau Rezki (Sony) */ 933f21a6b7SUladzislau Rezki (Sony) align = 1 << (rnd % 23); 943f21a6b7SUladzislau Rezki (Sony) 953f21a6b7SUladzislau Rezki (Sony) /* 963f21a6b7SUladzislau Rezki (Sony) * Maximum 10 pages. 973f21a6b7SUladzislau Rezki (Sony) */ 983f21a6b7SUladzislau Rezki (Sony) size = ((rnd % 10) + 1) * PAGE_SIZE; 993f21a6b7SUladzislau Rezki (Sony) 100c3f896dcSChristoph Hellwig ptr = __vmalloc_node(size, align, GFP_KERNEL | __GFP_ZERO, 0, 101c3f896dcSChristoph Hellwig __builtin_return_address(0)); 1023f21a6b7SUladzislau Rezki (Sony) if (!ptr) 1033f21a6b7SUladzislau Rezki (Sony) return -1; 1043f21a6b7SUladzislau Rezki (Sony) 1053f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 1063f21a6b7SUladzislau Rezki (Sony) } 1073f21a6b7SUladzislau Rezki (Sony) 1083f21a6b7SUladzislau Rezki (Sony) return 0; 1093f21a6b7SUladzislau Rezki (Sony) } 1103f21a6b7SUladzislau Rezki (Sony) 1113f21a6b7SUladzislau Rezki (Sony) /* 1123f21a6b7SUladzislau Rezki (Sony) * This test case is supposed to be failed. 1133f21a6b7SUladzislau Rezki (Sony) */ 1143f21a6b7SUladzislau Rezki (Sony) static int align_shift_alloc_test(void) 1153f21a6b7SUladzislau Rezki (Sony) { 1163f21a6b7SUladzislau Rezki (Sony) unsigned long align; 1173f21a6b7SUladzislau Rezki (Sony) void *ptr; 1183f21a6b7SUladzislau Rezki (Sony) int i; 1193f21a6b7SUladzislau Rezki (Sony) 1203f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < BITS_PER_LONG; i++) { 1213f21a6b7SUladzislau Rezki (Sony) align = ((unsigned long) 1) << i; 1223f21a6b7SUladzislau Rezki (Sony) 123c3f896dcSChristoph Hellwig ptr = __vmalloc_node(PAGE_SIZE, align, GFP_KERNEL|__GFP_ZERO, 0, 124c3f896dcSChristoph Hellwig __builtin_return_address(0)); 1253f21a6b7SUladzislau Rezki (Sony) if (!ptr) 1263f21a6b7SUladzislau Rezki (Sony) return -1; 1273f21a6b7SUladzislau Rezki (Sony) 1283f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 1293f21a6b7SUladzislau Rezki (Sony) } 1303f21a6b7SUladzislau Rezki (Sony) 1313f21a6b7SUladzislau Rezki (Sony) return 0; 1323f21a6b7SUladzislau Rezki (Sony) } 1333f21a6b7SUladzislau Rezki (Sony) 1343f21a6b7SUladzislau Rezki (Sony) static int fix_align_alloc_test(void) 1353f21a6b7SUladzislau Rezki (Sony) { 1363f21a6b7SUladzislau Rezki (Sony) void *ptr; 1373f21a6b7SUladzislau Rezki (Sony) int i; 1383f21a6b7SUladzislau Rezki (Sony) 1393f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 140c3f896dcSChristoph Hellwig ptr = __vmalloc_node(5 * PAGE_SIZE, THREAD_ALIGN << 1, 141c3f896dcSChristoph Hellwig GFP_KERNEL | __GFP_ZERO, 0, 142c3f896dcSChristoph Hellwig __builtin_return_address(0)); 1433f21a6b7SUladzislau Rezki (Sony) if (!ptr) 1443f21a6b7SUladzislau Rezki (Sony) return -1; 1453f21a6b7SUladzislau Rezki (Sony) 1463f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 1473f21a6b7SUladzislau Rezki (Sony) } 1483f21a6b7SUladzislau Rezki (Sony) 1493f21a6b7SUladzislau Rezki (Sony) return 0; 1503f21a6b7SUladzislau Rezki (Sony) } 1513f21a6b7SUladzislau Rezki (Sony) 1523f21a6b7SUladzislau Rezki (Sony) static int random_size_alloc_test(void) 1533f21a6b7SUladzislau Rezki (Sony) { 1543f21a6b7SUladzislau Rezki (Sony) unsigned int n; 1553f21a6b7SUladzislau Rezki (Sony) void *p; 1563f21a6b7SUladzislau Rezki (Sony) int i; 1573f21a6b7SUladzislau Rezki (Sony) 1583f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 1593f21a6b7SUladzislau Rezki (Sony) get_random_bytes(&n, sizeof(i)); 1603f21a6b7SUladzislau Rezki (Sony) n = (n % 100) + 1; 1613f21a6b7SUladzislau Rezki (Sony) 1623f21a6b7SUladzislau Rezki (Sony) p = vmalloc(n * PAGE_SIZE); 1633f21a6b7SUladzislau Rezki (Sony) 1643f21a6b7SUladzislau Rezki (Sony) if (!p) 1653f21a6b7SUladzislau Rezki (Sony) return -1; 1663f21a6b7SUladzislau Rezki (Sony) 1673f21a6b7SUladzislau Rezki (Sony) *((__u8 *)p) = 1; 1683f21a6b7SUladzislau Rezki (Sony) vfree(p); 1693f21a6b7SUladzislau Rezki (Sony) } 1703f21a6b7SUladzislau Rezki (Sony) 1713f21a6b7SUladzislau Rezki (Sony) return 0; 1723f21a6b7SUladzislau Rezki (Sony) } 1733f21a6b7SUladzislau Rezki (Sony) 1743f21a6b7SUladzislau Rezki (Sony) static int long_busy_list_alloc_test(void) 1753f21a6b7SUladzislau Rezki (Sony) { 1763f21a6b7SUladzislau Rezki (Sony) void *ptr_1, *ptr_2; 1773f21a6b7SUladzislau Rezki (Sony) void **ptr; 1783f21a6b7SUladzislau Rezki (Sony) int rv = -1; 1793f21a6b7SUladzislau Rezki (Sony) int i; 1803f21a6b7SUladzislau Rezki (Sony) 1813f21a6b7SUladzislau Rezki (Sony) ptr = vmalloc(sizeof(void *) * 15000); 1823f21a6b7SUladzislau Rezki (Sony) if (!ptr) 1833f21a6b7SUladzislau Rezki (Sony) return rv; 1843f21a6b7SUladzislau Rezki (Sony) 1853f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < 15000; i++) 1863f21a6b7SUladzislau Rezki (Sony) ptr[i] = vmalloc(1 * PAGE_SIZE); 1873f21a6b7SUladzislau Rezki (Sony) 1883f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 1893f21a6b7SUladzislau Rezki (Sony) ptr_1 = vmalloc(100 * PAGE_SIZE); 1903f21a6b7SUladzislau Rezki (Sony) if (!ptr_1) 1913f21a6b7SUladzislau Rezki (Sony) goto leave; 1923f21a6b7SUladzislau Rezki (Sony) 1933f21a6b7SUladzislau Rezki (Sony) ptr_2 = vmalloc(1 * PAGE_SIZE); 1943f21a6b7SUladzislau Rezki (Sony) if (!ptr_2) { 1953f21a6b7SUladzislau Rezki (Sony) vfree(ptr_1); 1963f21a6b7SUladzislau Rezki (Sony) goto leave; 1973f21a6b7SUladzislau Rezki (Sony) } 1983f21a6b7SUladzislau Rezki (Sony) 1993f21a6b7SUladzislau Rezki (Sony) *((__u8 *)ptr_1) = 0; 2003f21a6b7SUladzislau Rezki (Sony) *((__u8 *)ptr_2) = 1; 2013f21a6b7SUladzislau Rezki (Sony) 2023f21a6b7SUladzislau Rezki (Sony) vfree(ptr_1); 2033f21a6b7SUladzislau Rezki (Sony) vfree(ptr_2); 2043f21a6b7SUladzislau Rezki (Sony) } 2053f21a6b7SUladzislau Rezki (Sony) 2063f21a6b7SUladzislau Rezki (Sony) /* Success */ 2073f21a6b7SUladzislau Rezki (Sony) rv = 0; 2083f21a6b7SUladzislau Rezki (Sony) 2093f21a6b7SUladzislau Rezki (Sony) leave: 2103f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < 15000; i++) 2113f21a6b7SUladzislau Rezki (Sony) vfree(ptr[i]); 2123f21a6b7SUladzislau Rezki (Sony) 2133f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 2143f21a6b7SUladzislau Rezki (Sony) return rv; 2153f21a6b7SUladzislau Rezki (Sony) } 2163f21a6b7SUladzislau Rezki (Sony) 2173f21a6b7SUladzislau Rezki (Sony) static int full_fit_alloc_test(void) 2183f21a6b7SUladzislau Rezki (Sony) { 2193f21a6b7SUladzislau Rezki (Sony) void **ptr, **junk_ptr, *tmp; 2203f21a6b7SUladzislau Rezki (Sony) int junk_length; 2213f21a6b7SUladzislau Rezki (Sony) int rv = -1; 2223f21a6b7SUladzislau Rezki (Sony) int i; 2233f21a6b7SUladzislau Rezki (Sony) 2243f21a6b7SUladzislau Rezki (Sony) junk_length = fls(num_online_cpus()); 2253f21a6b7SUladzislau Rezki (Sony) junk_length *= (32 * 1024 * 1024 / PAGE_SIZE); 2263f21a6b7SUladzislau Rezki (Sony) 2273f21a6b7SUladzislau Rezki (Sony) ptr = vmalloc(sizeof(void *) * junk_length); 2283f21a6b7SUladzislau Rezki (Sony) if (!ptr) 2293f21a6b7SUladzislau Rezki (Sony) return rv; 2303f21a6b7SUladzislau Rezki (Sony) 2313f21a6b7SUladzislau Rezki (Sony) junk_ptr = vmalloc(sizeof(void *) * junk_length); 2323f21a6b7SUladzislau Rezki (Sony) if (!junk_ptr) { 2333f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 2343f21a6b7SUladzislau Rezki (Sony) return rv; 2353f21a6b7SUladzislau Rezki (Sony) } 2363f21a6b7SUladzislau Rezki (Sony) 2373f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < junk_length; i++) { 2383f21a6b7SUladzislau Rezki (Sony) ptr[i] = vmalloc(1 * PAGE_SIZE); 2393f21a6b7SUladzislau Rezki (Sony) junk_ptr[i] = vmalloc(1 * PAGE_SIZE); 2403f21a6b7SUladzislau Rezki (Sony) } 2413f21a6b7SUladzislau Rezki (Sony) 2423f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < junk_length; i++) 2433f21a6b7SUladzislau Rezki (Sony) vfree(junk_ptr[i]); 2443f21a6b7SUladzislau Rezki (Sony) 2453f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 2463f21a6b7SUladzislau Rezki (Sony) tmp = vmalloc(1 * PAGE_SIZE); 2473f21a6b7SUladzislau Rezki (Sony) 2483f21a6b7SUladzislau Rezki (Sony) if (!tmp) 2493f21a6b7SUladzislau Rezki (Sony) goto error; 2503f21a6b7SUladzislau Rezki (Sony) 2513f21a6b7SUladzislau Rezki (Sony) *((__u8 *)tmp) = 1; 2523f21a6b7SUladzislau Rezki (Sony) vfree(tmp); 2533f21a6b7SUladzislau Rezki (Sony) } 2543f21a6b7SUladzislau Rezki (Sony) 2553f21a6b7SUladzislau Rezki (Sony) /* Success */ 2563f21a6b7SUladzislau Rezki (Sony) rv = 0; 2573f21a6b7SUladzislau Rezki (Sony) 2583f21a6b7SUladzislau Rezki (Sony) error: 2593f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < junk_length; i++) 2603f21a6b7SUladzislau Rezki (Sony) vfree(ptr[i]); 2613f21a6b7SUladzislau Rezki (Sony) 2623f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 2633f21a6b7SUladzislau Rezki (Sony) vfree(junk_ptr); 2643f21a6b7SUladzislau Rezki (Sony) 2653f21a6b7SUladzislau Rezki (Sony) return rv; 2663f21a6b7SUladzislau Rezki (Sony) } 2673f21a6b7SUladzislau Rezki (Sony) 2683f21a6b7SUladzislau Rezki (Sony) static int fix_size_alloc_test(void) 2693f21a6b7SUladzislau Rezki (Sony) { 2703f21a6b7SUladzislau Rezki (Sony) void *ptr; 2713f21a6b7SUladzislau Rezki (Sony) int i; 2723f21a6b7SUladzislau Rezki (Sony) 2733f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 2743f21a6b7SUladzislau Rezki (Sony) ptr = vmalloc(3 * PAGE_SIZE); 2753f21a6b7SUladzislau Rezki (Sony) 2763f21a6b7SUladzislau Rezki (Sony) if (!ptr) 2773f21a6b7SUladzislau Rezki (Sony) return -1; 2783f21a6b7SUladzislau Rezki (Sony) 2793f21a6b7SUladzislau Rezki (Sony) *((__u8 *)ptr) = 0; 2803f21a6b7SUladzislau Rezki (Sony) 2813f21a6b7SUladzislau Rezki (Sony) vfree(ptr); 2823f21a6b7SUladzislau Rezki (Sony) } 2833f21a6b7SUladzislau Rezki (Sony) 2843f21a6b7SUladzislau Rezki (Sony) return 0; 2853f21a6b7SUladzislau Rezki (Sony) } 2863f21a6b7SUladzislau Rezki (Sony) 2873f21a6b7SUladzislau Rezki (Sony) static int 2883f21a6b7SUladzislau Rezki (Sony) pcpu_alloc_test(void) 2893f21a6b7SUladzislau Rezki (Sony) { 2903f21a6b7SUladzislau Rezki (Sony) int rv = 0; 2913f21a6b7SUladzislau Rezki (Sony) #ifndef CONFIG_NEED_PER_CPU_KM 2923f21a6b7SUladzislau Rezki (Sony) void __percpu **pcpu; 2933f21a6b7SUladzislau Rezki (Sony) size_t size, align; 2943f21a6b7SUladzislau Rezki (Sony) int i; 2953f21a6b7SUladzislau Rezki (Sony) 2963f21a6b7SUladzislau Rezki (Sony) pcpu = vmalloc(sizeof(void __percpu *) * 35000); 2973f21a6b7SUladzislau Rezki (Sony) if (!pcpu) 2983f21a6b7SUladzislau Rezki (Sony) return -1; 2993f21a6b7SUladzislau Rezki (Sony) 3003f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < 35000; i++) { 3013f21a6b7SUladzislau Rezki (Sony) unsigned int r; 3023f21a6b7SUladzislau Rezki (Sony) 3033f21a6b7SUladzislau Rezki (Sony) get_random_bytes(&r, sizeof(i)); 3043f21a6b7SUladzislau Rezki (Sony) size = (r % (PAGE_SIZE / 4)) + 1; 3053f21a6b7SUladzislau Rezki (Sony) 3063f21a6b7SUladzislau Rezki (Sony) /* 3073f21a6b7SUladzislau Rezki (Sony) * Maximum PAGE_SIZE 3083f21a6b7SUladzislau Rezki (Sony) */ 3093f21a6b7SUladzislau Rezki (Sony) get_random_bytes(&r, sizeof(i)); 3103f21a6b7SUladzislau Rezki (Sony) align = 1 << ((i % 11) + 1); 3113f21a6b7SUladzislau Rezki (Sony) 3123f21a6b7SUladzislau Rezki (Sony) pcpu[i] = __alloc_percpu(size, align); 3133f21a6b7SUladzislau Rezki (Sony) if (!pcpu[i]) 3143f21a6b7SUladzislau Rezki (Sony) rv = -1; 3153f21a6b7SUladzislau Rezki (Sony) } 3163f21a6b7SUladzislau Rezki (Sony) 3173f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < 35000; i++) 3183f21a6b7SUladzislau Rezki (Sony) free_percpu(pcpu[i]); 3193f21a6b7SUladzislau Rezki (Sony) 3203f21a6b7SUladzislau Rezki (Sony) vfree(pcpu); 3213f21a6b7SUladzislau Rezki (Sony) #endif 3223f21a6b7SUladzislau Rezki (Sony) return rv; 3233f21a6b7SUladzislau Rezki (Sony) } 3243f21a6b7SUladzislau Rezki (Sony) 325*da4fc00aSUladzislau Rezki (Sony) struct test_kvfree_rcu { 326*da4fc00aSUladzislau Rezki (Sony) struct rcu_head rcu; 327*da4fc00aSUladzislau Rezki (Sony) unsigned char array[20]; 328*da4fc00aSUladzislau Rezki (Sony) }; 329*da4fc00aSUladzislau Rezki (Sony) 330*da4fc00aSUladzislau Rezki (Sony) static int 331*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu_1_arg_vmalloc_test(void) 332*da4fc00aSUladzislau Rezki (Sony) { 333*da4fc00aSUladzislau Rezki (Sony) struct test_kvfree_rcu *p; 334*da4fc00aSUladzislau Rezki (Sony) int i; 335*da4fc00aSUladzislau Rezki (Sony) 336*da4fc00aSUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 337*da4fc00aSUladzislau Rezki (Sony) p = vmalloc(1 * PAGE_SIZE); 338*da4fc00aSUladzislau Rezki (Sony) if (!p) 339*da4fc00aSUladzislau Rezki (Sony) return -1; 340*da4fc00aSUladzislau Rezki (Sony) 341*da4fc00aSUladzislau Rezki (Sony) p->array[0] = 'a'; 342*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu(p); 343*da4fc00aSUladzislau Rezki (Sony) } 344*da4fc00aSUladzislau Rezki (Sony) 345*da4fc00aSUladzislau Rezki (Sony) return 0; 346*da4fc00aSUladzislau Rezki (Sony) } 347*da4fc00aSUladzislau Rezki (Sony) 348*da4fc00aSUladzislau Rezki (Sony) static int 349*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu_2_arg_vmalloc_test(void) 350*da4fc00aSUladzislau Rezki (Sony) { 351*da4fc00aSUladzislau Rezki (Sony) struct test_kvfree_rcu *p; 352*da4fc00aSUladzislau Rezki (Sony) int i; 353*da4fc00aSUladzislau Rezki (Sony) 354*da4fc00aSUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 355*da4fc00aSUladzislau Rezki (Sony) p = vmalloc(1 * PAGE_SIZE); 356*da4fc00aSUladzislau Rezki (Sony) if (!p) 357*da4fc00aSUladzislau Rezki (Sony) return -1; 358*da4fc00aSUladzislau Rezki (Sony) 359*da4fc00aSUladzislau Rezki (Sony) p->array[0] = 'a'; 360*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu(p, rcu); 361*da4fc00aSUladzislau Rezki (Sony) } 362*da4fc00aSUladzislau Rezki (Sony) 363*da4fc00aSUladzislau Rezki (Sony) return 0; 364*da4fc00aSUladzislau Rezki (Sony) } 365*da4fc00aSUladzislau Rezki (Sony) 366*da4fc00aSUladzislau Rezki (Sony) static int 367*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu_1_arg_slab_test(void) 368*da4fc00aSUladzislau Rezki (Sony) { 369*da4fc00aSUladzislau Rezki (Sony) struct test_kvfree_rcu *p; 370*da4fc00aSUladzislau Rezki (Sony) int i; 371*da4fc00aSUladzislau Rezki (Sony) 372*da4fc00aSUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 373*da4fc00aSUladzislau Rezki (Sony) p = kmalloc(sizeof(*p), GFP_KERNEL); 374*da4fc00aSUladzislau Rezki (Sony) if (!p) 375*da4fc00aSUladzislau Rezki (Sony) return -1; 376*da4fc00aSUladzislau Rezki (Sony) 377*da4fc00aSUladzislau Rezki (Sony) p->array[0] = 'a'; 378*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu(p); 379*da4fc00aSUladzislau Rezki (Sony) } 380*da4fc00aSUladzislau Rezki (Sony) 381*da4fc00aSUladzislau Rezki (Sony) return 0; 382*da4fc00aSUladzislau Rezki (Sony) } 383*da4fc00aSUladzislau Rezki (Sony) 384*da4fc00aSUladzislau Rezki (Sony) static int 385*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu_2_arg_slab_test(void) 386*da4fc00aSUladzislau Rezki (Sony) { 387*da4fc00aSUladzislau Rezki (Sony) struct test_kvfree_rcu *p; 388*da4fc00aSUladzislau Rezki (Sony) int i; 389*da4fc00aSUladzislau Rezki (Sony) 390*da4fc00aSUladzislau Rezki (Sony) for (i = 0; i < test_loop_count; i++) { 391*da4fc00aSUladzislau Rezki (Sony) p = kmalloc(sizeof(*p), GFP_KERNEL); 392*da4fc00aSUladzislau Rezki (Sony) if (!p) 393*da4fc00aSUladzislau Rezki (Sony) return -1; 394*da4fc00aSUladzislau Rezki (Sony) 395*da4fc00aSUladzislau Rezki (Sony) p->array[0] = 'a'; 396*da4fc00aSUladzislau Rezki (Sony) kvfree_rcu(p, rcu); 397*da4fc00aSUladzislau Rezki (Sony) } 398*da4fc00aSUladzislau Rezki (Sony) 399*da4fc00aSUladzislau Rezki (Sony) return 0; 400*da4fc00aSUladzislau Rezki (Sony) } 401*da4fc00aSUladzislau Rezki (Sony) 4023f21a6b7SUladzislau Rezki (Sony) struct test_case_desc { 4033f21a6b7SUladzislau Rezki (Sony) const char *test_name; 4043f21a6b7SUladzislau Rezki (Sony) int (*test_func)(void); 4053f21a6b7SUladzislau Rezki (Sony) }; 4063f21a6b7SUladzislau Rezki (Sony) 4073f21a6b7SUladzislau Rezki (Sony) static struct test_case_desc test_case_array[] = { 4083f21a6b7SUladzislau Rezki (Sony) { "fix_size_alloc_test", fix_size_alloc_test }, 4093f21a6b7SUladzislau Rezki (Sony) { "full_fit_alloc_test", full_fit_alloc_test }, 4103f21a6b7SUladzislau Rezki (Sony) { "long_busy_list_alloc_test", long_busy_list_alloc_test }, 4113f21a6b7SUladzislau Rezki (Sony) { "random_size_alloc_test", random_size_alloc_test }, 4123f21a6b7SUladzislau Rezki (Sony) { "fix_align_alloc_test", fix_align_alloc_test }, 4133f21a6b7SUladzislau Rezki (Sony) { "random_size_align_alloc_test", random_size_align_alloc_test }, 4143f21a6b7SUladzislau Rezki (Sony) { "align_shift_alloc_test", align_shift_alloc_test }, 4153f21a6b7SUladzislau Rezki (Sony) { "pcpu_alloc_test", pcpu_alloc_test }, 416*da4fc00aSUladzislau Rezki (Sony) { "kvfree_rcu_1_arg_vmalloc_test", kvfree_rcu_1_arg_vmalloc_test }, 417*da4fc00aSUladzislau Rezki (Sony) { "kvfree_rcu_2_arg_vmalloc_test", kvfree_rcu_2_arg_vmalloc_test }, 418*da4fc00aSUladzislau Rezki (Sony) { "kvfree_rcu_1_arg_slab_test", kvfree_rcu_1_arg_slab_test }, 419*da4fc00aSUladzislau Rezki (Sony) { "kvfree_rcu_2_arg_slab_test", kvfree_rcu_2_arg_slab_test }, 4203f21a6b7SUladzislau Rezki (Sony) /* Add a new test case here. */ 4213f21a6b7SUladzislau Rezki (Sony) }; 4223f21a6b7SUladzislau Rezki (Sony) 4233f21a6b7SUladzislau Rezki (Sony) struct test_case_data { 4243f21a6b7SUladzislau Rezki (Sony) int test_failed; 4253f21a6b7SUladzislau Rezki (Sony) int test_passed; 4263f21a6b7SUladzislau Rezki (Sony) u64 time; 4273f21a6b7SUladzislau Rezki (Sony) }; 4283f21a6b7SUladzislau Rezki (Sony) 4293f21a6b7SUladzislau Rezki (Sony) /* Split it to get rid of: WARNING: line over 80 characters */ 4303f21a6b7SUladzislau Rezki (Sony) static struct test_case_data 4313f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[NR_CPUS][ARRAY_SIZE(test_case_array)]; 4323f21a6b7SUladzislau Rezki (Sony) 4333f21a6b7SUladzislau Rezki (Sony) static struct test_driver { 4343f21a6b7SUladzislau Rezki (Sony) struct task_struct *task; 4353f21a6b7SUladzislau Rezki (Sony) unsigned long start; 4363f21a6b7SUladzislau Rezki (Sony) unsigned long stop; 4373f21a6b7SUladzislau Rezki (Sony) int cpu; 4383f21a6b7SUladzislau Rezki (Sony) } per_cpu_test_driver[NR_CPUS]; 4393f21a6b7SUladzislau Rezki (Sony) 4403f21a6b7SUladzislau Rezki (Sony) static void shuffle_array(int *arr, int n) 4413f21a6b7SUladzislau Rezki (Sony) { 4423f21a6b7SUladzislau Rezki (Sony) unsigned int rnd; 4433f21a6b7SUladzislau Rezki (Sony) int i, j, x; 4443f21a6b7SUladzislau Rezki (Sony) 4453f21a6b7SUladzislau Rezki (Sony) for (i = n - 1; i > 0; i--) { 4463f21a6b7SUladzislau Rezki (Sony) get_random_bytes(&rnd, sizeof(rnd)); 4473f21a6b7SUladzislau Rezki (Sony) 4483f21a6b7SUladzislau Rezki (Sony) /* Cut the range. */ 4493f21a6b7SUladzislau Rezki (Sony) j = rnd % i; 4503f21a6b7SUladzislau Rezki (Sony) 4513f21a6b7SUladzislau Rezki (Sony) /* Swap indexes. */ 4523f21a6b7SUladzislau Rezki (Sony) x = arr[i]; 4533f21a6b7SUladzislau Rezki (Sony) arr[i] = arr[j]; 4543f21a6b7SUladzislau Rezki (Sony) arr[j] = x; 4553f21a6b7SUladzislau Rezki (Sony) } 4563f21a6b7SUladzislau Rezki (Sony) } 4573f21a6b7SUladzislau Rezki (Sony) 4583f21a6b7SUladzislau Rezki (Sony) static int test_func(void *private) 4593f21a6b7SUladzislau Rezki (Sony) { 4603f21a6b7SUladzislau Rezki (Sony) struct test_driver *t = private; 4613f21a6b7SUladzislau Rezki (Sony) int random_array[ARRAY_SIZE(test_case_array)]; 4627507c402SAndrew Morton int index, i, j; 4633f21a6b7SUladzislau Rezki (Sony) ktime_t kt; 4643f21a6b7SUladzislau Rezki (Sony) u64 delta; 4653f21a6b7SUladzislau Rezki (Sony) 4667507c402SAndrew Morton if (set_cpus_allowed_ptr(current, cpumask_of(t->cpu)) < 0) 467e7898035SUladzislau Rezki (Sony) pr_err("Failed to set affinity to %d CPU\n", t->cpu); 4683f21a6b7SUladzislau Rezki (Sony) 4693f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < ARRAY_SIZE(test_case_array); i++) 4703f21a6b7SUladzislau Rezki (Sony) random_array[i] = i; 4713f21a6b7SUladzislau Rezki (Sony) 4723f21a6b7SUladzislau Rezki (Sony) if (!sequential_test_order) 4733f21a6b7SUladzislau Rezki (Sony) shuffle_array(random_array, ARRAY_SIZE(test_case_array)); 4743f21a6b7SUladzislau Rezki (Sony) 4753f21a6b7SUladzislau Rezki (Sony) /* 4763f21a6b7SUladzislau Rezki (Sony) * Block until initialization is done. 4773f21a6b7SUladzislau Rezki (Sony) */ 4783f21a6b7SUladzislau Rezki (Sony) down_read(&prepare_for_test_rwsem); 4793f21a6b7SUladzislau Rezki (Sony) 4803f21a6b7SUladzislau Rezki (Sony) t->start = get_cycles(); 4813f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < ARRAY_SIZE(test_case_array); i++) { 4823f21a6b7SUladzislau Rezki (Sony) index = random_array[i]; 4833f21a6b7SUladzislau Rezki (Sony) 4843f21a6b7SUladzislau Rezki (Sony) /* 4853f21a6b7SUladzislau Rezki (Sony) * Skip tests if run_test_mask has been specified. 4863f21a6b7SUladzislau Rezki (Sony) */ 4873f21a6b7SUladzislau Rezki (Sony) if (!((run_test_mask & (1 << index)) >> index)) 4883f21a6b7SUladzislau Rezki (Sony) continue; 4893f21a6b7SUladzislau Rezki (Sony) 4903f21a6b7SUladzislau Rezki (Sony) kt = ktime_get(); 4913f21a6b7SUladzislau Rezki (Sony) for (j = 0; j < test_repeat_count; j++) { 4927507c402SAndrew Morton if (!test_case_array[index].test_func()) 4933f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[t->cpu][index].test_passed++; 4943f21a6b7SUladzislau Rezki (Sony) else 4953f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[t->cpu][index].test_failed++; 4963f21a6b7SUladzislau Rezki (Sony) } 4973f21a6b7SUladzislau Rezki (Sony) 4983f21a6b7SUladzislau Rezki (Sony) /* 4993f21a6b7SUladzislau Rezki (Sony) * Take an average time that test took. 5003f21a6b7SUladzislau Rezki (Sony) */ 5013f21a6b7SUladzislau Rezki (Sony) delta = (u64) ktime_us_delta(ktime_get(), kt); 5023f21a6b7SUladzislau Rezki (Sony) do_div(delta, (u32) test_repeat_count); 5033f21a6b7SUladzislau Rezki (Sony) 5043f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[t->cpu][index].time = delta; 5053f21a6b7SUladzislau Rezki (Sony) } 5063f21a6b7SUladzislau Rezki (Sony) t->stop = get_cycles(); 5073f21a6b7SUladzislau Rezki (Sony) 5083f21a6b7SUladzislau Rezki (Sony) up_read(&prepare_for_test_rwsem); 5093f21a6b7SUladzislau Rezki (Sony) test_report_one_done(); 5103f21a6b7SUladzislau Rezki (Sony) 5113f21a6b7SUladzislau Rezki (Sony) /* 5123f21a6b7SUladzislau Rezki (Sony) * Wait for the kthread_stop() call. 5133f21a6b7SUladzislau Rezki (Sony) */ 5143f21a6b7SUladzislau Rezki (Sony) while (!kthread_should_stop()) 5153f21a6b7SUladzislau Rezki (Sony) msleep(10); 5163f21a6b7SUladzislau Rezki (Sony) 5173f21a6b7SUladzislau Rezki (Sony) return 0; 5183f21a6b7SUladzislau Rezki (Sony) } 5193f21a6b7SUladzislau Rezki (Sony) 5203f21a6b7SUladzislau Rezki (Sony) static void 5213f21a6b7SUladzislau Rezki (Sony) init_test_configurtion(void) 5223f21a6b7SUladzislau Rezki (Sony) { 5233f21a6b7SUladzislau Rezki (Sony) /* 5243f21a6b7SUladzislau Rezki (Sony) * Reset all data of all CPUs. 5253f21a6b7SUladzislau Rezki (Sony) */ 5263f21a6b7SUladzislau Rezki (Sony) memset(per_cpu_test_data, 0, sizeof(per_cpu_test_data)); 5273f21a6b7SUladzislau Rezki (Sony) 5283f21a6b7SUladzislau Rezki (Sony) if (single_cpu_test) 5293f21a6b7SUladzislau Rezki (Sony) cpumask_set_cpu(cpumask_first(cpu_online_mask), 5303f21a6b7SUladzislau Rezki (Sony) &cpus_run_test_mask); 5313f21a6b7SUladzislau Rezki (Sony) else 5323f21a6b7SUladzislau Rezki (Sony) cpumask_and(&cpus_run_test_mask, cpu_online_mask, 5333f21a6b7SUladzislau Rezki (Sony) cpu_online_mask); 5343f21a6b7SUladzislau Rezki (Sony) 5353f21a6b7SUladzislau Rezki (Sony) if (test_repeat_count <= 0) 5363f21a6b7SUladzislau Rezki (Sony) test_repeat_count = 1; 5373f21a6b7SUladzislau Rezki (Sony) 5383f21a6b7SUladzislau Rezki (Sony) if (test_loop_count <= 0) 5393f21a6b7SUladzislau Rezki (Sony) test_loop_count = 1; 5403f21a6b7SUladzislau Rezki (Sony) } 5413f21a6b7SUladzislau Rezki (Sony) 5423f21a6b7SUladzislau Rezki (Sony) static void do_concurrent_test(void) 5433f21a6b7SUladzislau Rezki (Sony) { 5443f21a6b7SUladzislau Rezki (Sony) int cpu, ret; 5453f21a6b7SUladzislau Rezki (Sony) 5463f21a6b7SUladzislau Rezki (Sony) /* 5473f21a6b7SUladzislau Rezki (Sony) * Set some basic configurations plus sanity check. 5483f21a6b7SUladzislau Rezki (Sony) */ 5493f21a6b7SUladzislau Rezki (Sony) init_test_configurtion(); 5503f21a6b7SUladzislau Rezki (Sony) 5513f21a6b7SUladzislau Rezki (Sony) /* 5523f21a6b7SUladzislau Rezki (Sony) * Put on hold all workers. 5533f21a6b7SUladzislau Rezki (Sony) */ 5543f21a6b7SUladzislau Rezki (Sony) down_write(&prepare_for_test_rwsem); 5553f21a6b7SUladzislau Rezki (Sony) 5563f21a6b7SUladzislau Rezki (Sony) for_each_cpu(cpu, &cpus_run_test_mask) { 5573f21a6b7SUladzislau Rezki (Sony) struct test_driver *t = &per_cpu_test_driver[cpu]; 5583f21a6b7SUladzislau Rezki (Sony) 5593f21a6b7SUladzislau Rezki (Sony) t->cpu = cpu; 5603f21a6b7SUladzislau Rezki (Sony) t->task = kthread_run(test_func, t, "vmalloc_test/%d", cpu); 5613f21a6b7SUladzislau Rezki (Sony) 5623f21a6b7SUladzislau Rezki (Sony) if (!IS_ERR(t->task)) 5633f21a6b7SUladzislau Rezki (Sony) /* Success. */ 5643f21a6b7SUladzislau Rezki (Sony) atomic_inc(&test_n_undone); 5653f21a6b7SUladzislau Rezki (Sony) else 5663f21a6b7SUladzislau Rezki (Sony) pr_err("Failed to start kthread for %d CPU\n", cpu); 5673f21a6b7SUladzislau Rezki (Sony) } 5683f21a6b7SUladzislau Rezki (Sony) 5693f21a6b7SUladzislau Rezki (Sony) /* 5703f21a6b7SUladzislau Rezki (Sony) * Now let the workers do their job. 5713f21a6b7SUladzislau Rezki (Sony) */ 5723f21a6b7SUladzislau Rezki (Sony) up_write(&prepare_for_test_rwsem); 5733f21a6b7SUladzislau Rezki (Sony) 5743f21a6b7SUladzislau Rezki (Sony) /* 5753f21a6b7SUladzislau Rezki (Sony) * Sleep quiet until all workers are done with 1 second 5763f21a6b7SUladzislau Rezki (Sony) * interval. Since the test can take a lot of time we 5773f21a6b7SUladzislau Rezki (Sony) * can run into a stack trace of the hung task. That is 5783f21a6b7SUladzislau Rezki (Sony) * why we go with completion_timeout and HZ value. 5793f21a6b7SUladzislau Rezki (Sony) */ 5803f21a6b7SUladzislau Rezki (Sony) do { 5813f21a6b7SUladzislau Rezki (Sony) ret = wait_for_completion_timeout(&test_all_done_comp, HZ); 5823f21a6b7SUladzislau Rezki (Sony) } while (!ret); 5833f21a6b7SUladzislau Rezki (Sony) 5843f21a6b7SUladzislau Rezki (Sony) for_each_cpu(cpu, &cpus_run_test_mask) { 5853f21a6b7SUladzislau Rezki (Sony) struct test_driver *t = &per_cpu_test_driver[cpu]; 5863f21a6b7SUladzislau Rezki (Sony) int i; 5873f21a6b7SUladzislau Rezki (Sony) 5883f21a6b7SUladzislau Rezki (Sony) if (!IS_ERR(t->task)) 5893f21a6b7SUladzislau Rezki (Sony) kthread_stop(t->task); 5903f21a6b7SUladzislau Rezki (Sony) 5913f21a6b7SUladzislau Rezki (Sony) for (i = 0; i < ARRAY_SIZE(test_case_array); i++) { 5923f21a6b7SUladzislau Rezki (Sony) if (!((run_test_mask & (1 << i)) >> i)) 5933f21a6b7SUladzislau Rezki (Sony) continue; 5943f21a6b7SUladzislau Rezki (Sony) 5953f21a6b7SUladzislau Rezki (Sony) pr_info( 5963f21a6b7SUladzislau Rezki (Sony) "Summary: %s passed: %d failed: %d repeat: %d loops: %d avg: %llu usec\n", 5973f21a6b7SUladzislau Rezki (Sony) test_case_array[i].test_name, 5983f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[cpu][i].test_passed, 5993f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[cpu][i].test_failed, 6003f21a6b7SUladzislau Rezki (Sony) test_repeat_count, test_loop_count, 6013f21a6b7SUladzislau Rezki (Sony) per_cpu_test_data[cpu][i].time); 6023f21a6b7SUladzislau Rezki (Sony) } 6033f21a6b7SUladzislau Rezki (Sony) 6043f21a6b7SUladzislau Rezki (Sony) pr_info("All test took CPU%d=%lu cycles\n", 6053f21a6b7SUladzislau Rezki (Sony) cpu, t->stop - t->start); 6063f21a6b7SUladzislau Rezki (Sony) } 6073f21a6b7SUladzislau Rezki (Sony) } 6083f21a6b7SUladzislau Rezki (Sony) 6093f21a6b7SUladzislau Rezki (Sony) static int vmalloc_test_init(void) 6103f21a6b7SUladzislau Rezki (Sony) { 6113f21a6b7SUladzislau Rezki (Sony) do_concurrent_test(); 6123f21a6b7SUladzislau Rezki (Sony) return -EAGAIN; /* Fail will directly unload the module */ 6133f21a6b7SUladzislau Rezki (Sony) } 6143f21a6b7SUladzislau Rezki (Sony) 6153f21a6b7SUladzislau Rezki (Sony) static void vmalloc_test_exit(void) 6163f21a6b7SUladzislau Rezki (Sony) { 6173f21a6b7SUladzislau Rezki (Sony) } 6183f21a6b7SUladzislau Rezki (Sony) 6193f21a6b7SUladzislau Rezki (Sony) module_init(vmalloc_test_init) 6203f21a6b7SUladzislau Rezki (Sony) module_exit(vmalloc_test_exit) 6213f21a6b7SUladzislau Rezki (Sony) 6223f21a6b7SUladzislau Rezki (Sony) MODULE_LICENSE("GPL"); 6233f21a6b7SUladzislau Rezki (Sony) MODULE_AUTHOR("Uladzislau Rezki"); 6243f21a6b7SUladzislau Rezki (Sony) MODULE_DESCRIPTION("vmalloc test module"); 625