mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
kmemcheck: add hooks for the page allocator
This adds support for tracking the initializedness of memory that was allocated with the page allocator. Highmem requests are not tracked. Cc: Dave Hansen <[email protected]> Acked-by: Pekka Enberg <[email protected]> [build fix for !CONFIG_KMEMCHECK] Signed-off-by: Ingo Molnar <[email protected]> [rebased for mainline inclusion] Signed-off-by: Vegard Nossum <[email protected]>
This commit is contained in:
parent
9b5cab3189
commit
b1eeab6768
8 changed files with 122 additions and 31 deletions
|
|
@ -1,10 +1,10 @@
|
|||
#include <linux/gfp.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kmemcheck.h>
|
||||
|
||||
void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
|
||||
struct page *page, int order)
|
||||
void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)
|
||||
{
|
||||
struct page *shadow;
|
||||
int pages;
|
||||
|
|
@ -16,7 +16,7 @@ void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
|
|||
* With kmemcheck enabled, we need to allocate a memory area for the
|
||||
* shadow bits as well.
|
||||
*/
|
||||
shadow = alloc_pages_node(node, flags, order);
|
||||
shadow = alloc_pages_node(node, flags | __GFP_NOTRACK, order);
|
||||
if (!shadow) {
|
||||
if (printk_ratelimit())
|
||||
printk(KERN_ERR "kmemcheck: failed to allocate "
|
||||
|
|
@ -33,23 +33,17 @@ void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
|
|||
* the memory accesses.
|
||||
*/
|
||||
kmemcheck_hide_pages(page, pages);
|
||||
|
||||
/*
|
||||
* Objects from caches that have a constructor don't get
|
||||
* cleared when they're allocated, so we need to do it here.
|
||||
*/
|
||||
if (s->ctor)
|
||||
kmemcheck_mark_uninitialized_pages(page, pages);
|
||||
else
|
||||
kmemcheck_mark_unallocated_pages(page, pages);
|
||||
}
|
||||
|
||||
void kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order)
|
||||
void kmemcheck_free_shadow(struct page *page, int order)
|
||||
{
|
||||
struct page *shadow;
|
||||
int pages;
|
||||
int i;
|
||||
|
||||
if (!kmemcheck_page_is_tracked(page))
|
||||
return;
|
||||
|
||||
pages = 1 << order;
|
||||
|
||||
kmemcheck_show_pages(page, pages);
|
||||
|
|
@ -101,3 +95,28 @@ void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size)
|
|||
if (!s->ctor && !(s->flags & SLAB_DESTROY_BY_RCU))
|
||||
kmemcheck_mark_freed(object, size);
|
||||
}
|
||||
|
||||
void kmemcheck_pagealloc_alloc(struct page *page, unsigned int order,
|
||||
gfp_t gfpflags)
|
||||
{
|
||||
int pages;
|
||||
|
||||
if (gfpflags & (__GFP_HIGHMEM | __GFP_NOTRACK))
|
||||
return;
|
||||
|
||||
pages = 1 << order;
|
||||
|
||||
/*
|
||||
* NOTE: We choose to track GFP_ZERO pages too; in fact, they
|
||||
* can become uninitialized by copying uninitialized memory
|
||||
* into them.
|
||||
*/
|
||||
|
||||
/* XXX: Can use zone->node for node? */
|
||||
kmemcheck_alloc_shadow(page, order, gfpflags, -1);
|
||||
|
||||
if (gfpflags & __GFP_ZERO)
|
||||
kmemcheck_mark_initialized_pages(page, pages);
|
||||
else
|
||||
kmemcheck_mark_uninitialized_pages(page, pages);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue