From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, x86@kernel.org,
"K. Y. Srinivasan" <kys@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Stephen Hemminger <sthemmin@microsoft.com>,
"Michael Kelley (EOSG)" <Michael.H.Kelley@microsoft.com>,
Mohammed Gamal <mmorsy@redhat.com>,
Cathy Avery <cavery@redhat.com>, Bandan Das <bsd@redhat.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 7/7] x86/kvm: use Enlightened VMCS when running on Hyper-V
Date: Thu, 15 Mar 2018 18:02:03 +0100 [thread overview]
Message-ID: <20180315170202.GA5180@flask> (raw)
In-Reply-To: <87zi399xih.fsf@vitty.brq.redhat.com>
2018-03-15 16:19+0100, Vitaly Kuznetsov:
> Paolo Bonzini <pbonzini@redhat.com> writes:
>
> > On 09/03/2018 15:02, Vitaly Kuznetsov wrote:
> >> Enlightened VMCS is just a structure in memory, the main benefit
> >> besides avoiding somewhat slower VMREAD/VMWRITE is using clean field
> >> mask: we tell the underlying hypervisor which fields were modified
> >> since VMEXIT so there's no need to inspect them all.
> >>
> >> Tight CPUID loop test shows significant speedup:
> >> Before: 18890 cycles
> >> After: 8304 cycles
> >>
> >> Static key is being used to avoid performance penalty for non-Hyper-V
> >> deployments. Tests show we add around 3 (three) CPU cycles on each
> >> VMEXIT (1077.5 cycles before, 1080.7 cycles after for the same CPUID
> >> loop on bare metal). We can probably avoid one test/jmp in vmx_vcpu_run()
> >> but I don't see a clean way to use static key in assembly.
> >
> > If you want to live dangerously, you can use text_poke_early to change
> > the vmwrite to mov. It's just a single instruction, so it's probably
> > not too hard.
>
> It is not:
>
> +#if IS_ENABLED(CONFIG_HYPERV) && defined(CONFIG_X86_64)
> +
> +/* Luckily, both original and new instructions are of the same length */
> +#define EVMCS_RSP_OPCODE_LEN 3
> +static evmcs_patch_vmx_cpu_run(void)
> +{
> + u8 *addr;
> + u8 opcode_old[] = {0x0f, 0x79, 0xd4}; // vmwrite rsp, rdx
> + u8 opcode_new[] = {0x48, 0x89, 0x26}; // mov rsp, (rsi)
> +
> + /*
> + * What we're searching for MUST be present in vmx_cpu_run().
> + * We replace the first occurance only.
> + */
> + for (addr = (u8 *)vmx_vcpu_run; ; addr++) {
> + if (!memcmp(addr, opcode_old, EVMCS_RSP_OPCODE_LEN)) {
> + /*
> + * vmx_vcpu_run is not currently running on other CPUs but
> + * using text_poke_early() would require us to do manual
> + * RW remapping of the area.
> + */
> + text_poke(addr, opcode_new, EVMCS_RSP_OPCODE_LEN);
> + break;
> + }
> + }
> +}
> +#endif
> +
>
> text_poke() also needs to be exported.
>
> This works. But hell, this is a crude hack :-) Not sure if there's a
> cleaner way to find what needs to be patched without something like jump
> label table ...
Yeah, I can see us accidently patching parts of other instructions. :)
The target instruction address can be made into a C-accessible symbol
with the same trick that vmx_return uses -- add a .global containing the
address of a label (not sure if a more direct approach would work).
The evil in me likes it. (The good is too lazy to add a decent patching
infrastructure for just one user.)
I would be a bit happier if we didn't assume the desired instruction and
therefore put constraints on a remote code.
We actually already have mov in the assembly:
"cmp %%" _ASM_SP ", %c[host_rsp](%0) \n\t"
"je 1f \n\t"
"mov %%" _ASM_SP ", %c[host_rsp](%0) \n\t" // here
__ex(ASM_VMX_VMWRITE_RSP_RDX) "\n\t"
"1: \n\t"
Is there a drawback in switching '%c[host_rsp](%0)' to be a general
memory pointer and put either &vmx->host_rsp or ¤t_evmcs->host_rsp
in there?
We could just overwrite ASM_VMX_VMWRITE_RSP_RDX with a nop then. :)
Thanks.
next prev parent reply other threads:[~2018-03-15 17:02 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-09 14:02 [PATCH v3 0/7] Enlightened VMCS support for KVM on Hyper-V Vitaly Kuznetsov
2018-03-09 14:02 ` [PATCH v3 1/7] x86/hyper-v: move hyperv.h out of uapi Vitaly Kuznetsov
2018-03-13 22:46 ` Michael Kelley (EOSG)
2018-03-14 9:35 ` Vitaly Kuznetsov
2018-03-14 16:13 ` Christoph Hellwig
2018-03-14 16:42 ` Joshua R. Poulson
2018-03-15 7:31 ` Christoph Hellwig
2018-03-09 14:02 ` [PATCH v3 2/7] x86/hyper-v: move definitions from TLFS to hyperv-tlfs.h Vitaly Kuznetsov
2018-03-13 22:51 ` Michael Kelley (EOSG)
2018-03-09 14:02 ` [PATCH v3 3/7] x86/kvm: rename HV_X64_MSR_APIC_ASSIST_PAGE to HV_X64_MSR_VP_ASSIST_PAGE Vitaly Kuznetsov
2018-03-09 14:02 ` [PATCH v3 4/7] x86/hyper-v: allocate and use Virtual Processor Assist Pages Vitaly Kuznetsov
2018-03-13 23:08 ` Michael Kelley (EOSG)
2018-03-14 15:15 ` Thomas Gleixner
2018-03-15 10:10 ` Vitaly Kuznetsov
2018-03-15 11:45 ` Thomas Gleixner
2018-03-15 13:48 ` Peter Zijlstra
2018-03-15 13:57 ` Thomas Gleixner
2018-03-09 14:02 ` [PATCH v3 5/7] x86/hyper-v: define struct hv_enlightened_vmcs and clean field bits Vitaly Kuznetsov
2018-03-13 23:09 ` Michael Kelley (EOSG)
2018-03-09 14:02 ` [PATCH v3 6/7] x86/hyper-v: detect nested features Vitaly Kuznetsov
2018-03-13 23:11 ` Michael Kelley (EOSG)
2018-03-09 14:02 ` [PATCH v3 7/7] x86/kvm: use Enlightened VMCS when running on Hyper-V Vitaly Kuznetsov
2018-03-09 14:08 ` Thomas Gleixner
2018-03-12 14:19 ` Vitaly Kuznetsov
2018-03-13 19:12 ` Radim Krčmář
2018-03-14 17:20 ` Vitaly Kuznetsov
2018-03-14 14:54 ` Paolo Bonzini
2018-03-14 15:19 ` Thomas Gleixner
2018-03-14 17:22 ` Vitaly Kuznetsov
2018-03-14 19:59 ` Thomas Gleixner
2018-03-14 20:06 ` Peter Zijlstra
2018-03-14 14:53 ` Paolo Bonzini
2018-03-15 9:56 ` Vitaly Kuznetsov
2018-03-15 11:01 ` Paolo Bonzini
2018-03-15 15:19 ` Vitaly Kuznetsov
2018-03-15 17:02 ` Radim Krčmář [this message]
2018-03-15 17:28 ` Radim Krčmář
2018-03-15 18:04 ` Vitaly Kuznetsov
2018-03-15 19:28 ` Thomas Gleixner
2018-03-15 19:43 ` Radim Krčmář
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=20180315170202.GA5180@flask \
--to=rkrcmar@redhat.com \
--cc=Michael.H.Kelley@microsoft.com \
--cc=bsd@redhat.com \
--cc=cavery@redhat.com \
--cc=haiyangz@microsoft.com \
--cc=kvm@vger.kernel.org \
--cc=kys@microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mmorsy@redhat.com \
--cc=pbonzini@redhat.com \
--cc=sthemmin@microsoft.com \
--cc=vkuznets@redhat.com \
--cc=x86@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox