From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail137.messagelabs.com (mail137.messagelabs.com [216.82.249.19]) by kanga.kvack.org (Postfix) with SMTP id B04F86B0069 for ; Tue, 22 Nov 2011 11:53:12 -0500 (EST) Date: Tue, 22 Nov 2011 10:53:06 -0600 (CST) From: Christoph Lameter Subject: slub: Lockout validation scans during freeing of object In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-linux-mm@kvack.org List-ID: To: Eric Dumazet Cc: Markus Trippelsdorf , Christian Kujau , Benjamin Herrenschmidt , "Alex,Shi" , "linux-kernel@vger.kernel.org" , "linux-mm@kvack.org" , Pekka Enberg , Matt Mackall , "netdev@vger.kernel.org" , Tejun Heo A bit heavy handed locking but this should do the trick. Subject: slub: Lockout validation scans during freeing of object Slab validation can run right now while the slab free paths prepare the redzone fields etc around the objects in preparation of the actual freeing of the object. This can lead to false positives. Take the node lock unconditionally during free so that the validation can examine objects without them being disturbed by freeing operations. Signed-off-by: Christoph Lameter --- mm/slub.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2011-11-22 10:42:19.000000000 -0600 +++ linux-2.6/mm/slub.c 2011-11-22 10:44:34.000000000 -0600 @@ -2391,8 +2391,15 @@ static void __slab_free(struct kmem_cach stat(s, FREE_SLOWPATH); - if (kmem_cache_debug(s) && !free_debug_processing(s, page, x, addr)) - return; + if (kmem_cache_debug(s)) { + + /* Lock out any concurrent validate_slab calls */ + n = get_node(s, page_to_nid(page)); + spin_lock_irqsave(&n->list_lock, flags); + + if (!free_debug_processing(s, page, x, addr)) + goto out; + } do { prior = page->freelist; @@ -2471,6 +2478,7 @@ static void __slab_free(struct kmem_cach stat(s, FREE_ADD_PARTIAL); } } +out: spin_unlock_irqrestore(&n->list_lock, flags); return; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: email@kvack.org