tunnels: fix netns vs proto registration ordering
[safe/jmp/linux-2.6] / mm / kmemcheck.c
index eaa41b8..fd814fd 100644 (file)
@@ -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);
+}