KVM: VMX: Avoid atomic operation in vmx_vcpu_run
Instead of exchanging the guest and host rcx, have separate storage for each. This allows us to avoid using the xchg instruction, which is is a little slower than normal operations. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
1c696d0e1b
commit
40712faeb8
|
@ -4022,6 +4022,7 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
asm(
|
asm(
|
||||||
/* Store host registers */
|
/* Store host registers */
|
||||||
"push %%"R"dx; push %%"R"bp;"
|
"push %%"R"dx; push %%"R"bp;"
|
||||||
|
"push %%"R"cx \n\t" /* placeholder for guest rcx */
|
||||||
"push %%"R"cx \n\t"
|
"push %%"R"cx \n\t"
|
||||||
"cmp %%"R"sp, %c[host_rsp](%0) \n\t"
|
"cmp %%"R"sp, %c[host_rsp](%0) \n\t"
|
||||||
"je 1f \n\t"
|
"je 1f \n\t"
|
||||||
|
@ -4063,7 +4064,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t"
|
".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t"
|
||||||
".Lkvm_vmx_return: "
|
".Lkvm_vmx_return: "
|
||||||
/* Save guest registers, load host registers, keep flags */
|
/* Save guest registers, load host registers, keep flags */
|
||||||
"xchg %0, (%%"R"sp) \n\t"
|
"mov %0, %c[wordsize](%%"R"sp) \n\t"
|
||||||
|
"pop %0 \n\t"
|
||||||
"mov %%"R"ax, %c[rax](%0) \n\t"
|
"mov %%"R"ax, %c[rax](%0) \n\t"
|
||||||
"mov %%"R"bx, %c[rbx](%0) \n\t"
|
"mov %%"R"bx, %c[rbx](%0) \n\t"
|
||||||
"pop"Q" %c[rcx](%0) \n\t"
|
"pop"Q" %c[rcx](%0) \n\t"
|
||||||
|
@ -4107,7 +4109,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
[r14]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R14])),
|
[r14]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R14])),
|
||||||
[r15]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R15])),
|
[r15]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R15])),
|
||||||
#endif
|
#endif
|
||||||
[cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2))
|
[cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2)),
|
||||||
|
[wordsize]"i"(sizeof(ulong))
|
||||||
: "cc", "memory"
|
: "cc", "memory"
|
||||||
, R"ax", R"bx", R"di", R"si"
|
, R"ax", R"bx", R"di", R"si"
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
Loading…
Reference in New Issue