From: Paolo Bonzini <pbonzini@redhat.com>
To: Andy Lutomirski <luto@amacapital.net>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Gleb Natapov <gleb@redhat.com>
Subject: Re: [PATCH] x86, kvm, vmx: Always use LOAD_IA32_EFER if available
Date: Wed, 12 Nov 2014 12:38:12 +0100 [thread overview]
Message-ID: <546346A4.3020409@redhat.com> (raw)
In-Reply-To: <32d96cddbe65b897151b95a0e0f8326e404646f8.1415413387.git.luto@amacapital.net>
On 08/11/2014 03:25, 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%
> 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;
>
I am committing this patch, with an additional remark in the commit message:
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
prev parent reply other threads:[~2014-11-12 11:38 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-08 2:25 [PATCH] x86, kvm, vmx: Always use LOAD_IA32_EFER if available Andy Lutomirski
2014-11-10 4:33 ` Wanpeng Li
2014-11-10 19:31 ` Andy Lutomirski
2014-11-12 11:38 ` Paolo Bonzini [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=546346A4.3020409@redhat.com \
--to=pbonzini@redhat.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.