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 <willy@infradead.org> 6 */ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 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); 20 struct page *page = virt_to_page((void *)addr); 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 { 31 pr_info("Testing with GFP_KERNEL\n"); 32 test_free_pages(GFP_KERNEL); 33 pr_info("Testing with GFP_KERNEL | __GFP_COMP\n"); 34 test_free_pages(GFP_KERNEL | __GFP_COMP); 35 pr_info("Test completed\n"); 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 <willy@infradead.org>"); 47 MODULE_DESCRIPTION("Check that free_pages() doesn't leak memory"); 48 MODULE_LICENSE("GPL"); 49