Blame view

include/linux/kmemcheck.h 4.24 KB
dfec072ec   Vegard Nossum   kmemcheck: add th...
1
2
3
4
5
6
7
8
  #ifndef LINUX_KMEMCHECK_H
  #define LINUX_KMEMCHECK_H
  
  #include <linux/mm_types.h>
  #include <linux/types.h>
  
  #ifdef CONFIG_KMEMCHECK
  extern int kmemcheck_enabled;
2dff44052   Vegard Nossum   kmemcheck: add mm...
9
  /* The slab-related functions. */
b1eeab676   Vegard Nossum   kmemcheck: add ho...
10
11
  void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);
  void kmemcheck_free_shadow(struct page *page, int order);
2dff44052   Vegard Nossum   kmemcheck: add mm...
12
13
14
  void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
  			  size_t size);
  void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);
b1eeab676   Vegard Nossum   kmemcheck: add ho...
15
16
  void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order,
  			       gfp_t gfpflags);
2dff44052   Vegard Nossum   kmemcheck: add mm...
17
18
19
20
21
22
23
24
25
26
27
28
  void kmemcheck_show_pages(struct page *p, unsigned int n);
  void kmemcheck_hide_pages(struct page *p, unsigned int n);
  
  bool kmemcheck_page_is_tracked(struct page *p);
  
  void kmemcheck_mark_unallocated(void *address, unsigned int n);
  void kmemcheck_mark_uninitialized(void *address, unsigned int n);
  void kmemcheck_mark_initialized(void *address, unsigned int n);
  void kmemcheck_mark_freed(void *address, unsigned int n);
  
  void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);
  void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);
b1eeab676   Vegard Nossum   kmemcheck: add ho...
29
  void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);
2dff44052   Vegard Nossum   kmemcheck: add mm...
30

dfec072ec   Vegard Nossum   kmemcheck: add th...
31
32
  int kmemcheck_show_addr(unsigned long address);
  int kmemcheck_hide_addr(unsigned long address);
fc7d0c9f2   Vegard Nossum   kmemcheck: introd...
33

8e019366b   Pekka Enberg   kmemleak: Don't s...
34
  bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size);
e992cd9b7   Vegard Nossum   kmemcheck: make b...
35
36
37
38
39
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
  /*
   * Bitfield annotations
   *
   * How to use: If you have a struct using bitfields, for example
   *
   *     struct a {
   *             int x:8, y:8;
   *     };
   *
   * then this should be rewritten as
   *
   *     struct a {
   *             kmemcheck_bitfield_begin(flags);
   *             int x:8, y:8;
   *             kmemcheck_bitfield_end(flags);
   *     };
   *
   * Now the "flags_begin" and "flags_end" members may be used to refer to the
   * beginning and end, respectively, of the bitfield (and things like
   * &x.flags_begin is allowed). As soon as the struct is allocated, the bit-
   * fields should be annotated:
   *
   *     struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL);
   *     kmemcheck_annotate_bitfield(a, flags);
   */
  #define kmemcheck_bitfield_begin(name)	\
  	int name##_begin[0];
  
  #define kmemcheck_bitfield_end(name)	\
  	int name##_end[0];
  
  #define kmemcheck_annotate_bitfield(ptr, name)				\
  	do {								\
  		int _n;							\
  									\
  		if (!ptr)						\
  			break;						\
  									\
  		_n = (long) &((ptr)->name##_end)			\
  			- (long) &((ptr)->name##_begin);		\
1765e3a49   Rusty Russell   Remove MAYBE_BUIL...
75
  		BUILD_BUG_ON(_n < 0);					\
e992cd9b7   Vegard Nossum   kmemcheck: make b...
76
77
78
79
80
81
82
83
  									\
  		kmemcheck_mark_initialized(&((ptr)->name##_begin), _n);	\
  	} while (0)
  
  #define kmemcheck_annotate_variable(var)				\
  	do {								\
  		kmemcheck_mark_initialized(&(var), sizeof(var));	\
  	} while (0)							\
dfec072ec   Vegard Nossum   kmemcheck: add th...
84
85
  #else
  #define kmemcheck_enabled 0
2dff44052   Vegard Nossum   kmemcheck: add mm...
86
  static inline void
b1eeab676   Vegard Nossum   kmemcheck: add ho...
87
  kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)
2dff44052   Vegard Nossum   kmemcheck: add mm...
88
89
90
91
  {
  }
  
  static inline void
b1eeab676   Vegard Nossum   kmemcheck: add ho...
92
  kmemcheck_free_shadow(struct page *page, int order)
2dff44052   Vegard Nossum   kmemcheck: add mm...
93
94
95
96
97
98
99
100
101
102
103
104
105
  {
  }
  
  static inline void
  kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
  		     size_t size)
  {
  }
  
  static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object,
  				       size_t size)
  {
  }
b1eeab676   Vegard Nossum   kmemcheck: add ho...
106
107
108
109
  static inline void kmemcheck_pagealloc_alloc(struct page *p,
  	unsigned int order, gfp_t gfpflags)
  {
  }
2dff44052   Vegard Nossum   kmemcheck: add mm...
110
111
112
113
  static inline bool kmemcheck_page_is_tracked(struct page *p)
  {
  	return false;
  }
d7002857d   Vegard Nossum   kmemcheck: add DM...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  
  static inline void kmemcheck_mark_unallocated(void *address, unsigned int n)
  {
  }
  
  static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n)
  {
  }
  
  static inline void kmemcheck_mark_initialized(void *address, unsigned int n)
  {
  }
  
  static inline void kmemcheck_mark_freed(void *address, unsigned int n)
  {
  }
b1eeab676   Vegard Nossum   kmemcheck: add ho...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  
  static inline void kmemcheck_mark_unallocated_pages(struct page *p,
  						    unsigned int n)
  {
  }
  
  static inline void kmemcheck_mark_uninitialized_pages(struct page *p,
  						      unsigned int n)
  {
  }
  
  static inline void kmemcheck_mark_initialized_pages(struct page *p,
  						    unsigned int n)
  {
  }
8e019366b   Pekka Enberg   kmemleak: Don't s...
145
146
147
148
  static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size)
  {
  	return true;
  }
e992cd9b7   Vegard Nossum   kmemcheck: make b...
149
150
151
152
153
  #define kmemcheck_bitfield_begin(name)
  #define kmemcheck_bitfield_end(name)
  #define kmemcheck_annotate_bitfield(ptr, name)	\
  	do {					\
  	} while (0)
fc7d0c9f2   Vegard Nossum   kmemcheck: introd...
154

e992cd9b7   Vegard Nossum   kmemcheck: make b...
155
156
  #define kmemcheck_annotate_variable(var)	\
  	do {					\
fc7d0c9f2   Vegard Nossum   kmemcheck: introd...
157
  	} while (0)
e992cd9b7   Vegard Nossum   kmemcheck: make b...
158
  #endif /* CONFIG_KMEMCHECK */
fc7d0c9f2   Vegard Nossum   kmemcheck: introd...
159

dfec072ec   Vegard Nossum   kmemcheck: add th...
160
  #endif /* LINUX_KMEMCHECK_H */