From: Nadav Amit <namit@vmware.com>
To: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
"Andy Lutomirski" <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>, "Willy Tarreau" <w@1wt.eu>,
"x86@kernel.org" <x86@kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH RFC v2 5/6] x86: Use global pages when PTI is disabled
Date: Thu, 15 Feb 2018 17:36:12 +0000 [thread overview]
Message-ID: <9FF4C41B-AB54-4FD6-9D0F-972CB7C39E42@vmware.com> (raw)
In-Reply-To: <10c21933-fe93-ccad-b315-2a7ca1e917a4@linux.intel.com>
Dave Hansen <dave.hansen@linux.intel.com> wrote:
> On 02/15/2018 08:36 AM, Nadav Amit wrote:
>> As long as PTI is disabled, it is possible to use global pages, as long
>> as we remove them once PTI is enabled again. To do so, return the global
>> bit to __supported_pte_mask and disable global pages using CR4.
>>
>> Signed-off-by: Nadav Amit <namit@vmware.com>
>> ---
>> arch/x86/include/asm/tlbflush.h | 6 ++++++
>> arch/x86/mm/init.c | 14 ++++++--------
>> arch/x86/mm/tlb.c | 3 ++-
>> 3 files changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
>> index ea65cf951c49..3a44cb0a9f56 100644
>> --- a/arch/x86/include/asm/tlbflush.h
>> +++ b/arch/x86/include/asm/tlbflush.h
>> @@ -319,6 +319,12 @@ static inline void set_cpu_pti_disable(unsigned short disable)
>> WARN_ON_ONCE(preemptible());
>>
>> pti_update_user_cs64(cpu_pti_disable(), disable);
>> + if (__supported_pte_mask & _PAGE_GLOBAL) {
>> + if (disable)
>> + cr4_set_bits(X86_CR4_PGE);
>> + else
>> + cr4_clear_bits(X86_CR4_PGE);
>> + }
>> this_cpu_write(cpu_tlbstate.pti_disable, disable);
>> }
>
> The TLB invalidations when doing this switch are *CRITICAL*. Otherwise,
> we end up globally-mapped kernel entries persisting to other processes
> that are then vulnerable to Meltdown.
>
> So, where are the TLB flushes?
>
> They're hidden in the cr4_set/clear_bits() function, of course. This is
> dangerous for two reasons because it makes them non-obvious and hard to
> find. It also has no interactions with the existing TLB invalidation
> infrastructure. That's _safe_ of course because extra flushing is OK,
> but it feels really funky because you're going to end up double-flushing
> on context switches which is rather unfortunate.
>
> This also needs some heavy commenting about the fact that _PAGE_GLOBAL
> is ignored when CR4.PGE=0. That's key to this working and not mentioned
> anywhere.
>
> While this looks OK to me, it still makes me rather nervous. The
> changelog and commenting definitely need a lot of work. I'm also still
> rather unconvinced that the added complexity here is worth it.
I agree that comments, and perhaps some wrapper functions to clarify when a
flush takes place are necessary. I actually sent the patches before making
another pass since I saw they somewhat conflict with your recent patches.
I think that there are several reasons why these patches are not as bad as
they look:
1) Legacy mode performance (with PTI) is bad, but apparently x86-32
applications are still widely used: https://lkml.org/lkml/2018/2/10/38
2) It is likely that at some point you will want to disable PTI selectively
for processes, similarly to the way Windows “trusts” Microsoft SQL. At this
point you are likely to end up with most of the code that these patches
introduce.
next prev parent reply other threads:[~2018-02-15 17:36 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-15 16:35 [PATCH RFC v2 0/6] x86: Disabling PTI in compatibility mode Nadav Amit
2018-02-15 16:35 ` [PATCH RFC v2 1/6] x86: Skip PTI when disable indication is set Nadav Amit
2018-02-15 18:10 ` Dave Hansen
2018-02-15 19:51 ` Andy Lutomirski
2018-02-15 20:51 ` Nadav Amit
2018-02-15 23:35 ` Andy Lutomirski
2018-02-15 16:35 ` [PATCH RFC v2 2/6] x86: Save pti_disable for each mm_context Nadav Amit
2018-02-15 16:35 ` [PATCH RFC v2 3/6] x86: Switching page-table isolation Nadav Amit
2018-02-15 16:36 ` [PATCH RFC v2 4/6] x86: Disable PTI on compatibility mode Nadav Amit
2018-02-15 20:02 ` Andy Lutomirski
2018-02-15 20:58 ` Nadav Amit
2018-02-15 23:29 ` Andy Lutomirski
2018-02-16 0:08 ` Linus Torvalds
2018-02-16 0:22 ` Nadav Amit
2018-02-16 0:42 ` Linus Torvalds
2018-02-16 3:03 ` Andy Lutomirski
2018-02-16 4:55 ` Nadav Amit
2018-02-16 0:35 ` Andrew Cooper
2018-02-16 15:20 ` Andy Lutomirski
2018-02-16 7:11 ` Cyrill Gorcunov
2018-02-16 22:07 ` Dmitry Safonov
2018-02-16 22:11 ` Nadav Amit
2018-02-16 16:25 ` Dmitry Safonov
2018-02-15 16:36 ` [PATCH RFC v2 5/6] x86: Use global pages when PTI is disabled Nadav Amit
2018-02-15 16:54 ` Dave Hansen
2018-02-15 17:36 ` Nadav Amit [this message]
2018-02-15 17:47 ` Nadav Amit
2018-02-15 18:08 ` Dave Hansen
2018-02-15 19:53 ` Andy Lutomirski
2018-02-15 20:32 ` Dave Hansen
2018-02-15 20:45 ` Nadav Amit
2018-02-15 16:36 ` [PATCH RFC v2 6/6] selftest: x86: test using CS64 on compatibility-mode Nadav Amit
2018-02-16 0:21 ` [PATCH RFC v2 0/6] x86: Disabling PTI in compatibility mode Dave Hansen
2018-02-16 0:25 ` Nadav Amit
2018-02-16 0:42 ` Dave Hansen
2018-02-16 0:48 ` Nadav Amit
2018-02-16 0:45 ` Andrew Cooper
2018-02-16 0:51 ` Nadav Amit
2018-02-16 1:04 ` Andrew Cooper
2018-02-16 3:05 ` Andy Lutomirski
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=9FF4C41B-AB54-4FD6-9D0F-972CB7C39E42@vmware.com \
--to=namit@vmware.com \
--cc=dave.hansen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=w@1wt.eu \
--cc=x86@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®