at v2.6.31 4.1 kB view raw
1#ifndef LINUX_KMEMCHECK_H 2#define LINUX_KMEMCHECK_H 3 4#include <linux/mm_types.h> 5#include <linux/types.h> 6 7#ifdef CONFIG_KMEMCHECK 8extern int kmemcheck_enabled; 9 10/* The slab-related functions. */ 11void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node); 12void kmemcheck_free_shadow(struct page *page, int order); 13void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, 14 size_t size); 15void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size); 16 17void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order, 18 gfp_t gfpflags); 19 20void kmemcheck_show_pages(struct page *p, unsigned int n); 21void kmemcheck_hide_pages(struct page *p, unsigned int n); 22 23bool kmemcheck_page_is_tracked(struct page *p); 24 25void kmemcheck_mark_unallocated(void *address, unsigned int n); 26void kmemcheck_mark_uninitialized(void *address, unsigned int n); 27void kmemcheck_mark_initialized(void *address, unsigned int n); 28void kmemcheck_mark_freed(void *address, unsigned int n); 29 30void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n); 31void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n); 32void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n); 33 34int kmemcheck_show_addr(unsigned long address); 35int kmemcheck_hide_addr(unsigned long address); 36 37#else 38#define kmemcheck_enabled 0 39 40static inline void 41kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node) 42{ 43} 44 45static inline void 46kmemcheck_free_shadow(struct page *page, int order) 47{ 48} 49 50static inline void 51kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, 52 size_t size) 53{ 54} 55 56static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object, 57 size_t size) 58{ 59} 60 61static inline void kmemcheck_pagealloc_alloc(struct page *p, 62 unsigned int order, gfp_t gfpflags) 63{ 64} 65 66static inline bool kmemcheck_page_is_tracked(struct page *p) 67{ 68 return false; 69} 70 71static inline void kmemcheck_mark_unallocated(void *address, unsigned int n) 72{ 73} 74 75static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n) 76{ 77} 78 79static inline void kmemcheck_mark_initialized(void *address, unsigned int n) 80{ 81} 82 83static inline void kmemcheck_mark_freed(void *address, unsigned int n) 84{ 85} 86 87static inline void kmemcheck_mark_unallocated_pages(struct page *p, 88 unsigned int n) 89{ 90} 91 92static inline void kmemcheck_mark_uninitialized_pages(struct page *p, 93 unsigned int n) 94{ 95} 96 97static inline void kmemcheck_mark_initialized_pages(struct page *p, 98 unsigned int n) 99{ 100} 101 102#endif /* CONFIG_KMEMCHECK */ 103 104/* 105 * Bitfield annotations 106 * 107 * How to use: If you have a struct using bitfields, for example 108 * 109 * struct a { 110 * int x:8, y:8; 111 * }; 112 * 113 * then this should be rewritten as 114 * 115 * struct a { 116 * kmemcheck_bitfield_begin(flags); 117 * int x:8, y:8; 118 * kmemcheck_bitfield_end(flags); 119 * }; 120 * 121 * Now the "flags_begin" and "flags_end" members may be used to refer to the 122 * beginning and end, respectively, of the bitfield (and things like 123 * &x.flags_begin is allowed). As soon as the struct is allocated, the bit- 124 * fields should be annotated: 125 * 126 * struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL); 127 * kmemcheck_annotate_bitfield(a, flags); 128 * 129 * Note: We provide the same definitions for both kmemcheck and non- 130 * kmemcheck kernels. This makes it harder to introduce accidental errors. It 131 * is also allowed to pass NULL pointers to kmemcheck_annotate_bitfield(). 132 */ 133#define kmemcheck_bitfield_begin(name) \ 134 int name##_begin[0]; 135 136#define kmemcheck_bitfield_end(name) \ 137 int name##_end[0]; 138 139#define kmemcheck_annotate_bitfield(ptr, name) \ 140 do if (ptr) { \ 141 int _n = (long) &((ptr)->name##_end) \ 142 - (long) &((ptr)->name##_begin); \ 143 BUILD_BUG_ON(_n < 0); \ 144 \ 145 kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ 146 } while (0) 147 148#define kmemcheck_annotate_variable(var) \ 149 do { \ 150 kmemcheck_mark_initialized(&(var), sizeof(var)); \ 151 } while (0) \ 152 153#endif /* LINUX_KMEMCHECK_H */