• Andy Lutomirski's avatar
    x86, kvm, vmx: Always use LOAD_IA32_EFER if available · f6577a5f
    Andy Lutomirski authored
    At least on Sandy Bridge, letting the CPU switch IA32_EFER is much
    faster than switching it manually.
    
    I benchmarked this using the vmexit kvm-unit-test (single run, but
    GOAL multiplied by 5 to do more iterations):
    
    Test                                  Before      After    Change
    cpuid                                   2000       1932    -3.40%
    vmcall                                  1914       1817    -5.07%
    mov_from_cr8                              13         13     0.00%
    mov_to_cr8                                19         19     0.00%
    inl_from_pmtimer                       19164      10619   -44.59%
    inl_from_qemu                          15662      10302   -34.22%
    inl_from_kernel                         3916       3802    -2.91%
    outl_to_kernel                          2230       2194    -1.61%
    mov_dr                                   172        176     2.33%
    ipi                                (skipped)  (skipped)
    ipi+halt                           (skipped)  (skipped)
    ple-round-robin                           13         13     0.00%
    wr_tsc_adjust_msr                       1920       1845    -3.91%
    rd_tsc_adjust_msr                       1892       1814    -4.12%
    mmio-no-eventfd:pci-mem                16394      11165   -31.90%
    mmio-wildcard-eventfd:pci-mem           4607       4645     0.82%
    mmio-datamatch-eventfd:pci-mem          4601       4610     0.20%
    portio-no-eventfd:pci-io               11507       7942   -30.98%
    portio-wildcard-eventfd:pci-io          2239       2225    -0.63%
    portio-datamatch-eventfd:pci-io         2250       2234    -0.71%
    
    I haven't explicitly computed the significance of these numbers,
    but this isn't subtle.
    Signed-off-by: default avatarAndy Lutomirski <luto@amacapital.net>
    [The results were reproducible on all of Nehalem, Sandy Bridge and
     Ivy Bridge.  The slowness of manual switching is because writing
     to EFER with WRMSR triggers a TLB flush, even if the only bit you're
     touching is SCE (so the page table format is not affected).  Doing
     the write as part of vmentry/vmexit, instead, does not flush the TLB,
     probably because all processors that have EPT also have VPID. - Paolo]
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f6577a5f
vmx.c 263 KB