diff options
author | David Rientjes <rientjes@google.com> | 2012-07-09 14:00:38 -0700 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-07-10 22:43:52 +0300 |
commit | 737b719ed6569ffcd015fcdf3039dc7af47af877 (patch) | |
tree | 4a756eb46d499376763263e235568365049f06bc /mm/slub.c | |
parent | 20cea9683ecc6dd75a80c0dd02dc69c64e95be75 (diff) | |
download | lwn-737b719ed6569ffcd015fcdf3039dc7af47af877.tar.gz lwn-737b719ed6569ffcd015fcdf3039dc7af47af877.zip |
mm, slub: ensure irqs are enabled for kmemcheck
kmemcheck_alloc_shadow() requires irqs to be enabled, so wait to disable
them until after its called for __GFP_WAIT allocations.
This fixes a warning for such allocations:
WARNING: at kernel/lockdep.c:2739 lockdep_trace_alloc+0x14e/0x1c0()
Acked-by: Fengguang Wu <fengguang.wu@intel.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Tested-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: David Rientjes <rientjes@google.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/mm/slub.c b/mm/slub.c index 0e0504ed6ff1..e517d435e5dc 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1299,13 +1299,7 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) stat(s, ORDER_FALLBACK); } - if (flags & __GFP_WAIT) - local_irq_disable(); - - if (!page) - return NULL; - - if (kmemcheck_enabled + if (kmemcheck_enabled && page && !(s->flags & (SLAB_NOTRACK | DEBUG_DEFAULT_FLAGS))) { int pages = 1 << oo_order(oo); @@ -1321,6 +1315,11 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) kmemcheck_mark_unallocated_pages(page, pages); } + if (flags & __GFP_WAIT) + local_irq_disable(); + if (!page) + return NULL; + page->objects = oo_objects(oo); mod_zone_page_state(page_zone(page), (s->flags & SLAB_RECLAIM_ACCOUNT) ? |