aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorVegard Nossum <vegard.nossum@gmail.com>2008-05-31 09:56:17 -0400
committerVegard Nossum <vegard.nossum@gmail.com>2009-06-15 06:40:03 -0400
commit2dff440525f8faba8836e9f05297b76f23b4af30 (patch)
tree9f15e1dc2da06dba97cd939e41f34342caf05097 /include
parentf85612967c93b67b10dd240e3e8bf8a0eee9def7 (diff)
kmemcheck: add mm functions
With kmemcheck enabled, the slab allocator needs to do this: 1. Tell kmemcheck to allocate the shadow memory which stores the status of each byte in the allocation proper, e.g. whether it is initialized or uninitialized. 2. Tell kmemcheck which parts of memory that should be marked uninitialized. There are actually a few more states, such as "not yet allocated" and "recently freed". If a slab cache is set up using the SLAB_NOTRACK flag, it will never return memory that can take page faults because of kmemcheck. If a slab cache is NOT set up using the SLAB_NOTRACK flag, callers can still request memory with the __GFP_NOTRACK flag. This does not prevent the page faults from occuring, however, but marks the object in question as being initialized so that no warnings will ever be produced for this object. In addition to (and in contrast to) __GFP_NOTRACK, the __GFP_NOTRACK_FALSE_POSITIVE flag indicates that the allocation should not be tracked _because_ it would produce a false positive. Their values are identical, but need not be so in the future (for example, we could now enable/disable false positives with a config option). Parts of this patch were contributed by Pekka Enberg but merged for atomicity. Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com> Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi> Signed-off-by: Ingo Molnar <mingo@elte.hu> [rebased for mainline inclusion] Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/gfp.h9
-rw-r--r--include/linux/kmemcheck.h47
-rw-r--r--include/linux/slab.h7
3 files changed, 62 insertions, 1 deletions
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index 0bbc15f54536..daeaa8fe1bbd 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -51,8 +51,15 @@ struct vm_area_struct;
51#define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */ 51#define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */
52#define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */ 52#define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */
53#define __GFP_MOVABLE ((__force gfp_t)0x100000u) /* Page is movable */ 53#define __GFP_MOVABLE ((__force gfp_t)0x100000u) /* Page is movable */
54#define __GFP_NOTRACK ((__force gfp_t)0x200000u) /* Don't track with kmemcheck */
54 55
55#define __GFP_BITS_SHIFT 21 /* Room for 21 __GFP_FOO bits */ 56/*
57 * This may seem redundant, but it's a way of annotating false positives vs.
58 * allocations that simply cannot be supported (e.g. page tables).
59 */
60#define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK)
61
62#define __GFP_BITS_SHIFT 22 /* Room for 22 __GFP_FOO bits */
56#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) 63#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
57 64
58/* This equals 0, but use constants in case they ever change */ 65/* This equals 0, but use constants in case they ever change */
diff --git a/include/linux/kmemcheck.h b/include/linux/kmemcheck.h
index 39480c91b2f9..5b65f4ebeadf 100644
--- a/include/linux/kmemcheck.h
+++ b/include/linux/kmemcheck.h
@@ -7,11 +7,58 @@
7#ifdef CONFIG_KMEMCHECK 7#ifdef CONFIG_KMEMCHECK
8extern int kmemcheck_enabled; 8extern int kmemcheck_enabled;
9 9
10/* The slab-related functions. */
11void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
12 struct page *page, int order);
13void kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order);
14void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
15 size_t size);
16void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);
17
18void kmemcheck_show_pages(struct page *p, unsigned int n);
19void kmemcheck_hide_pages(struct page *p, unsigned int n);
20
21bool kmemcheck_page_is_tracked(struct page *p);
22
23void kmemcheck_mark_unallocated(void *address, unsigned int n);
24void kmemcheck_mark_uninitialized(void *address, unsigned int n);
25void kmemcheck_mark_initialized(void *address, unsigned int n);
26void kmemcheck_mark_freed(void *address, unsigned int n);
27
28void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);
29void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);
30
10int kmemcheck_show_addr(unsigned long address); 31int kmemcheck_show_addr(unsigned long address);
11int kmemcheck_hide_addr(unsigned long address); 32int kmemcheck_hide_addr(unsigned long address);
12#else 33#else
13#define kmemcheck_enabled 0 34#define kmemcheck_enabled 0
14 35
36static inline void
37kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
38 struct page *page, int order)
39{
40}
41
42static inline void
43kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order)
44{
45}
46
47static inline void
48kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
49 size_t size)
50{
51}
52
53static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object,
54 size_t size)
55{
56}
57
58static inline bool kmemcheck_page_is_tracked(struct page *p)
59{
60 return false;
61}
15#endif /* CONFIG_KMEMCHECK */ 62#endif /* CONFIG_KMEMCHECK */
16 63
17#endif /* LINUX_KMEMCHECK_H */ 64#endif /* LINUX_KMEMCHECK_H */
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 48803064cedf..e339fcf17cd3 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -64,6 +64,13 @@
64 64
65#define SLAB_NOLEAKTRACE 0x00800000UL /* Avoid kmemleak tracing */ 65#define SLAB_NOLEAKTRACE 0x00800000UL /* Avoid kmemleak tracing */
66 66
67/* Don't track use of uninitialized memory */
68#ifdef CONFIG_KMEMCHECK
69# define SLAB_NOTRACK 0x01000000UL
70#else
71# define SLAB_NOTRACK 0x00000000UL
72#endif
73
67/* The following flags affect the page allocator grouping pages by mobility */ 74/* The following flags affect the page allocator grouping pages by mobility */
68#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* Objects are reclaimable */ 75#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* Objects are reclaimable */
69#define SLAB_TEMPORARY SLAB_RECLAIM_ACCOUNT /* Objects are short-lived */ 76#define SLAB_TEMPORARY SLAB_RECLAIM_ACCOUNT /* Objects are short-lived */