18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * test_free_pages.c: Check that free_pages() doesn't leak memory 48c2ecf20Sopenharmony_ci * Copyright (c) 2020 Oracle 58c2ecf20Sopenharmony_ci * Author: Matthew Wilcox <willy@infradead.org> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/gfp.h> 98c2ecf20Sopenharmony_ci#include <linux/mm.h> 108c2ecf20Sopenharmony_ci#include <linux/module.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistatic void test_free_pages(gfp_t gfp) 138c2ecf20Sopenharmony_ci{ 148c2ecf20Sopenharmony_ci unsigned int i; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci for (i = 0; i < 1000 * 1000; i++) { 178c2ecf20Sopenharmony_ci unsigned long addr = __get_free_pages(gfp, 3); 188c2ecf20Sopenharmony_ci struct page *page = virt_to_page(addr); 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci /* Simulate page cache getting a speculative reference */ 218c2ecf20Sopenharmony_ci get_page(page); 228c2ecf20Sopenharmony_ci free_pages(addr, 3); 238c2ecf20Sopenharmony_ci put_page(page); 248c2ecf20Sopenharmony_ci } 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic int m_in(void) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci test_free_pages(GFP_KERNEL); 308c2ecf20Sopenharmony_ci test_free_pages(GFP_KERNEL | __GFP_COMP); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci return 0; 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic void m_ex(void) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cimodule_init(m_in); 408c2ecf20Sopenharmony_cimodule_exit(m_ex); 418c2ecf20Sopenharmony_ciMODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>"); 428c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 43