• Sean Christopherson's avatar
    KVM: nVMX: Intercept VMWRITEs to read-only shadow VMCS fields · fadcead0
    Sean Christopherson authored
    Allowing L1 to VMWRITE read-only fields is only beneficial in a double
    nesting scenario, e.g. no sane VMM will VMWRITE VM_EXIT_REASON in normal
    non-nested operation.  Intercepting RO fields means KVM doesn't need to
    sync them from the shadow VMCS to vmcs12 when running L2.  The obvious
    downside is that L1 will VM-Exit more often when running L3, but it's
    likely safe to assume most folks would happily sacrifice a bit of L3
    performance, which may not even be noticeable in the grande scheme, to
    improve L2 performance across the board.
    
    Not intercepting fields tagged read-only also allows for additional
    optimizations, e.g. marking GUEST_{CS,SS}_AR_BYTES as SHADOW_FIELD_RO
    since those fields are rarely written by a VMMs, but read frequently.
    
    When utilizing a shadow VMCS with asymmetric R/W and R/O bitmaps, fields
    that cause VM-Exit on VMWRITE but not VMREAD need to be propagated to
    the shadow VMCS during VMWRITE emulation, otherwise a subsequence VMREAD
    from L1 will consume a stale value.
    
    Note, KVM currently utilizes asymmetric bitmaps when "VMWRITE any field"
    is not exposed to L1, but only so that it can reject the VMWRITE, i.e.
    propagating the VMWRITE to the shadow VMCS is a new requirement, not a
    bug fix.
    
    Eliminating the copying of RO fields reduces the latency of nested
    VM-Entry (copy_shadow_to_vmcs12()) by ~100 cycles (plus 40-50 cycles
    if/when the AR_BYTES fields are exposed RO).
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    fadcead0
nested.c 175 KB