]>
Commit | Line | Data |
---|---|---|
e320d301 MWO |
1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* | |
3 | * test_free_pages.c: Check that free_pages() doesn't leak memory | |
4 | * Copyright (c) 2020 Oracle | |
5 | * Author: Matthew Wilcox <[email protected]> | |
6 | */ | |
7 | ||
0ae446e4 GU |
8 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
9 | ||
e320d301 MWO |
10 | #include <linux/gfp.h> |
11 | #include <linux/mm.h> | |
12 | #include <linux/module.h> | |
13 | ||
14 | static void test_free_pages(gfp_t gfp) | |
15 | { | |
16 | unsigned int i; | |
17 | ||
18 | for (i = 0; i < 1000 * 1000; i++) { | |
19 | unsigned long addr = __get_free_pages(gfp, 3); | |
b3c56f8f | 20 | struct page *page = virt_to_page((void *)addr); |
e320d301 MWO |
21 | |
22 | /* Simulate page cache getting a speculative reference */ | |
23 | get_page(page); | |
24 | free_pages(addr, 3); | |
25 | put_page(page); | |
26 | } | |
27 | } | |
28 | ||
29 | static int m_in(void) | |
30 | { | |
0ae446e4 | 31 | pr_info("Testing with GFP_KERNEL\n"); |
e320d301 | 32 | test_free_pages(GFP_KERNEL); |
0ae446e4 | 33 | pr_info("Testing with GFP_KERNEL | __GFP_COMP\n"); |
e320d301 | 34 | test_free_pages(GFP_KERNEL | __GFP_COMP); |
0ae446e4 | 35 | pr_info("Test completed\n"); |
e320d301 MWO |
36 | |
37 | return 0; | |
38 | } | |
39 | ||
40 | static void m_ex(void) | |
41 | { | |
42 | } | |
43 | ||
44 | module_init(m_in); | |
45 | module_exit(m_ex); | |
46 | MODULE_AUTHOR("Matthew Wilcox <[email protected]>"); | |
30347491 | 47 | MODULE_DESCRIPTION("Check that free_pages() doesn't leak memory"); |
e320d301 | 48 | MODULE_LICENSE("GPL"); |