From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 11 Jun 2012 13:04:00 +0200 From: Borislav Petkov To: David Rientjes , Rus Cc: Ben Hutchings , Steven Rostedt , Christoph Lameter , LKML , stable , Greg Kroah-Hartman , Peter Zijlstra Subject: Re: [WARNING] lockdep and kmemcheck_alloc_shadow Message-ID: <20120611110359.GA17022@x1.osrc.amd.com> References: <1337449661.32434.4.camel@gandalf.stny.rr.com> <1337485947.4107.295.camel@deadeye> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="EeQfGwPcQSOJBaQU" Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org List-ID: --EeQfGwPcQSOJBaQU Content-Type: text/plain; charset=utf-8 Content-Disposition: inline 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. --EeQfGwPcQSOJBaQU Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="mm-slub-irq-disable-fix.diff" From: David Rientjes 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 Suggested-by: Ben Hutchings Signed-off-by: David Rientjes --- 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) ? --EeQfGwPcQSOJBaQU--