Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753878AbbGWBzr (ORCPT ); Wed, 22 Jul 2015 21:55:47 -0400 Received: from mga09.intel.com ([134.134.136.24]:57961 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753666AbbGWBzW (ORCPT ); Wed, 22 Jul 2015 21:55:22 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,527,1432623600"; d="scan'208";a="769537484" Message-ID: <55B048F9.9090403@intel.com> Date: Thu, 23 Jul 2015 09:52:57 +0800 From: Pan Xinhui User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: "linux-kernel@vger.kernel.org" CC: Thomas Gleixner , mingo@redhat.com, hpa@zytor.com, x86@kernel.org, bp@suse.de, toshi.kani@hp.com, jgross@suse.com, mcgrof@suse.com, "mnipxh@163.com" , "yanmin_zhang@linux.intel.com" , Borislav Petkov Subject: [PATCH V5] x86/mm/pat: Do a small optimization and fix in reserve_memtype Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3130 Lines: 92 From: Pan Xinhui It's more reasonable to unlock memtype_lock right after rbt_memtype_check_insert. All pat_rbtree operations need to be performed while holding the memtype_lock. But codes like kfree, pr_info, etc have nothing to do with this lock. So move spin_unlock a little ahead. If *new* succeed to be stored into the rb-tree, we might hit panic. Because we access *new* in dprintk "cattr_name(new->type)". Data stored in the rb-tree might be freed at any possbile time. It's abviously wrong to access such data without lock held. We use actual_type instead of new->type in dprintk. Two benefits, 1) We don't touch *new* here now so panic can be avoided. 2) As new->type is same with *new_type, We needn't to print it again, what's more, this actual_type's output can help dubug. When new_type is NULL, actual_type is equal to new->type, So no key information is lost. Do a minor codes style improvement. Signed-off-by: Pan Xinhui --- change from v4: codes style improvement by removing {}. @sorry for that, make reviewing a patch so much complex, this should be done in V4. change from v3: output actual_type instead of new->type. codes style improvement. update comments. change from v2: update comments. change from V1: fix an access of *new* without memtype_lock held. --- arch/x86/mm/pat.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 188e3e0..268b2c8 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c @@ -520,14 +520,10 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type, *new_type = actual_type; is_range_ram = pat_pagerange_is_ram(start, end); - if (is_range_ram == 1) { - - err = reserve_ram_pages_type(start, end, req_type, new_type); - - return err; - } else if (is_range_ram < 0) { + if (is_range_ram == 1) + return reserve_ram_pages_type(start, end, req_type, new_type); + else if (is_range_ram < 0) return -EINVAL; - } new = kzalloc(sizeof(struct memtype), GFP_KERNEL); if (!new) @@ -538,22 +534,19 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type, new->type = actual_type; spin_lock(&memtype_lock); - err = rbt_memtype_check_insert(new, new_type); + spin_unlock(&memtype_lock); + if (err) { pr_info("x86/PAT: reserve_memtype failed [mem %#010Lx-%#010Lx], track %s, req %s\n", start, end - 1, cattr_name(new->type), cattr_name(req_type)); kfree(new); - spin_unlock(&memtype_lock); - return err; } - spin_unlock(&memtype_lock); - dprintk("reserve_memtype added [mem %#010Lx-%#010Lx], track %s, req %s, ret %s\n", - start, end - 1, cattr_name(new->type), cattr_name(req_type), + start, end - 1, cattr_name(actual_type), cattr_name(req_type), new_type ? cattr_name(*new_type) : "-"); return err; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/