On Mon, Jun 11, 2012 at 02:56:03AM -0700, David Rientjes wrote: > On Sun, 20 May 2012, David Rientjes wrote: > > > Agreed, slab handles this correctly and it looks like slub ends up > > disabling irqs too early. > > > > Does this fix it? If so, we'll need to annotate it for stable as Ben > > noted. > > > > Steven, did you have a chance to see if this fixes the issue for you? Can > I add your Tested-by?
Hehe, this got triggered through a different path too: http://marc.info/?l=linux-kernel&m=133909780907766 @Rus: Can you pls test David's patch? I'm re-attaching it here. Thanks. -- Regards/Gruss, Boris.
From: David Rientjes <[email protected]> mm, slub: ensure irqs are not disabled for kmemcheck allocation kmemcheck_alloc_shadow() cannot be called with irqs disabled, which is possible with __GFP_WAIT. Ensure we always have them enabled at allocation time like slab does. Reported-by: Steven Rostedt <[email protected]> Suggested-by: Ben Hutchings <[email protected]> Signed-off-by: David Rientjes <[email protected]> --- diff --git a/mm/slub.c b/mm/slub.c --- a/mm/slub.c +++ b/mm/slub.c @@ -1314,13 +1314,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 (page && kmemcheck_enabled && !(s->flags & (SLAB_NOTRACK | DEBUG_DEFAULT_FLAGS))) { int pages = 1 << oo_order(oo); @@ -1336,6 +1330,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) ?
