From: tip-bot for Joerg Roedel <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
dhgutteridge@sympatico.ca, llong@redhat.com,
David.Laight@aculab.com, tglx@linutronix.de,
dave.hansen@intel.com, jgross@suse.com, aarcange@redhat.com,
brgerst@gmail.com, jroedel@suse.de, jpoimboe@redhat.com,
hpa@zytor.com, torvalds@linux-foundation.org,
gregkh@linuxfoundation.org, will.deacon@arm.com,
peterz@infradead.org, dvlasenk@redhat.com,
boris.ostrovsky@oracle.com, luto@kernel.org, eduval@amazon.com,
pavel@ucw.cz, joro@8bytes.org, bp@alien8.de, jkosina@suse.cz
Subject: [tip:x86/pti] x86/pgtable: Don't set huge PUD/PMD on non-leaf entries
Date: Thu, 12 Apr 2018 00:52:23 -0700 [thread overview]
Message-ID: <tip-e3e288121408c3abeed5af60b87b95c847143845@git.kernel.org> (raw)
In-Reply-To: <20180411152437.GC15462@8bytes.org>
Commit-ID: e3e288121408c3abeed5af60b87b95c847143845
Gitweb: https://git.kernel.org/tip/e3e288121408c3abeed5af60b87b95c847143845
Author: Joerg Roedel <joro@8bytes.org>
AuthorDate: Wed, 11 Apr 2018 17:24:38 +0200
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 12 Apr 2018 09:41:41 +0200
x86/pgtable: Don't set huge PUD/PMD on non-leaf entries
The pmd_set_huge() and pud_set_huge() functions are used from
the generic ioremap() code to establish large mappings where this
is possible.
But the generic ioremap() code does not check whether the
PMD/PUD entries are already populated with a non-leaf entry,
so that any page-table pages these entries point to will be
lost.
Further, on x86-32 with SHARED_KERNEL_PMD=0, this causes a
BUG_ON() in vmalloc_sync_one() when PMD entries are synced
from swapper_pg_dir to the current page-table. This happens
because the PMD entry from swapper_pg_dir was promoted to a
huge-page entry while the current PGD still contains the
non-leaf entry. Because both entries are present and point
to a different page, the BUG_ON() triggers.
This was actually triggered with pti-x32 enabled in a KVM
virtual machine by the graphics driver.
A real and better fix for that would be to improve the
page-table handling in the generic ioremap() code. But that is
out-of-scope for this patch-set and left for later work.
Reported-by: David H. Gutteridge <dhgutteridge@sympatico.ca>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: David Laight <David.Laight@aculab.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Eduardo Valentin <eduval@amazon.com>
Cc: Greg KH <gregkh@linuxfoundation.org>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Waiman Long <llong@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: aliguori@amazon.com
Cc: daniel.gruss@iaik.tugraz.at
Cc: hughd@google.com
Cc: keescook@google.com
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/20180411152437.GC15462@8bytes.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
arch/x86/mm/pgtable.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index d10a40aceeaa..ffc8c13c50e4 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/mm.h>
#include <linux/gfp.h>
+#include <linux/hugetlb.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <asm/tlb.h>
@@ -639,6 +640,10 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
(mtrr != MTRR_TYPE_WRBACK))
return 0;
+ /* Bail out if we are we on a populated non-leaf entry: */
+ if (pud_present(*pud) && !pud_huge(*pud))
+ return 0;
+
prot = pgprot_4k_2_large(prot);
set_pte((pte_t *)pud, pfn_pte(
@@ -667,6 +672,10 @@ int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
return 0;
}
+ /* Bail out if we are we on a populated non-leaf entry: */
+ if (pmd_present(*pmd) && !pmd_huge(*pmd))
+ return 0;
+
prot = pgprot_4k_2_large(prot);
set_pte((pte_t *)pmd, pfn_pte(
prev parent reply other threads:[~2018-04-12 7:52 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-16 19:29 [PATCH 00/35 v4] PTI support for x32 Joerg Roedel
2018-03-16 19:29 ` [PATCH 01/35] x86/asm-offsets: Move TSS_sp0 and TSS_sp1 to asm-offsets.c Joerg Roedel
2018-03-16 19:29 ` [PATCH 02/35] x86/entry/32: Rename TSS_sysenter_sp0 to TSS_entry_stack Joerg Roedel
2018-03-16 19:29 ` [PATCH 03/35] x86/entry/32: Load task stack from x86_tss.sp1 in SYSENTER handler Joerg Roedel
2018-03-16 19:29 ` [PATCH 04/35] x86/entry/32: Put ESPFIX code into a macro Joerg Roedel
2018-03-16 19:29 ` [PATCH 05/35] x86/entry/32: Unshare NMI return path Joerg Roedel
2018-03-16 19:29 ` [PATCH 06/35] x86/entry/32: Split off return-to-kernel path Joerg Roedel
2018-03-16 19:29 ` [PATCH 07/35] x86/entry/32: Enter the kernel via trampoline stack Joerg Roedel
2018-03-16 19:29 ` [PATCH 08/35] x86/entry/32: Leave " Joerg Roedel
2018-03-16 19:29 ` [PATCH 09/35] x86/entry/32: Introduce SAVE_ALL_NMI and RESTORE_ALL_NMI Joerg Roedel
2018-03-16 19:29 ` [PATCH 10/35] x86/entry/32: Handle Entry from Kernel-Mode on Entry-Stack Joerg Roedel
2018-03-16 19:29 ` [PATCH 11/35] x86/entry/32: Simplify debug entry point Joerg Roedel
2018-03-16 19:29 ` [PATCH 12/35] x86/32: Use tss.sp1 as cpu_current_top_of_stack Joerg Roedel
2018-03-16 19:29 ` [PATCH 13/35] x86/entry/32: Add PTI cr3 switch to non-NMI entry/exit points Joerg Roedel
2018-03-16 19:29 ` [PATCH 14/35] x86/entry/32: Add PTI cr3 switches to NMI handler code Joerg Roedel
2018-03-16 19:29 ` [PATCH 15/35] x86/pgtable: Rename pti_set_user_pgd to pti_set_user_pgtbl Joerg Roedel
2018-03-16 19:29 ` [PATCH 16/35] x86/pgtable/pae: Unshare kernel PMDs when PTI is enabled Joerg Roedel
2018-03-16 19:29 ` [PATCH 17/35] x86/pgtable/32: Allocate 8k page-tables " Joerg Roedel
2018-03-16 19:29 ` [PATCH 18/35] x86/pgtable: Move pgdp kernel/user conversion functions to pgtable.h Joerg Roedel
2018-03-16 19:29 ` [PATCH 19/35] x86/pgtable: Move pti_set_user_pgtbl() " Joerg Roedel
2018-03-16 19:29 ` [PATCH 20/35] x86/pgtable: Move two more functions from pgtable_64.h " Joerg Roedel
2018-03-16 19:29 ` [PATCH 21/35] x86/mm/pae: Populate valid user PGD entries Joerg Roedel
2018-03-16 19:29 ` [PATCH 22/35] x86/mm/pae: Populate the user page-table with user pgd's Joerg Roedel
2018-03-16 19:29 ` [PATCH 23/35] x86/mm/legacy: " Joerg Roedel
2018-03-16 19:29 ` [PATCH 24/35] x86/mm/pti: Add an overflow check to pti_clone_pmds() Joerg Roedel
2018-03-16 19:29 ` [PATCH 25/35] x86/mm/pti: Define X86_CR3_PTI_PCID_USER_BIT on x86_32 Joerg Roedel
2018-03-16 19:29 ` [PATCH 26/35] x86/mm/pti: Clone CPU_ENTRY_AREA on PMD level " Joerg Roedel
2018-03-16 19:29 ` [PATCH 27/35] x86/mm/dump_pagetables: Define INIT_PGD Joerg Roedel
2018-03-16 19:29 ` [PATCH 28/35] x86/pgtable/pae: Use separate kernel PMDs for user page-table Joerg Roedel
2018-03-16 19:29 ` [PATCH 29/35] x86/ldt: Reserve address-space range on 32 bit for the LDT Joerg Roedel
2018-03-16 19:29 ` [PATCH 30/35] x86/ldt: Define LDT_END_ADDR Joerg Roedel
2018-03-16 19:29 ` [PATCH 31/35] x86/ldt: Split out sanity check in map_ldt_struct() Joerg Roedel
2018-03-16 19:29 ` [PATCH 32/35] x86/ldt: Enable LDT user-mapping for PAE Joerg Roedel
2018-03-16 19:29 ` [PATCH 33/35] x86/pti: Allow CONFIG_PAGE_TABLE_ISOLATION for x86_32 Joerg Roedel
2018-03-16 19:29 ` [PATCH 34/35] x86/mm/pti: Add Warning when booting on a PCID capable CPU Joerg Roedel
2018-03-16 19:29 ` [PATCH 35/35] x86/entry/32: Add debug code to check entry/exit cr3 Joerg Roedel
2018-04-11 15:24 ` [PATCH] x86/pgtable: Don't set huge pud/pmd on non-leaf entries Joerg Roedel
2018-04-11 15:24 ` Joerg Roedel
2018-04-12 7:52 ` tip-bot for Joerg Roedel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-e3e288121408c3abeed5af60b87b95c847143845@git.kernel.org \
--to=tipbot@zytor.com \
--cc=David.Laight@aculab.com \
--cc=aarcange@redhat.com \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=brgerst@gmail.com \
--cc=dave.hansen@intel.com \
--cc=dhgutteridge@sympatico.ca \
--cc=dvlasenk@redhat.com \
--cc=eduval@amazon.com \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=jkosina@suse.cz \
--cc=joro@8bytes.org \
--cc=jpoimboe@redhat.com \
--cc=jroedel@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=llong@redhat.com \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=pavel@ucw.cz \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.