From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Vrabel Subject: [PATCH 2/2] x86: use pv-ops in {pte, pmd}_{set, clear}_flags() Date: Fri, 21 Mar 2014 18:18:22 +0000 Message-ID: <1395425902-29817-3-git-send-email-david.vrabel@citrix.com> References: <1395425902-29817-1-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WR41d-0003jX-V0 for xen-devel@lists.xenproject.org; Fri, 21 Mar 2014 18:18:39 +0000 In-Reply-To: <1395425902-29817-1-git-send-email-david.vrabel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: Steven Noonan , Mel Gorman , Elena Ufimtseva , Boris Ostrovsky , David Vrabel List-Id: xen-devel@lists.xenproject.org Instead of using native functions to operate on the PTEs in pte_set_flags(), pte_clear_flags(), pmd_set_flags(), pmd_clear_flags() use the PV aware ones. This fixes a regression in Xen PV guests introduced by 1667918b6483 (mm: numa: clear numa hinting information on mprotect). Xen PV guest page tables require that their entries use machine addresses if the preset bit (_PAGE_PRESENT) is set, and (for successful migration) non-present PTEs must use pseudo-physical addresses. This is because on migration MFNs in present PTEs are translated to PFNs (canonicalised) so they may be translated back to the new MFN in the destination domain (uncanonicalised). pte_mknonnuma(), pmd_mknonnuma(), pte_mknuma() and pmd_mknuma() set and clear the _PAGE_PRESENT bit using pte_set_flags(), pte_clear_flags(), etc. In a Xen PV guest, these functions must translate MFNs to PFNs when clearing _PAGE_PRESENT and translate PFNs to MFNs when setting _PAGE_PRESENT. Signed-off-by: David Vrabel Cc: Steven Noonan Cc: Elena Ufimtseva Cc: Mel Gorman Cc: [3.12+] --- arch/x86/include/asm/pgtable.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index bbc8b12..323e5e2 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -174,16 +174,16 @@ static inline int has_transparent_hugepage(void) static inline pte_t pte_set_flags(pte_t pte, pteval_t set) { - pteval_t v = native_pte_val(pte); + pteval_t v = pte_val(pte); - return native_make_pte(v | set); + return __pte(v | set); } static inline pte_t pte_clear_flags(pte_t pte, pteval_t clear) { - pteval_t v = native_pte_val(pte); + pteval_t v = pte_val(pte); - return native_make_pte(v & ~clear); + return __pte(v & ~clear); } static inline pte_t pte_mkclean(pte_t pte) @@ -248,14 +248,14 @@ static inline pte_t pte_mkspecial(pte_t pte) static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set) { - pmdval_t v = native_pmd_val(pmd); + pmdval_t v = pmd_val(pmd); return __pmd(v | set); } static inline pmd_t pmd_clear_flags(pmd_t pmd, pmdval_t clear) { - pmdval_t v = native_pmd_val(pmd); + pmdval_t v = pmd_val(pmd); return __pmd(v & ~clear); } -- 1.7.2.5