Blame view

mm/kmemleak-test.c 3.29 KB
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  /*
   * mm/kmemleak-test.c
   *
   * Copyright (C) 2008 ARM Limited
   * Written by Catalin Marinas <catalin.marinas@arm.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   */
  
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
  #include <linux/list.h>
  #include <linux/percpu.h>
  #include <linux/fdtable.h>
  
  #include <linux/kmemleak.h>
  
  struct test_node {
  	long header[25];
  	struct list_head list;
  	long footer[25];
  };
  
  static LIST_HEAD(test_list);
245b2e70e   Tejun Heo   percpu: clean up ...
39
  static DEFINE_PER_CPU(void *, kmemleak_test_pointer);
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  
  /*
   * Some very simple testing. This function needs to be extended for
   * proper testing.
   */
  static int __init kmemleak_test_init(void)
  {
  	struct test_node *elem;
  	int i;
  
  	printk(KERN_INFO "Kmemleak testing
  ");
  
  	/* make some orphan objects */
  	pr_info("kmemleak: kmalloc(32) = %p
  ", kmalloc(32, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(32) = %p
  ", kmalloc(32, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(1024) = %p
  ", kmalloc(1024, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(1024) = %p
  ", kmalloc(1024, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(2048) = %p
  ", kmalloc(2048, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(2048) = %p
  ", kmalloc(2048, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(4096) = %p
  ", kmalloc(4096, GFP_KERNEL));
  	pr_info("kmemleak: kmalloc(4096) = %p
  ", kmalloc(4096, GFP_KERNEL));
  #ifndef CONFIG_MODULES
  	pr_info("kmemleak: kmem_cache_alloc(files_cachep) = %p
  ",
  		kmem_cache_alloc(files_cachep, GFP_KERNEL));
  	pr_info("kmemleak: kmem_cache_alloc(files_cachep) = %p
  ",
  		kmem_cache_alloc(files_cachep, GFP_KERNEL));
  #endif
  	pr_info("kmemleak: vmalloc(64) = %p
  ", vmalloc(64));
  	pr_info("kmemleak: vmalloc(64) = %p
  ", vmalloc(64));
  	pr_info("kmemleak: vmalloc(64) = %p
  ", vmalloc(64));
  	pr_info("kmemleak: vmalloc(64) = %p
  ", vmalloc(64));
  	pr_info("kmemleak: vmalloc(64) = %p
  ", vmalloc(64));
  
  	/*
  	 * Add elements to a list. They should only appear as orphan
  	 * after the module is removed.
  	 */
  	for (i = 0; i < 10; i++) {
0a08739e8   Jesper Juhl   kmemleak: remove ...
94
95
96
  		elem = kzalloc(sizeof(*elem), GFP_KERNEL);
  		pr_info("kmemleak: kzalloc(sizeof(*elem)) = %p
  ", elem);
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
97
98
  		if (!elem)
  			return -ENOMEM;
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
99
  		INIT_LIST_HEAD(&elem->list);
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
100
101
102
103
  		list_add_tail(&elem->list, &test_list);
  	}
  
  	for_each_possible_cpu(i) {
245b2e70e   Tejun Heo   percpu: clean up ...
104
  		per_cpu(kmemleak_test_pointer, i) = kmalloc(129, GFP_KERNEL);
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
105
106
  		pr_info("kmemleak: kmalloc(129) = %p
  ",
245b2e70e   Tejun Heo   percpu: clean up ...
107
  			per_cpu(kmemleak_test_pointer, i));
0822ee4ac   Catalin Marinas   kmemleak: Simple ...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  	}
  
  	return 0;
  }
  module_init(kmemleak_test_init);
  
  static void __exit kmemleak_test_exit(void)
  {
  	struct test_node *elem, *tmp;
  
  	/*
  	 * Remove the list elements without actually freeing the
  	 * memory.
  	 */
  	list_for_each_entry_safe(elem, tmp, &test_list, list)
  		list_del(&elem->list);
  }
  module_exit(kmemleak_test_exit);
  
  MODULE_LICENSE("GPL");