On Thu, Sep 6, 2018 at 6:32 AM, Liran Alon <liran.alon@xxxxxxxxxx> wrote: > If CPU use both VPID and EPT, TLB entries populated by CPU are tagged > with both EPTP and VPID. Therefore, if L1 uses EPT, L2 TLB entries > are separated from L1 TLB entries by the EPTP tags as vmcs02 use > EPTP02 while vmcs01 use EPTP01. > > Thus, we don't need to make sure that vmcs02->vpid != vmcs01->vpid. > Therefore, we can just set vmcs02->vpid to vmcs12->vpid. > > Reviewed-by: Mihai Carabas <mihai.carabas@xxxxxxxxxx> > Reviewed-by: Darren Kenny <darren.kenny@xxxxxxxxxx> > Reviewed-by: Nikita Leshchenko <nikita.leshchenko@xxxxxxxxxx> > Signed-off-by: Liran Alon <liran.alon@xxxxxxxxxx> I suggested this back in July, but Paolo didn't like it. I still like it. :-) Reviewed-by: Jim Mattson <jmattson@xxxxxxxxxx> > --- > arch/x86/kvm/vmx.c | 18 ++++++++++++++---- > 1 file changed, 14 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index b97e0c5ccb46..98faba65c24a 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -12018,10 +12018,20 @@ static void prepare_vmcs02_full(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) > vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); > > if (enable_vpid) { > - if (nested_cpu_has_vpid(vmcs12) && vmx->nested.vpid02) > - vmcs_write16(VIRTUAL_PROCESSOR_ID, vmx->nested.vpid02); > - else > - vmcs_write16(VIRTUAL_PROCESSOR_ID, vmx->vpid); > + u16 vmcs02_vpid; You could simplify the logic below if you initialize vmcs02_vpid to vmx->vpid. BTW, when did we switch to compilation options that allow mid-block declarations? Woohoo! > + if (nested_cpu_has_vpid(vmcs12)) { > + if (nested_cpu_has_ept(vmcs12)) > + vmcs02_vpid = vmcs12->virtual_processor_id; > + else if (vmx->nested.vpid02) > + vmcs02_vpid = vmx->nested.vpid02; > + else > + vmcs02_vpid = vmx->vpid; > + } else { > + vmcs02_vpid = vmx->vpid; > + } > + > + vmcs_write16(VIRTUAL_PROCESSOR_ID, vmcs02_vpid); > } > > /* > -- > 2.16.1 >