test_free_pages.c (995B)
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 14static 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(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 29static 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 40static void m_ex(void) 41{ 42} 43 44module_init(m_in); 45module_exit(m_ex); 46MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>"); 47MODULE_LICENSE("GPL");