Skip to content

Commit db1dcfa

Browse files
iamjpnmpe
authored andcommitted
KVM: PPC: Book3S HV nestedv2: Register the VPA with the L0
In the nestedv2 case, the L1 may register the L2's VPA with the L0. This allows the L0 to manage the L2's dispatch count, as well as enable possible performance optimisations by seeing if certain resources are not being used by the L2 (such as the PMCs). Use the H_GUEST_SET_STATE call to inform the L0 of the L2's VPA address. This can not be done in the H_GUEST_VCPU_RUN input buffer. Signed-off-by: Jordan Niethe <jniethe5@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20231201132618.555031-11-vaibhav@linux.ibm.com
1 parent 4bc8ff6 commit db1dcfa

3 files changed

Lines changed: 59 additions & 9 deletions

File tree

arch/powerpc/include/asm/kvm_book3s_64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ void kvmhv_nestedv2_vcpu_free(struct kvm_vcpu *vcpu, struct kvmhv_nestedv2_io *i
682682
int kvmhv_nestedv2_flush_vcpu(struct kvm_vcpu *vcpu, u64 time_limit);
683683
int kvmhv_nestedv2_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1);
684684
int kvmhv_nestedv2_parse_output(struct kvm_vcpu *vcpu);
685+
int kvmhv_nestedv2_set_vpa(struct kvm_vcpu *vcpu, unsigned long vpa);
685686

686687
#endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
687688

arch/powerpc/kvm/book3s_hv.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

703703
static 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

arch/powerpc/kvm/book3s_hv_nestedv2.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,35 @@ int kvmhv_nestedv2_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1)
855855
}
856856
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_ptbl_entry);
857857

858+
/**
859+
* kvmhv_nestedv2_set_vpa() - register L2 VPA with L0
860+
* @vcpu: vcpu
861+
* @vpa: L1 logical real address
862+
*/
863+
int kvmhv_nestedv2_set_vpa(struct kvm_vcpu *vcpu, unsigned long vpa)
864+
{
865+
struct kvmhv_nestedv2_io *io;
866+
struct kvmppc_gs_buff *gsb;
867+
int rc = 0;
868+
869+
io = &vcpu->arch.nestedv2_io;
870+
gsb = io->vcpu_run_input;
871+
872+
kvmppc_gsb_reset(gsb);
873+
rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_VPA, vpa);
874+
if (rc < 0)
875+
goto out;
876+
877+
rc = kvmppc_gsb_send(gsb, 0);
878+
if (rc < 0)
879+
pr_err("KVM-NESTEDv2: couldn't register the L2 VPA (rc=%d)\n", rc);
880+
881+
out:
882+
kvmppc_gsb_reset(gsb);
883+
return rc;
884+
}
885+
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_vpa);
886+
858887
/**
859888
* kvmhv_nestedv2_parse_output() - receive values from H_GUEST_RUN_VCPU output
860889
* @vcpu: vcpu

0 commit comments

Comments
 (0)