On Fri, Aug 17, 2018 at 09:13:51AM -0700, Linus Torvalds wrote: > On Thu, Aug 16, 2018 at 1:47 PM Sean Christopherson > <sean.j.christopher...@intel.com> wrote: > > > > Fixes: 6b28baca9b1f ("x86/speculation/l1tf: Protect PROT_NONE PTEs against > > speculation") > > This seems wrong. > > That commit doesn't invert a cleared page table entry, because that > commit still required _PAGE_PROTNONE being set for a pte to be > inverted. > > I'm assuming the real culprit is commit f22cc87f6c1f > ("x86/speculation/l1tf: Invert all not present mappings") which made > it look at _just_ the present bit. > > And yeah, that was wrong. > > So I really think a much better patch would be the appended one-liner. > > Note - it's whitespace-damaged by cut-and-paste, but it should be > obvious enough to apply by hand. > > Can you test this one instead?
Checking for a non-zero val in __pte_needs_invert() also resolves the issue. I shied away from that change because prot_none_walk() doesn't pass the full PTE to __pte_needs_invert(), it only passes the pgprot_t bits. This works because PAGE_NONE sets the global and accessed bits, but it made me nervous nonetheless. > Linus > --- > > arch/x86/include/asm/pgtable-invert.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/pgtable-invert.h > b/arch/x86/include/asm/pgtable-invert.h > index 44b1203ece12..821438e91b77 100644 > --- a/arch/x86/include/asm/pgtable-invert.h > +++ b/arch/x86/include/asm/pgtable-invert.h > @@ -6,7 +6,7 @@ > > static inline bool __pte_needs_invert(u64 val) > { > - return !(val & _PAGE_PRESENT); > + return val && !(val & _PAGE_PRESENT); > } > > /* Get a mask to xor with the page table entry to get the correct pfn. */