From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH] Refactor hypercall infrastructure (v2) Date: Sun, 02 Dec 2007 17:03:02 -0600 Message-ID: <475339A6.9020207@us.ibm.com> References: <11898788932902-git-send-email-aliguori@us.ibm.com> <200712021917.28706.amit.shah@qumranet.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Avi Kivity To: Amit Shah Return-path: In-Reply-To: <200712021917.28706.amit.shah-atKUWr5tajBWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org Amit Shah wrote: > * Anthony Liguori wrote: > >> This patch refactors the current hypercall infrastructure to better support >> live migration and SMP. It eliminates the hypercall page by trapping the >> UD exception that would occur if you used the wrong hypercall instruction >> for the underlying architecture and replacing it with the right one lazily. >> > > This doesn't work right for SVM. It keeps looping indefinitely; on a kvm_stat > run, I get about 230,000 light vm exits per second, with the hypercall never > returning to the guest. > > ... > What are you using to issue the hypercall? Regards, Anthony Liguori >> diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c >> index 729f1cd..d09a9f5 100644 >> --- a/drivers/kvm/svm.c >> +++ b/drivers/kvm/svm.c >> @@ -476,7 +476,8 @@ static void init_vmcb(struct vmcb *vmcb) >> INTERCEPT_DR5_MASK | >> INTERCEPT_DR7_MASK; >> >> - control->intercept_exceptions = 1 << PF_VECTOR; >> + control->intercept_exceptions = (1 << PF_VECTOR) | >> + (1 << UD_VECTOR); >> >> >> control->intercept = (1ULL << INTERCEPT_INTR) | >> @@ -970,6 +971,17 @@ static int pf_interception(struct vcpu_svm *svm, >> struct kvm_run *kvm_run) return 0; >> } >> >> +static int ud_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) >> +{ >> + int er; >> + >> + er = emulate_instruction(&svm->vcpu, kvm_run, 0, 0); >> + if (er != EMULATE_DONE) >> + inject_ud(&svm->vcpu); >> + >> + return 1; >> +} >> + >> static int nm_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) >> { >> svm->vmcb->control.intercept_exceptions &= ~(1 << NM_VECTOR); >> @@ -1036,7 +1048,8 @@ static int vmmcall_interception(struct vcpu_svm *svm, >> struct kvm_run *kvm_run) { >> svm->next_rip = svm->vmcb->save.rip + 3; >> skip_emulated_instruction(&svm->vcpu); >> - return kvm_hypercall(&svm->vcpu, kvm_run); >> + kvm_emulate_hypercall(&svm->vcpu); >> + return 1; >> } >> >> static int invalid_op_interception(struct vcpu_svm *svm, >> @@ -1232,6 +1245,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm >> *svm, [SVM_EXIT_WRITE_DR3] = emulate_on_interception, >> [SVM_EXIT_WRITE_DR5] = emulate_on_interception, >> [SVM_EXIT_WRITE_DR7] = emulate_on_interception, >> + [SVM_EXIT_EXCP_BASE + UD_VECTOR] = ud_interception, >> [SVM_EXIT_EXCP_BASE + PF_VECTOR] = pf_interception, >> [SVM_EXIT_EXCP_BASE + NM_VECTOR] = nm_interception, >> [SVM_EXIT_INTR] = nop_on_interception, >> @@ -1664,7 +1678,6 @@ svm_patch_hypercall(struct kvm_vcpu *vcpu, unsigned >> char *hypercall) hypercall[0] = 0x0f; >> hypercall[1] = 0x01; >> hypercall[2] = 0xd9; >> - hypercall[3] = 0xc3; >> } >> > > ... > > >> +/* This instruction is vmcall. On non-VT architectures, it will generate >> a + * trap that we will then rewrite to the appropriate instruction. */ >> -#define __NR_hypercalls 0 >> +#define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1" >> > > .. which never happens. > ------------------------------------------------------------------------- SF.Net email is sponsored by: The Future of Linux Business White Paper from Novell. From the desktop to the data center, Linux is going mainstream. Let it simplify your IT future. http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4