lkml.org 
[lkml]   [2014]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] x86, kvm, vmx: Always use LOAD_IA32_EFER if available
Hi Andy,
On Fri, Nov 07, 2014 at 06:25:18PM -0800, Andy Lutomirski wrote:
>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%

What's the difference of IA32_EFER between guest and host in your config?

IIUC,
- NX is not consistent
IA32_EFER will be auto load w/ and w/o the patch.
- SCE is not consistent
IA32_EFER will be switched through wrmsr(urn) w/o the patch, and auto load
w/ the patch.

Regards,
Wanpeng Li

>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: Andy Lutomirski <luto@amacapital.net>
>---
> arch/x86/kvm/vmx.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
>diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>index 3e556c68351b..e72b9660e51c 100644
>--- a/arch/x86/kvm/vmx.c
>+++ b/arch/x86/kvm/vmx.c
>@@ -1659,8 +1659,14 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset)
> vmx->guest_msrs[efer_offset].mask = ~ignore_bits;
>
> clear_atomic_switch_msr(vmx, MSR_EFER);
>- /* On ept, can't emulate nx, and must switch nx atomically */
>- if (enable_ept && ((vmx->vcpu.arch.efer ^ host_efer) & EFER_NX)) {
>+
>+ /*
>+ * On EPT, we can't emulate NX, so we must switch EFER atomically.
>+ * On CPUs that support "load IA32_EFER", always switch EFER
>+ * atomically, since it's faster than switching it manually.
>+ */
>+ if (cpu_has_load_ia32_efer ||
>+ (enable_ept && ((vmx->vcpu.arch.efer ^ host_efer) & EFER_NX))) {
> guest_efer = vmx->vcpu.arch.efer;
> if (!(guest_efer & EFER_LMA))
> guest_efer &= ~EFER_LME;
>--
>1.9.3
>
>--
>To unsubscribe from this list: send the line "unsubscribe kvm" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at http://vger.kernel.org/majordomo-info.html


\
 
 \ /
  Last update: 2014-11-10 06:01    [W:0.055 / U:2.984 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site