Re: [RFC 00/10] Process-local memory allocations for hiding KVM secrets
From: Andy Lutomirski
Date: Mon Jun 17 2019 - 14:58:35 EST
On Mon, Jun 17, 2019 at 11:44 AM Konrad Rzeszutek Wilk
<konrad.wilk@xxxxxxxxxx> wrote:
>
> On Mon, Jun 17, 2019 at 11:07:45AM -0700, Dave Hansen wrote:
> > On 6/17/19 9:53 AM, Nadav Amit wrote:
> > >>> For anyone following along at home, I'm going to go off into crazy
> > >>> per-cpu-pgds speculation mode now... Feel free to stop reading now. :)
> > >>>
> > >>> But, I was thinking we could get away with not doing this on _every_
> > >>> context switch at least. For instance, couldn't 'struct tlb_context'
> > >>> have PGD pointer (or two with PTI) in addition to the TLB info? That
> > >>> way we only do the copying when we change the context. Or does that tie
> > >>> the implementation up too much with PCIDs?
> > >> Hmm, that seems entirely reasonable. I think the nasty bit would be
> > >> figuring out all the interactions with PV TLB flushing. PV TLB
> > >> flushes already don't play so well with PCID tracking, and this will
> > >> make it worse. We probably need to rewrite all that code regardless.
> > > How is PCID (as you implemented) related to TLB flushing of kernel (not
> > > user) PTEs? These kernel PTEs would be global, so they would be invalidated
> > > from all the address-spaces using INVLPG, I presume. No?
> >
> > The idea is that you have a per-cpu address space. Certain kernel
> > virtual addresses would map to different physical address based on where
> > you are running. Each of the physical addresses would be "owned" by a
> > single CPU and would, by convention, never use a PGD that mapped an
> > address unless that CPU that "owned" it.
> >
> > In that case, you never really invalidate those addresses.
>
> But you would need to invalidate if the process moved to another CPU, correct?
>
There's nothing to invalidate. It's a different CPU with a different TLB.
The big problem is that you have a choice. Either you can have one
PGD per (mm, cpu) or you just have one or a few PGDs per CPU and you
change them every time you change processes. Dave's idea to have one
or two per (cpu, asid) is right, though. It means we have a decent
chance of context switching without rewriting the whole thing, and it
also means we don't need to write to the one that's currently loaded
when we switch CR3. The latter could plausibly be important enough
that we'd want to pretend we're using PCID even if we're not.