All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20081125170231.GA19260@localhost.localdomain>

diff --git a/a/1.txt b/N1/1.txt
index 07de569..8b13789 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,372 +1 @@
->From ad913cbefabedf41f021e6e9b64313644d5d479b Mon Sep 17 00:00:00 2001
-From: Vegard Nossum <vegard.nossum@gmail.com>
-Date: Tue, 25 Nov 2008 16:55:53 +0100
-Subject: [PATCH] kmemcheck: add hooks for the page allocator
 
-This adds support for tracking the initializedness of memory that
-was allocated with the page allocator. Requests with the flags
-__GFP_HIGHMEM or __GFP_IO are not tracked.
-
-There seems to be a problem with bio mappings, which gives (among
-others) this new warning:
-
-WARNING: kmemcheck: Caught 8-bit read from uninitialized memory (f6750408)
-008000011f736d6955534220202020204449534b20322e302020202020202020
- u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u
-                 ^
-
-Pid: 660, comm: usb-stor-scan Not tainted (2.6.28-rc2 #156) 945P-A
-EIP: 0060:[<c12a0dc7>] EFLAGS: 00010246 CPU: 0
-EIP is at scsi_probe_and_add_lun+0x2c7/0x9a0
-EAX: f6750400 EBX: 00000000 ECX: f675040f EDX: f6750408
-ESI: 00000024 EDI: f6750424 EBP: f66b3e74 ESP: c174b0e8
- DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
-CR0: 8005003b CR2: f6c1e404 CR3: 01732000 CR4: 000006d0
-DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
-DR6: ffff4ff0 DR7: 00000400
- [<c12a1aa3>] __scsi_scan_target+0xe3/0x5d0
- [<c12a1fe2>] scsi_scan_channel+0x52/0x90
- [<c12a20bb>] scsi_scan_host_selected+0x9b/0x120
- [<c12a21ae>] do_scsi_scan_host+0x6e/0x70
- [<c12a244e>] scsi_scan_host+0x13e/0x190
- [<c130fdbd>] usb_stor_scan_thread+0x16d/0x1b0
- [<c104543c>] kthread+0x3c/0x70
- [<c1004cc3>] kernel_thread_helper+0x7/0x14
- [<ffffffff>] 0xffffffff
-
-It is this call: sanitize_inquiry_string(&inq_result[8], 8);
-
-As can be seen in the memory dump, the memory is in fact
-initialized with what seems to the correct (expected) data.
-
-This can probably be fixed with an annotation in the bio code, but
-I don't know if this would really be the correct solution, so I am
-not doing it for now.
-
-Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com>
----
- arch/x86/include/asm/thread_info.h |    4 ++--
- arch/x86/mm/kmemcheck/shadow.c     |    8 ++++++++
- include/linux/gfp.h                |    5 +++++
- include/linux/kmemcheck.h          |   25 ++++++++++++++++++++-----
- mm/kmemcheck.c                     |   17 ++++-------------
- mm/page_alloc.c                    |   28 ++++++++++++++++++++++++++++
- mm/slab.c                          |   14 ++++++++++----
- mm/slub.c                          |   21 +++++++++++++++++----
- 8 files changed, 94 insertions(+), 28 deletions(-)
-
-diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
-index e44d379..1582b16 100644
---- a/arch/x86/include/asm/thread_info.h
-+++ b/arch/x86/include/asm/thread_info.h
-@@ -149,9 +149,9 @@ struct thread_info {
- 
- /* thread information allocation */
- #ifdef CONFIG_DEBUG_STACK_USAGE
--#define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO)
-+#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
- #else
--#define THREAD_FLAGS GFP_KERNEL
-+#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK)
- #endif
- 
- #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
-diff --git a/arch/x86/mm/kmemcheck/shadow.c b/arch/x86/mm/kmemcheck/shadow.c
-index 62a0f63..969cd4a 100644
---- a/arch/x86/mm/kmemcheck/shadow.c
-+++ b/arch/x86/mm/kmemcheck/shadow.c
-@@ -88,6 +88,14 @@ void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n)
- 		kmemcheck_mark_uninitialized(page_address(&p[i]), PAGE_SIZE);
- }
- 
-+void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n)
-+{
-+	unsigned int i;
-+
-+	for (i = 0; i < n; ++i)
-+		kmemcheck_mark_initialized(page_address(&p[i]), PAGE_SIZE);
-+}
-+
- enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size)
- {
- 	uint8_t *x;
-diff --git a/include/linux/gfp.h b/include/linux/gfp.h
-index 0d55e44..700db60 100644
---- a/include/linux/gfp.h
-+++ b/include/linux/gfp.h
-@@ -50,7 +50,12 @@ struct vm_area_struct;
- #define __GFP_THISNODE	((__force gfp_t)0x40000u)/* No fallback, no policies */
- #define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */
- #define __GFP_MOVABLE	((__force gfp_t)0x100000u)  /* Page is movable */
-+
-+#ifdef CONFIG_KMEMCHECK
- #define __GFP_NOTRACK	((__force gfp_t)0x200000u)  /* Don't track with kmemcheck */
-+#else
-+#define __GFP_NOTRACK	((__force gfp_t)0)
-+#endif
- 
- #define __GFP_BITS_SHIFT 22	/* Room for 22 __GFP_FOO bits */
- #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
-diff --git a/include/linux/kmemcheck.h b/include/linux/kmemcheck.h
-index 7073121..04b2289 100644
---- a/include/linux/kmemcheck.h
-+++ b/include/linux/kmemcheck.h
-@@ -42,9 +42,8 @@ extern int kmemcheck_enabled;
- void kmemcheck_init(void);
- 
- /* The slab-related functions. */
--void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
--			    struct page *page, int order);
--void kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order);
-+void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);
-+void kmemcheck_free_shadow(struct page *page, int order);
- 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);
-@@ -61,6 +60,7 @@ 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);
-+void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);
- 
- int kmemcheck_show_addr(unsigned long address);
- int kmemcheck_hide_addr(unsigned long address);
-@@ -77,13 +77,13 @@ static inline void kmemcheck_init(void)
- }
- 
- static inline void
--kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,
-+kmemcheck_alloc_shadow(int ctor, gfp_t flags, int node,
- 		       struct page *page, int order)
- {
- }
- 
- static inline void
--kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order)
-+kmemcheck_free_shadow(struct page *page, int order)
- {
- }
- 
-@@ -119,6 +119,21 @@ static inline void kmemcheck_mark_freed(void *address, unsigned int n)
- {
- }
- 
-+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)
-+{
-+}
-+
- #define kmemcheck_annotate_bitfield(field) do { } while (0)
- #endif /* CONFIG_KMEMCHECK */
- 
-diff --git a/mm/kmemcheck.c b/mm/kmemcheck.c
-index eaa41b8..72984c0 100644
---- a/mm/kmemcheck.c
-+++ b/mm/kmemcheck.c
-@@ -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,18 +33,9 @@ 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;
-diff --git a/mm/page_alloc.c b/mm/page_alloc.c
-index d0a240f..1c2cbe2 100644
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -23,6 +23,7 @@
- #include <linux/bootmem.h>
- #include <linux/compiler.h>
- #include <linux/kernel.h>
-+#include <linux/kmemcheck.h>
- #include <linux/module.h>
- #include <linux/suspend.h>
- #include <linux/pagevec.h>
-@@ -511,6 +512,9 @@ static void __free_pages_ok(struct page *page, unsigned int order)
- 	int i;
- 	int reserved = 0;
- 
-+	if (kmemcheck_page_is_tracked(page))
-+		kmemcheck_free_shadow(page, order);
-+
- 	for (i = 0 ; i < (1 << order) ; ++i)
- 		reserved += free_pages_check(page + i);
- 	if (reserved)
-@@ -974,6 +978,9 @@ static void free_hot_cold_page(struct page *page, int cold)
- 	struct per_cpu_pages *pcp;
- 	unsigned long flags;
- 
-+	if (kmemcheck_page_is_tracked(page))
-+		kmemcheck_free_shadow(page, 0);
-+
- 	if (PageAnon(page))
- 		page->mapping = NULL;
- 	if (free_pages_check(page))
-@@ -1637,7 +1644,28 @@ nopage:
- 		dump_stack();
- 		show_mem();
- 	}
-+	return page;
- got_pg:
-+	if (kmemcheck_enabled
-+		&& !(gfp_mask & (__GFP_HIGHMEM | __GFP_IO | __GFP_NOTRACK)))
-+	{
-+		int nr_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, gfp_mask, -1);
-+
-+		if (gfp_mask & __GFP_ZERO)
-+			kmemcheck_mark_initialized_pages(page, nr_pages);
-+		else
-+			kmemcheck_mark_uninitialized_pages(page, nr_pages);
-+	}
-+
- 	return page;
- }
- EXPORT_SYMBOL(__alloc_pages_internal);
-diff --git a/mm/slab.c b/mm/slab.c
-index 37deade..286c6a6 100644
---- a/mm/slab.c
-+++ b/mm/slab.c
-@@ -1600,7 +1600,7 @@ static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid)
- 	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
- 		flags |= __GFP_RECLAIMABLE;
- 
--	page = alloc_pages_node(nodeid, flags, cachep->gfporder);
-+	page = alloc_pages_node(nodeid, flags & ~__GFP_NOTRACK, cachep->gfporder);
- 	if (!page)
- 		return NULL;
- 
-@@ -1614,8 +1614,14 @@ static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid)
- 	for (i = 0; i < nr_pages; i++)
- 		__SetPageSlab(page + i);
- 
--	if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK))
--		kmemcheck_alloc_shadow(cachep, flags, nodeid, page, cachep->gfporder);
-+	if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) {
-+		kmemcheck_alloc_shadow(page, cachep->gfporder, flags, nodeid);
-+
-+		if (cachep->ctor)
-+			kmemcheck_mark_uninitialized_pages(page, nr_pages);
-+		else
-+			kmemcheck_mark_unallocated_pages(page, nr_pages);
-+	}
- 
- 	return page_address(page);
- }
-@@ -1630,7 +1636,7 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr)
- 	const unsigned long nr_freed = i;
- 
- 	if (kmemcheck_page_is_tracked(page))
--		kmemcheck_free_shadow(cachep, page, cachep->gfporder);
-+		kmemcheck_free_shadow(page, cachep->gfporder);
- 
- 	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
- 		sub_zone_page_state(page_zone(page),
-diff --git a/mm/slub.c b/mm/slub.c
-index adcb5e3..eb9855f 100644
---- a/mm/slub.c
-+++ b/mm/slub.c
-@@ -1064,6 +1064,8 @@ static inline struct page *alloc_slab_page(gfp_t flags, int node,
- {
- 	int order = oo_order(oo);
- 
-+	flags |= __GFP_NOTRACK;
-+
- 	if (node == -1)
- 		return alloc_pages(flags, order);
- 	else
-@@ -1095,7 +1097,18 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node)
- 	if (kmemcheck_enabled
- 		&& !(s->flags & (SLAB_NOTRACK | DEBUG_DEFAULT_FLAGS)))
- 	{
--		kmemcheck_alloc_shadow(s, flags, node, page, compound_order(page));
-+		int pages = 1 << oo_order(oo);
-+
-+		kmemcheck_alloc_shadow(page, oo_order(oo), flags, node);
-+
-+		/*
-+		 * 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);
- 	}
- 
- 	page->objects = oo_objects(oo);
-@@ -1172,7 +1185,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
- 	}
- 
- 	if (kmemcheck_page_is_tracked(page))
--		kmemcheck_free_shadow(s, page, compound_order(page));
-+		kmemcheck_free_shadow(page, compound_order(page));
- 
- 	mod_zone_page_state(page_zone(page),
- 		(s->flags & SLAB_RECLAIM_ACCOUNT) ?
-@@ -2679,8 +2692,8 @@ EXPORT_SYMBOL(__kmalloc);
- 
- static void *kmalloc_large_node(size_t size, gfp_t flags, int node)
- {
--	struct page *page = alloc_pages_node(node, flags | __GFP_COMP,
--						get_order(size));
-+	struct page *page = alloc_pages_node(node,
-+		flags | __GFP_COMP | __GFP_NOTRACK, get_order(size));
- 
- 	if (page)
- 		return page_address(page);
--- 
-1.5.6.5
diff --git a/a/content_digest b/N1/content_digest
index 92abbf3..03d11df 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -8,377 +8,5 @@
  " linux-mm@kvack.org\0"
  "\00:1\0"
  "b\0"
- ">From ad913cbefabedf41f021e6e9b64313644d5d479b Mon Sep 17 00:00:00 2001\n"
- "From: Vegard Nossum <vegard.nossum@gmail.com>\n"
- "Date: Tue, 25 Nov 2008 16:55:53 +0100\n"
- "Subject: [PATCH] kmemcheck: add hooks for the page allocator\n"
- "\n"
- "This adds support for tracking the initializedness of memory that\n"
- "was allocated with the page allocator. Requests with the flags\n"
- "__GFP_HIGHMEM or __GFP_IO are not tracked.\n"
- "\n"
- "There seems to be a problem with bio mappings, which gives (among\n"
- "others) this new warning:\n"
- "\n"
- "WARNING: kmemcheck: Caught 8-bit read from uninitialized memory (f6750408)\n"
- "008000011f736d6955534220202020204449534b20322e302020202020202020\n"
- " u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u\n"
- "                 ^\n"
- "\n"
- "Pid: 660, comm: usb-stor-scan Not tainted (2.6.28-rc2 #156) 945P-A\n"
- "EIP: 0060:[<c12a0dc7>] EFLAGS: 00010246 CPU: 0\n"
- "EIP is at scsi_probe_and_add_lun+0x2c7/0x9a0\n"
- "EAX: f6750400 EBX: 00000000 ECX: f675040f EDX: f6750408\n"
- "ESI: 00000024 EDI: f6750424 EBP: f66b3e74 ESP: c174b0e8\n"
- " DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068\n"
- "CR0: 8005003b CR2: f6c1e404 CR3: 01732000 CR4: 000006d0\n"
- "DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000\n"
- "DR6: ffff4ff0 DR7: 00000400\n"
- " [<c12a1aa3>] __scsi_scan_target+0xe3/0x5d0\n"
- " [<c12a1fe2>] scsi_scan_channel+0x52/0x90\n"
- " [<c12a20bb>] scsi_scan_host_selected+0x9b/0x120\n"
- " [<c12a21ae>] do_scsi_scan_host+0x6e/0x70\n"
- " [<c12a244e>] scsi_scan_host+0x13e/0x190\n"
- " [<c130fdbd>] usb_stor_scan_thread+0x16d/0x1b0\n"
- " [<c104543c>] kthread+0x3c/0x70\n"
- " [<c1004cc3>] kernel_thread_helper+0x7/0x14\n"
- " [<ffffffff>] 0xffffffff\n"
- "\n"
- "It is this call: sanitize_inquiry_string(&inq_result[8], 8);\n"
- "\n"
- "As can be seen in the memory dump, the memory is in fact\n"
- "initialized with what seems to the correct (expected) data.\n"
- "\n"
- "This can probably be fixed with an annotation in the bio code, but\n"
- "I don't know if this would really be the correct solution, so I am\n"
- "not doing it for now.\n"
- "\n"
- "Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com>\n"
- "---\n"
- " arch/x86/include/asm/thread_info.h |    4 ++--\n"
- " arch/x86/mm/kmemcheck/shadow.c     |    8 ++++++++\n"
- " include/linux/gfp.h                |    5 +++++\n"
- " include/linux/kmemcheck.h          |   25 ++++++++++++++++++++-----\n"
- " mm/kmemcheck.c                     |   17 ++++-------------\n"
- " mm/page_alloc.c                    |   28 ++++++++++++++++++++++++++++\n"
- " mm/slab.c                          |   14 ++++++++++----\n"
- " mm/slub.c                          |   21 +++++++++++++++++----\n"
- " 8 files changed, 94 insertions(+), 28 deletions(-)\n"
- "\n"
- "diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h\n"
- "index e44d379..1582b16 100644\n"
- "--- a/arch/x86/include/asm/thread_info.h\n"
- "+++ b/arch/x86/include/asm/thread_info.h\n"
- "@@ -149,9 +149,9 @@ struct thread_info {\n"
- " \n"
- " /* thread information allocation */\n"
- " #ifdef CONFIG_DEBUG_STACK_USAGE\n"
- "-#define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO)\n"
- "+#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)\n"
- " #else\n"
- "-#define THREAD_FLAGS GFP_KERNEL\n"
- "+#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK)\n"
- " #endif\n"
- " \n"
- " #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR\n"
- "diff --git a/arch/x86/mm/kmemcheck/shadow.c b/arch/x86/mm/kmemcheck/shadow.c\n"
- "index 62a0f63..969cd4a 100644\n"
- "--- a/arch/x86/mm/kmemcheck/shadow.c\n"
- "+++ b/arch/x86/mm/kmemcheck/shadow.c\n"
- "@@ -88,6 +88,14 @@ void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n)\n"
- " \t\tkmemcheck_mark_uninitialized(page_address(&p[i]), PAGE_SIZE);\n"
- " }\n"
- " \n"
- "+void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n)\n"
- "+{\n"
- "+\tunsigned int i;\n"
- "+\n"
- "+\tfor (i = 0; i < n; ++i)\n"
- "+\t\tkmemcheck_mark_initialized(page_address(&p[i]), PAGE_SIZE);\n"
- "+}\n"
- "+\n"
- " enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size)\n"
- " {\n"
- " \tuint8_t *x;\n"
- "diff --git a/include/linux/gfp.h b/include/linux/gfp.h\n"
- "index 0d55e44..700db60 100644\n"
- "--- a/include/linux/gfp.h\n"
- "+++ b/include/linux/gfp.h\n"
- "@@ -50,7 +50,12 @@ struct vm_area_struct;\n"
- " #define __GFP_THISNODE\t((__force gfp_t)0x40000u)/* No fallback, no policies */\n"
- " #define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */\n"
- " #define __GFP_MOVABLE\t((__force gfp_t)0x100000u)  /* Page is movable */\n"
- "+\n"
- "+#ifdef CONFIG_KMEMCHECK\n"
- " #define __GFP_NOTRACK\t((__force gfp_t)0x200000u)  /* Don't track with kmemcheck */\n"
- "+#else\n"
- "+#define __GFP_NOTRACK\t((__force gfp_t)0)\n"
- "+#endif\n"
- " \n"
- " #define __GFP_BITS_SHIFT 22\t/* Room for 22 __GFP_FOO bits */\n"
- " #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))\n"
- "diff --git a/include/linux/kmemcheck.h b/include/linux/kmemcheck.h\n"
- "index 7073121..04b2289 100644\n"
- "--- a/include/linux/kmemcheck.h\n"
- "+++ b/include/linux/kmemcheck.h\n"
- "@@ -42,9 +42,8 @@ extern int kmemcheck_enabled;\n"
- " void kmemcheck_init(void);\n"
- " \n"
- " /* The slab-related functions. */\n"
- "-void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,\n"
- "-\t\t\t    struct page *page, int order);\n"
- "-void kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order);\n"
- "+void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);\n"
- "+void kmemcheck_free_shadow(struct page *page, int order);\n"
- " void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,\n"
- " \t\t\t  size_t size);\n"
- " void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);\n"
- "@@ -61,6 +60,7 @@ void kmemcheck_mark_freed(void *address, unsigned int n);\n"
- " \n"
- " void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);\n"
- " void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);\n"
- "+void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);\n"
- " \n"
- " int kmemcheck_show_addr(unsigned long address);\n"
- " int kmemcheck_hide_addr(unsigned long address);\n"
- "@@ -77,13 +77,13 @@ static inline void kmemcheck_init(void)\n"
- " }\n"
- " \n"
- " static inline void\n"
- "-kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,\n"
- "+kmemcheck_alloc_shadow(int ctor, gfp_t flags, int node,\n"
- " \t\t       struct page *page, int order)\n"
- " {\n"
- " }\n"
- " \n"
- " static inline void\n"
- "-kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order)\n"
- "+kmemcheck_free_shadow(struct page *page, int order)\n"
- " {\n"
- " }\n"
- " \n"
- "@@ -119,6 +119,21 @@ static inline void kmemcheck_mark_freed(void *address, unsigned int n)\n"
- " {\n"
- " }\n"
- " \n"
- "+static inline void kmemcheck_mark_unallocated_pages(struct page *p,\n"
- "+\t\t\t\t\t\t    unsigned int n)\n"
- "+{\n"
- "+}\n"
- "+\n"
- "+static inline void kmemcheck_mark_uninitialized_pages(struct page *p,\n"
- "+\t\t\t\t\t\t      unsigned int n)\n"
- "+{\n"
- "+}\n"
- "+\n"
- "+static inline void kmemcheck_mark_initialized_pages(struct page *p,\n"
- "+\t\t\t\t\t\t    unsigned int n)\n"
- "+{\n"
- "+}\n"
- "+\n"
- " #define kmemcheck_annotate_bitfield(field) do { } while (0)\n"
- " #endif /* CONFIG_KMEMCHECK */\n"
- " \n"
- "diff --git a/mm/kmemcheck.c b/mm/kmemcheck.c\n"
- "index eaa41b8..72984c0 100644\n"
- "--- a/mm/kmemcheck.c\n"
- "+++ b/mm/kmemcheck.c\n"
- "@@ -1,10 +1,10 @@\n"
- "+#include <linux/gfp.h>\n"
- " #include <linux/mm_types.h>\n"
- " #include <linux/mm.h>\n"
- " #include <linux/slab.h>\n"
- " #include <linux/kmemcheck.h>\n"
- " \n"
- "-void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,\n"
- "-\t\t\t   struct page *page, int order)\n"
- "+void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)\n"
- " {\n"
- " \tstruct page *shadow;\n"
- " \tint pages;\n"
- "@@ -16,7 +16,7 @@ void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,\n"
- " \t * With kmemcheck enabled, we need to allocate a memory area for the\n"
- " \t * shadow bits as well.\n"
- " \t */\n"
- "-\tshadow = alloc_pages_node(node, flags, order);\n"
- "+\tshadow = alloc_pages_node(node, flags | __GFP_NOTRACK, order);\n"
- " \tif (!shadow) {\n"
- " \t\tif (printk_ratelimit())\n"
- " \t\t\tprintk(KERN_ERR \"kmemcheck: failed to allocate \"\n"
- "@@ -33,18 +33,9 @@ void kmemcheck_alloc_shadow(struct kmem_cache *s, gfp_t flags, int node,\n"
- " \t * the memory accesses.\n"
- " \t */\n"
- " \tkmemcheck_hide_pages(page, pages);\n"
- "-\n"
- "-\t/*\n"
- "-\t * Objects from caches that have a constructor don't get\n"
- "-\t * cleared when they're allocated, so we need to do it here.\n"
- "-\t */\n"
- "-\tif (s->ctor)\n"
- "-\t\tkmemcheck_mark_uninitialized_pages(page, pages);\n"
- "-\telse\n"
- "-\t\tkmemcheck_mark_unallocated_pages(page, pages);\n"
- " }\n"
- " \n"
- "-void kmemcheck_free_shadow(struct kmem_cache *s, struct page *page, int order)\n"
- "+void kmemcheck_free_shadow(struct page *page, int order)\n"
- " {\n"
- " \tstruct page *shadow;\n"
- " \tint pages;\n"
- "diff --git a/mm/page_alloc.c b/mm/page_alloc.c\n"
- "index d0a240f..1c2cbe2 100644\n"
- "--- a/mm/page_alloc.c\n"
- "+++ b/mm/page_alloc.c\n"
- "@@ -23,6 +23,7 @@\n"
- " #include <linux/bootmem.h>\n"
- " #include <linux/compiler.h>\n"
- " #include <linux/kernel.h>\n"
- "+#include <linux/kmemcheck.h>\n"
- " #include <linux/module.h>\n"
- " #include <linux/suspend.h>\n"
- " #include <linux/pagevec.h>\n"
- "@@ -511,6 +512,9 @@ static void __free_pages_ok(struct page *page, unsigned int order)\n"
- " \tint i;\n"
- " \tint reserved = 0;\n"
- " \n"
- "+\tif (kmemcheck_page_is_tracked(page))\n"
- "+\t\tkmemcheck_free_shadow(page, order);\n"
- "+\n"
- " \tfor (i = 0 ; i < (1 << order) ; ++i)\n"
- " \t\treserved += free_pages_check(page + i);\n"
- " \tif (reserved)\n"
- "@@ -974,6 +978,9 @@ static void free_hot_cold_page(struct page *page, int cold)\n"
- " \tstruct per_cpu_pages *pcp;\n"
- " \tunsigned long flags;\n"
- " \n"
- "+\tif (kmemcheck_page_is_tracked(page))\n"
- "+\t\tkmemcheck_free_shadow(page, 0);\n"
- "+\n"
- " \tif (PageAnon(page))\n"
- " \t\tpage->mapping = NULL;\n"
- " \tif (free_pages_check(page))\n"
- "@@ -1637,7 +1644,28 @@ nopage:\n"
- " \t\tdump_stack();\n"
- " \t\tshow_mem();\n"
- " \t}\n"
- "+\treturn page;\n"
- " got_pg:\n"
- "+\tif (kmemcheck_enabled\n"
- "+\t\t&& !(gfp_mask & (__GFP_HIGHMEM | __GFP_IO | __GFP_NOTRACK)))\n"
- "+\t{\n"
- "+\t\tint nr_pages = 1 << order;\n"
- "+\n"
- "+\t\t/*\n"
- "+\t\t * NOTE: We choose to track GFP_ZERO pages too; in fact, they\n"
- "+\t\t * can become uninitialized by copying uninitialized memory\n"
- "+\t\t * into them.\n"
- "+\t\t */\n"
- "+\n"
- "+\t\t/* XXX: Can use zone->node for node? */\n"
- "+\t\tkmemcheck_alloc_shadow(page, order, gfp_mask, -1);\n"
- "+\n"
- "+\t\tif (gfp_mask & __GFP_ZERO)\n"
- "+\t\t\tkmemcheck_mark_initialized_pages(page, nr_pages);\n"
- "+\t\telse\n"
- "+\t\t\tkmemcheck_mark_uninitialized_pages(page, nr_pages);\n"
- "+\t}\n"
- "+\n"
- " \treturn page;\n"
- " }\n"
- " EXPORT_SYMBOL(__alloc_pages_internal);\n"
- "diff --git a/mm/slab.c b/mm/slab.c\n"
- "index 37deade..286c6a6 100644\n"
- "--- a/mm/slab.c\n"
- "+++ b/mm/slab.c\n"
- "@@ -1600,7 +1600,7 @@ static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid)\n"
- " \tif (cachep->flags & SLAB_RECLAIM_ACCOUNT)\n"
- " \t\tflags |= __GFP_RECLAIMABLE;\n"
- " \n"
- "-\tpage = alloc_pages_node(nodeid, flags, cachep->gfporder);\n"
- "+\tpage = alloc_pages_node(nodeid, flags & ~__GFP_NOTRACK, cachep->gfporder);\n"
- " \tif (!page)\n"
- " \t\treturn NULL;\n"
- " \n"
- "@@ -1614,8 +1614,14 @@ static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid)\n"
- " \tfor (i = 0; i < nr_pages; i++)\n"
- " \t\t__SetPageSlab(page + i);\n"
- " \n"
- "-\tif (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK))\n"
- "-\t\tkmemcheck_alloc_shadow(cachep, flags, nodeid, page, cachep->gfporder);\n"
- "+\tif (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) {\n"
- "+\t\tkmemcheck_alloc_shadow(page, cachep->gfporder, flags, nodeid);\n"
- "+\n"
- "+\t\tif (cachep->ctor)\n"
- "+\t\t\tkmemcheck_mark_uninitialized_pages(page, nr_pages);\n"
- "+\t\telse\n"
- "+\t\t\tkmemcheck_mark_unallocated_pages(page, nr_pages);\n"
- "+\t}\n"
- " \n"
- " \treturn page_address(page);\n"
- " }\n"
- "@@ -1630,7 +1636,7 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr)\n"
- " \tconst unsigned long nr_freed = i;\n"
- " \n"
- " \tif (kmemcheck_page_is_tracked(page))\n"
- "-\t\tkmemcheck_free_shadow(cachep, page, cachep->gfporder);\n"
- "+\t\tkmemcheck_free_shadow(page, cachep->gfporder);\n"
- " \n"
- " \tif (cachep->flags & SLAB_RECLAIM_ACCOUNT)\n"
- " \t\tsub_zone_page_state(page_zone(page),\n"
- "diff --git a/mm/slub.c b/mm/slub.c\n"
- "index adcb5e3..eb9855f 100644\n"
- "--- a/mm/slub.c\n"
- "+++ b/mm/slub.c\n"
- "@@ -1064,6 +1064,8 @@ static inline struct page *alloc_slab_page(gfp_t flags, int node,\n"
- " {\n"
- " \tint order = oo_order(oo);\n"
- " \n"
- "+\tflags |= __GFP_NOTRACK;\n"
- "+\n"
- " \tif (node == -1)\n"
- " \t\treturn alloc_pages(flags, order);\n"
- " \telse\n"
- "@@ -1095,7 +1097,18 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node)\n"
- " \tif (kmemcheck_enabled\n"
- " \t\t&& !(s->flags & (SLAB_NOTRACK | DEBUG_DEFAULT_FLAGS)))\n"
- " \t{\n"
- "-\t\tkmemcheck_alloc_shadow(s, flags, node, page, compound_order(page));\n"
- "+\t\tint pages = 1 << oo_order(oo);\n"
- "+\n"
- "+\t\tkmemcheck_alloc_shadow(page, oo_order(oo), flags, node);\n"
- "+\n"
- "+\t\t/*\n"
- "+\t\t * Objects from caches that have a constructor don't get\n"
- "+\t\t * cleared when they're allocated, so we need to do it here.\n"
- "+\t\t */\n"
- "+\t\tif (s->ctor)\n"
- "+\t\t\tkmemcheck_mark_uninitialized_pages(page, pages);\n"
- "+\t\telse\n"
- "+\t\t\tkmemcheck_mark_unallocated_pages(page, pages);\n"
- " \t}\n"
- " \n"
- " \tpage->objects = oo_objects(oo);\n"
- "@@ -1172,7 +1185,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page)\n"
- " \t}\n"
- " \n"
- " \tif (kmemcheck_page_is_tracked(page))\n"
- "-\t\tkmemcheck_free_shadow(s, page, compound_order(page));\n"
- "+\t\tkmemcheck_free_shadow(page, compound_order(page));\n"
- " \n"
- " \tmod_zone_page_state(page_zone(page),\n"
- " \t\t(s->flags & SLAB_RECLAIM_ACCOUNT) ?\n"
- "@@ -2679,8 +2692,8 @@ EXPORT_SYMBOL(__kmalloc);\n"
- " \n"
- " static void *kmalloc_large_node(size_t size, gfp_t flags, int node)\n"
- " {\n"
- "-\tstruct page *page = alloc_pages_node(node, flags | __GFP_COMP,\n"
- "-\t\t\t\t\t\tget_order(size));\n"
- "+\tstruct page *page = alloc_pages_node(node,\n"
- "+\t\tflags | __GFP_COMP | __GFP_NOTRACK, get_order(size));\n"
- " \n"
- " \tif (page)\n"
- " \t\treturn page_address(page);\n"
- "-- \n"
- 1.5.6.5
 
-8a461af4a39d6d0e42c1ac7b5216657ebe116b94109c1a248ddf381828ae1938
+bbbf915ebb69005f53eb0cf848ea6c858c341fbf7f3ed4b38dd8834d0c7fd4a6

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.