Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752825AbbGNMsr (ORCPT ); Tue, 14 Jul 2015 08:48:47 -0400 Received: from mga11.intel.com ([192.55.52.93]:62426 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751843AbbGNMsq (ORCPT ); Tue, 14 Jul 2015 08:48:46 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,471,1432623600"; d="scan'208";a="762161051" Message-ID: <55A5048E.3090403@intel.com> Date: Tue, 14 Jul 2015 20:46:06 +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: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, bp@suse.de, jgross@suse.com, mcgrof@suse.com, decui@microsoft.com, ross.zwisler@linux.intel.com, sfr@canb.auug.org.au, toshi.kani@hp.com, "mnipxh@163.com" Subject: [PATCH] x86/mm/pat: let level meaningful even NULL return in, lookup_address_in_pgd 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: 2114 Lines: 70 If pmd or pud is not set, we may set a wrong page mapping level. Base knowledge: 1) If we have passed pgd_none() check, then current level is at least PG_LEVEL_1G. 2) If we have passed pud_large() ||!pud_present() check, then current level is at least PG_LEVEL_2M. This patch does not change the behavior when a non-NULL value is returned. Let's take bask knowledge 2 as an example. We know *address* belongs to *pud*, however for some reasons *pmd* is NULL. For example, this address has no physical pages mapped. What we could benefit from this patch are below: 1) We can walk memory range easier. If addressA passed to lookup_address(), and NULL returned. We can pass addressA + level_to_size(level) to lookup_address() in next loop. ... if (!pte) { /* level_to_size has not been implemented in upstream*/ address += level_to_size(level); continue; } ... 2) keep same behavior because level is set to PG_LEVEL_4K even when pte is NULL. So let *level* meaningful even lookup_address_in_pgd return NULL by moving the assignment before pud/pmd_offset. Signed-off-by: Pan Xinhui --- arch/x86/mm/pageattr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 727158c..a887704 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -336,19 +336,19 @@ pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address, if (pgd_none(*pgd)) return NULL; + *level = PG_LEVEL_1G; pud = pud_offset(pgd, address); if (pud_none(*pud)) return NULL; - *level = PG_LEVEL_1G; if (pud_large(*pud) || !pud_present(*pud)) return (pte_t *)pud; + *level = PG_LEVEL_2M; pmd = pmd_offset(pud, address); if (pmd_none(*pmd)) return NULL; - *level = PG_LEVEL_2M; if (pmd_large(*pmd) || !pmd_present(*pmd)) return (pte_t *)pmd; -- 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/