From patchwork Tue Nov 22 16:53:06 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Christoph Lameter (Ampere)" X-Patchwork-Id: 127130 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E80DDB70C2 for ; Wed, 23 Nov 2011 03:53:33 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754437Ab1KVQxM (ORCPT ); Tue, 22 Nov 2011 11:53:12 -0500 Received: from smtp109.prem.mail.ac4.yahoo.com ([76.13.13.92]:42138 "HELO smtp109.prem.mail.ac4.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753554Ab1KVQxL (ORCPT ); Tue, 22 Nov 2011 11:53:11 -0500 Received: (qmail 58599 invoked from network); 22 Nov 2011 16:53:10 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1321980790; bh=sFZ+y3nl1iKZVhAx05wy8d6xU+UH4aKf1cNpWG9njLg=; h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Date:From:X-X-Sender:To:cc:Subject:In-Reply-To:Message-ID:References:User-Agent:MIME-Version:Content-Type; b=zP48AzSESA9SlneDqX5McmwPAnDsI9rYwEi9/FpsUys2Wi3xFbkJtm9Qs3R8CqyYNZXXbD2aE3iB+UYbPCPCrr97GJZKR9wKrU+GQRbcdWcnHPYAsrNeVjtTf5dEh3pTiLG1z6bUEon+r9nWxjWDkf51Va7G7GRo44j6cNKqWGk= X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: SkLTNzIVM1meAYkjFxnPREAU31xXsJJIGkEHUbLQE.jOkAj pxzCTwVgv8Eukt0bovS3RsImLusJheZfGpMkVWCMuL3R2IbYyjjCb50P4ey8 1d38GY_qiPqoJohiV_vYAwpGRQsdG8pSYxWOBuNbPN4SD_XjrUXs8aWZLgzi IHg2ad3yH3WnUbhkNbvgE7YqLTOmULLrSNquegfuOYYHoGoVhijbYMBAaXnf aNOw9jGqH2YHB7DExMYfbxDVBD.NK0pa6NSxGNSjEUqSnsZF9QNM3zD3HWtn 5yrhxs337qzOSraucuKkd0XZjVvjhn67gxPw.CP29EtKQKvDxJusKflO8oRv wnQ1hyn.zl5ny9Igekp9yShwE1NDDykpLulYBqTb61kDPxw-- X-Yahoo-SMTP: _Dag8S.swBC1p4FJKLCXbs8NQzyse1SYSgnAbY0- Received: from router.home (cl@99.30.10.212 with plain) by smtp109.prem.mail.ac4.yahoo.com with SMTP; 22 Nov 2011 08:53:10 -0800 PST Received: from cl (helo=localhost) by router.home with local-esmtp (Exim 4.71) (envelope-from ) id 1RStan-0007cl-FN; Tue, 22 Nov 2011 10:53:09 -0600 Date: Tue, 22 Nov 2011 10:53:06 -0600 (CST) From: Christoph Lameter X-X-Sender: cl@router.home 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 Subject: slub: Lockout validation scans during freeing of object In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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;