VMM: Don't flush the EPT unnecessarily
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 2 Dec 2016 19:52:52 +0000 (14:52 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Dec 2016 00:43:24 +0000 (19:43 -0500)
commit92876680b2d53de94b42f7d77c8e92c1db1a75ff
treeb4329aa9639a05f4859f6f1cc3917e96aa71f4fb
parentea5f9e0dde3988f78afa30a264036064d0409ec9
VMM: Don't flush the EPT unnecessarily

We don't need to flush it when we load/unload the GPC, in general.  It's
more like flushing a TLB entry.

We still flush it when unloading the VMCS, since that's when we're leaving
the core for good.  There's a bit of paranoia there: we don't want any old
mappings around that other EPTs could use.  But I don't think that's
necessary.

The main thing is that lazy unload only works per-process.  When the
process leaves the core, we unload then too (__abandon_core()).  That's
when we need to flush the EPT entries: when the process leaves the core.
Otherwise, we could have an old mapping that doesn't get flushed, since
Akaros didn't send the tlb_shootdown() to the core.

Here's the scenario: (for a process 'P1')
- Lazy unload
- Abandon core, no longer belongs to P1
- Another core changes a mapping, sends TLB shootdowns to all cores of
  P1
- Allocate original core to P1
- P1 runs VM, same EPT.  Still has old mappings.

This is also a concern with cr3 and the regular KPT, which is why we
need to manage the EPT's TLB mappings similarly as the KPT.  I think the
current code is OK, but we should probably check it out.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/vmm/intel/vmx.c
kern/arch/x86/vmm/vmm.c
kern/src/process.c