Alexander Graf wrote: > SVM has some cleanup code, that tries to reinject interrupts and exceptions > when the guest didn't manage to deal with them yet. It basically transfers > them to KVM internal state. > > Unfortunately, the internal state is reserved for the L1 guest state, so we > shouldn't try to go through that logic when running a nested guest. > > When doing something the host KVM can handle, let's just reinject the event > into the L2 guest, because we didn't touch its state anyways. > > Signed-off-by: Alexander Graf <agraf@xxxxxxx> > --- > arch/x86/kvm/svm.c | 18 ++++++++++++++---- > 1 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index f12a669..61efd13 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -2349,7 +2349,10 @@ static int handle_exit(struct kvm_vcpu *vcpu) > trace_kvm_exit(exit_code, svm->vmcb->save.rip); > > if (is_nested(svm)) { > + struct vmcb_control_area *control = &svm->vmcb->control; > int vmexit; > + int type; > + int vec; > > nsvm_printk("nested handle_exit: 0x%x | 0x%lx | 0x%lx | 0x%lx\n", > exit_code, svm->vmcb->control.exit_info_1, > @@ -2362,9 +2365,18 @@ static int handle_exit(struct kvm_vcpu *vcpu) > > if (vmexit == NESTED_EXIT_DONE) > return 1; > - } > > - svm_complete_interrupts(svm); > + type = control->exit_int_info & SVM_EXITINTINFO_TYPE_MASK; > + vec = control->exit_int_info & SVM_EXITINTINFO_VEC_MASK; > + if ((type == SVM_EXITINTINFO_TYPE_INTR) || > + ((type == SVM_EXITINTINFO_TYPE_EXEPT) && !kvm_exception_is_soft(vec))) { > + control->event_inj = control->exit_int_info; > + control->event_inj_err = control->exit_int_info_err; > + } > + } else { > + /* Don't interpret exit_info for nested guests */ Doesn't this comment belong to the block above? > + svm_complete_interrupts(svm); > + } > > if (npt_enabled) { > int mmu_reload = 0; > @@ -2602,8 +2614,6 @@ static void svm_complete_interrupts(struct vcpu_svm *svm) > case SVM_EXITINTINFO_TYPE_EXEPT: > /* In case of software exception do not reinject an exception > vector, but re-execute and instruction instead */ > - if (is_nested(svm)) > - break; > if (kvm_exception_is_soft(vector)) > break; > if (exitintinfo & SVM_EXITINTINFO_VALID_ERR) { Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html