linux/lib/test_free_pages.c
<<
>>
Prefs
   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");
  48