@@ -650,7 +650,8 @@ static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu,
650650 return err ;
651651}
652652
653- static void kvmppc_update_vpa (struct kvm_vcpu * vcpu , struct kvmppc_vpa * vpap )
653+ static void kvmppc_update_vpa (struct kvm_vcpu * vcpu , struct kvmppc_vpa * vpap ,
654+ struct kvmppc_vpa * old_vpap )
654655{
655656 struct kvm * kvm = vcpu -> kvm ;
656657 void * va ;
@@ -690,9 +691,8 @@ static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap)
690691 kvmppc_unpin_guest_page (kvm , va , gpa , false);
691692 va = NULL ;
692693 }
693- if (vpap -> pinned_addr )
694- kvmppc_unpin_guest_page (kvm , vpap -> pinned_addr , vpap -> gpa ,
695- vpap -> dirty );
694+ * old_vpap = * vpap ;
695+
696696 vpap -> gpa = gpa ;
697697 vpap -> pinned_addr = va ;
698698 vpap -> dirty = false;
@@ -702,24 +702,44 @@ static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap)
702702
703703static void kvmppc_update_vpas (struct kvm_vcpu * vcpu )
704704{
705+ struct kvm * kvm = vcpu -> kvm ;
706+ struct kvmppc_vpa old_vpa = { 0 };
707+
705708 if (!(vcpu -> arch .vpa .update_pending ||
706709 vcpu -> arch .slb_shadow .update_pending ||
707710 vcpu -> arch .dtl .update_pending ))
708711 return ;
709712
710713 spin_lock (& vcpu -> arch .vpa_update_lock );
711714 if (vcpu -> arch .vpa .update_pending ) {
712- kvmppc_update_vpa (vcpu , & vcpu -> arch .vpa );
713- if (vcpu -> arch .vpa .pinned_addr )
715+ kvmppc_update_vpa (vcpu , & vcpu -> arch .vpa , & old_vpa );
716+ if (old_vpa .pinned_addr ) {
717+ if (kvmhv_is_nestedv2 ())
718+ kvmhv_nestedv2_set_vpa (vcpu , ~0ull );
719+ kvmppc_unpin_guest_page (kvm , old_vpa .pinned_addr , old_vpa .gpa ,
720+ old_vpa .dirty );
721+ }
722+ if (vcpu -> arch .vpa .pinned_addr ) {
714723 init_vpa (vcpu , vcpu -> arch .vpa .pinned_addr );
724+ if (kvmhv_is_nestedv2 ())
725+ kvmhv_nestedv2_set_vpa (vcpu , __pa (vcpu -> arch .vpa .pinned_addr ));
726+ }
715727 }
716728 if (vcpu -> arch .dtl .update_pending ) {
717- kvmppc_update_vpa (vcpu , & vcpu -> arch .dtl );
729+ kvmppc_update_vpa (vcpu , & vcpu -> arch .dtl , & old_vpa );
730+ if (old_vpa .pinned_addr )
731+ kvmppc_unpin_guest_page (kvm , old_vpa .pinned_addr , old_vpa .gpa ,
732+ old_vpa .dirty );
718733 vcpu -> arch .dtl_ptr = vcpu -> arch .dtl .pinned_addr ;
719734 vcpu -> arch .dtl_index = 0 ;
720735 }
721- if (vcpu -> arch .slb_shadow .update_pending )
722- kvmppc_update_vpa (vcpu , & vcpu -> arch .slb_shadow );
736+ if (vcpu -> arch .slb_shadow .update_pending ) {
737+ kvmppc_update_vpa (vcpu , & vcpu -> arch .slb_shadow , & old_vpa );
738+ if (old_vpa .pinned_addr )
739+ kvmppc_unpin_guest_page (kvm , old_vpa .pinned_addr , old_vpa .gpa ,
740+ old_vpa .dirty );
741+ }
742+
723743 spin_unlock (& vcpu -> arch .vpa_update_lock );
724744}
725745
@@ -1597,7 +1617,7 @@ static int kvmppc_handle_exit_hv(struct kvm_vcpu *vcpu,
15971617 * That can happen due to a bug, or due to a machine check
15981618 * occurring at just the wrong time.
15991619 */
1600- if (__kvmppc_get_msr_hv (vcpu ) & MSR_HV ) {
1620+ if (! kvmhv_is_nestedv2 () && ( __kvmppc_get_msr_hv (vcpu ) & MSR_HV ) ) {
16011621 printk (KERN_EMERG "KVM trap in HV mode!\n" );
16021622 printk (KERN_EMERG "trap=0x%x | pc=0x%lx | msr=0x%llx\n" ,
16031623 vcpu -> arch .trap , kvmppc_get_pc (vcpu ),
@@ -1688,7 +1708,7 @@ static int kvmppc_handle_exit_hv(struct kvm_vcpu *vcpu,
16881708 {
16891709 int i ;
16901710
1691- if (unlikely (__kvmppc_get_msr_hv (vcpu ) & MSR_PR )) {
1711+ if (! kvmhv_is_nestedv2 () && unlikely (__kvmppc_get_msr_hv (vcpu ) & MSR_PR )) {
16921712 /*
16931713 * Guest userspace executed sc 1. This can only be
16941714 * reached by the P9 path because the old path
@@ -4084,6 +4104,8 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
40844104 if (rc < 0 )
40854105 return - EINVAL ;
40864106
4107+ kvmppc_gse_put_u64 (io -> vcpu_run_input , KVMPPC_GSID_LPCR , lpcr );
4108+
40874109 accumulate_time (vcpu , & vcpu -> arch .in_guest );
40884110 rc = plpar_guest_run_vcpu (0 , vcpu -> kvm -> arch .lpid , vcpu -> vcpu_id ,
40894111 & trap , & i );
@@ -4736,13 +4758,19 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
47364758
47374759 if (!nested ) {
47384760 kvmppc_core_prepare_to_enter (vcpu );
4739- if (__kvmppc_get_msr_hv (vcpu ) & MSR_EE ) {
4740- if (xive_interrupt_pending (vcpu ))
4761+ if (test_bit (BOOK3S_IRQPRIO_EXTERNAL ,
4762+ & vcpu -> arch .pending_exceptions ) ||
4763+ xive_interrupt_pending (vcpu )) {
4764+ /*
4765+ * For nested HV, don't synthesize but always pass MER,
4766+ * the L0 will be able to optimise that more
4767+ * effectively than manipulating registers directly.
4768+ */
4769+ if (!kvmhv_on_pseries () && (__kvmppc_get_msr_hv (vcpu ) & MSR_EE ))
47414770 kvmppc_inject_interrupt_hv (vcpu ,
4742- BOOK3S_INTERRUPT_EXTERNAL , 0 );
4743- } else if (test_bit (BOOK3S_IRQPRIO_EXTERNAL ,
4744- & vcpu -> arch .pending_exceptions )) {
4745- lpcr |= LPCR_MER ;
4771+ BOOK3S_INTERRUPT_EXTERNAL , 0 );
4772+ else
4773+ lpcr |= LPCR_MER ;
47464774 }
47474775 } else if (vcpu -> arch .pending_exceptions ||
47484776 vcpu -> arch .doorbell_request ||
@@ -4806,7 +4834,7 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
48064834 * entering a nested guest in which case the decrementer is now owned
48074835 * by L2 and the L1 decrementer is provided in hdec_expires
48084836 */
4809- if (kvmppc_core_pending_dec (vcpu ) &&
4837+ if (! kvmhv_is_nestedv2 () && kvmppc_core_pending_dec (vcpu ) &&
48104838 ((tb < kvmppc_dec_expires_host_tb (vcpu )) ||
48114839 (trap == BOOK3S_INTERRUPT_SYSCALL &&
48124840 kvmppc_get_gpr (vcpu , 3 ) == H_ENTER_NESTED )))
@@ -4949,7 +4977,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_vcpu *vcpu)
49494977 if (run -> exit_reason == KVM_EXIT_PAPR_HCALL ) {
49504978 accumulate_time (vcpu , & vcpu -> arch .hcall );
49514979
4952- if (WARN_ON_ONCE (__kvmppc_get_msr_hv (vcpu ) & MSR_PR )) {
4980+ if (! kvmhv_is_nestedv2 () && WARN_ON_ONCE (__kvmppc_get_msr_hv (vcpu ) & MSR_PR )) {
49534981 /*
49544982 * These should have been caught reflected
49554983 * into the guest by now. Final sanity check:
@@ -5691,10 +5719,12 @@ static void kvmppc_core_destroy_vm_hv(struct kvm *kvm)
56915719 kvmhv_set_ptbl_entry (kvm -> arch .lpid , 0 , 0 );
56925720 }
56935721
5694- if (kvmhv_is_nestedv2 ())
5722+ if (kvmhv_is_nestedv2 ()) {
5723+ kvmhv_flush_lpid (kvm -> arch .lpid );
56955724 plpar_guest_delete (0 , kvm -> arch .lpid );
5696- else
5725+ } else {
56975726 kvmppc_free_lpid (kvm -> arch .lpid );
5727+ }
56985728
56995729 kvmppc_free_pimap (kvm );
57005730}
0 commit comments