Message ID | 1411210071-14727-8-git-send-email-tangchen@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Il 20/09/2014 12:47, Tang Chen ha scritto: > We are handling "L1 and L2 share one apic access page" situation when migrating > apic access page. We should do some handling when migration happens in the > following situations: > > 1) when L0 is running: Update L1's vmcs in the next L0->L1 entry and L2's > vmcs in the next L1->L2 entry. > > 2) when L1 is running: Force a L1->L0 exit, update L1's vmcs in the next > L0->L1 entry and L2's vmcs in the next L1->L2 entry. > > 3) when L2 is running: Force a L2->L0 exit, update L2's vmcs in the next > L0->L2 entry and L1's vmcs in the next L2->L1 exit. > > This patch handles 3). > > In L0->L2 entry, L2's vmcs will be updated in prepare_vmcs02() called by > nested_vm_run(). So we need to do nothing. > > In L2->L1 exit, this patch requests apic access page reload in L2->L1 vmexit. > > Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> > --- > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/vmx.c | 6 ++++++ > arch/x86/kvm/x86.c | 3 ++- > 3 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 56156eb..1a8317e 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -1047,6 +1047,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); > int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); > int kvm_cpu_get_interrupt(struct kvm_vcpu *v); > void kvm_vcpu_reset(struct kvm_vcpu *vcpu); > +void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu); > > void kvm_define_shared_msr(unsigned index, u32 msr); > void kvm_set_shared_msr(unsigned index, u64 val, u64 mask); > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index c8e90ec..baac78a 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -8803,6 +8803,12 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, > } > > /* > + * We are now running in L2, mmu_notifier will force to reload the > + * page's hpa for L2 vmcs. Need to reload it for L1 before entering L1. > + */ > + kvm_vcpu_reload_apic_access_page(vcpu); > + > + /* > * Exiting from L2 to L1, we're now back to L1 which thinks it just > * finished a VMLAUNCH or VMRESUME instruction, so we need to set the > * success or failure flag accordingly. > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index fc54fa6..2ae2dc7 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -5989,7 +5989,7 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) > kvm_apic_update_tmr(vcpu, tmr); > } > > -static void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) > +void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) > { > /* > * Only APIC access page shared by L1 and L2 vm is handled. The APIC > @@ -6009,6 +6009,7 @@ static void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) > page_to_phys(vcpu->kvm->arch.apic_access_page)); > } > } > +EXPORT_SYMBOL_GPL(kvm_vcpu_reload_apic_access_page); > > /* > * Returns 1 to let __vcpu_run() continue the guest execution loop without > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 56156eb..1a8317e 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1047,6 +1047,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); int kvm_cpu_get_interrupt(struct kvm_vcpu *v); void kvm_vcpu_reset(struct kvm_vcpu *vcpu); +void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu); void kvm_define_shared_msr(unsigned index, u32 msr); void kvm_set_shared_msr(unsigned index, u64 val, u64 mask); diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index c8e90ec..baac78a 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -8803,6 +8803,12 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, } /* + * We are now running in L2, mmu_notifier will force to reload the + * page's hpa for L2 vmcs. Need to reload it for L1 before entering L1. + */ + kvm_vcpu_reload_apic_access_page(vcpu); + + /* * Exiting from L2 to L1, we're now back to L1 which thinks it just * finished a VMLAUNCH or VMRESUME instruction, so we need to set the * success or failure flag accordingly. diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index fc54fa6..2ae2dc7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -5989,7 +5989,7 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) kvm_apic_update_tmr(vcpu, tmr); } -static void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) +void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) { /* * Only APIC access page shared by L1 and L2 vm is handled. The APIC @@ -6009,6 +6009,7 @@ static void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) page_to_phys(vcpu->kvm->arch.apic_access_page)); } } +EXPORT_SYMBOL_GPL(kvm_vcpu_reload_apic_access_page); /* * Returns 1 to let __vcpu_run() continue the guest execution loop without
We are handling "L1 and L2 share one apic access page" situation when migrating apic access page. We should do some handling when migration happens in the following situations: 1) when L0 is running: Update L1's vmcs in the next L0->L1 entry and L2's vmcs in the next L1->L2 entry. 2) when L1 is running: Force a L1->L0 exit, update L1's vmcs in the next L0->L1 entry and L2's vmcs in the next L1->L2 entry. 3) when L2 is running: Force a L2->L0 exit, update L2's vmcs in the next L0->L2 entry and L1's vmcs in the next L2->L1 exit. This patch handles 3). In L0->L2 entry, L2's vmcs will be updated in prepare_vmcs02() called by nested_vm_run(). So we need to do nothing. In L2->L1 exit, this patch requests apic access page reload in L2->L1 vmexit. Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> --- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/vmx.c | 6 ++++++ arch/x86/kvm/x86.c | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-)