• Avi Kivity's avatar
    KVM: Allow not-present guest page faults to bypass kvm · c7addb90
    Avi Kivity authored
    There are two classes of page faults trapped by kvm:
     - host page faults, where the fault is needed to allow kvm to install
       the shadow pte or update the guest accessed and dirty bits
     - guest page faults, where the guest has faulted and kvm simply injects
       the fault back into the guest to handle
    
    The second class, guest page faults, is pure overhead.  We can eliminate
    some of it on vmx using the following evil trick:
     - when we set up a shadow page table entry, if the corresponding guest pte
       is not present, set up the shadow pte as not present
     - if the guest pte _is_ present, mark the shadow pte as present but also
       set one of the reserved bits in the shadow pte
     - tell the vmx hardware not to trap faults which have the present bit clear
    
    With this, normal page-not-present faults go directly to the guest,
    bypassing kvm entirely.
    
    Unfortunately, this trick only works on Intel hardware, as AMD lacks a
    way to discriminate among page faults based on error code.  It is also
    a little risky since it uses reserved bits which might become unreserved
    in the future, so a module parameter is provided to disable it.
    Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
    c7addb90
vmx.c 64.9 KB