On 4/5/2025 1:08 AM, Sean Christopherson wrote: > Use vcpu_data.pi_desc_addr instead of amd_iommu_pi_data.base to get the > GA root pointer. KVM is the only source of amd_iommu_pi_data.base, and > KVM's one and only path for writing amd_iommu_pi_data.base computes the > exact same value for vcpu_data.pi_desc_addr and amd_iommu_pi_data.base, > and fills amd_iommu_pi_data.base if and only if vcpu_data.pi_desc_addr is > valid, i.e. amd_iommu_pi_data.base is fully redundant. > > Cc: Maxim Levitsky <mlevitsk@xxxxxxxxxx> > Reviewed-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Reviewed-by: Vasant Hegde <vasant.hegde@xxxxxxx> -Vasant > --- > arch/x86/kvm/svm/avic.c | 7 +++++-- > drivers/iommu/amd/iommu.c | 2 +- > include/linux/amd-iommu.h | 1 - > 3 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c > index 60e6e82fe41f..9024b9fbca53 100644 > --- a/arch/x86/kvm/svm/avic.c > +++ b/arch/x86/kvm/svm/avic.c > @@ -902,8 +902,11 @@ int avic_pi_update_irte(struct kvm_kernel_irqfd *irqfd, struct kvm *kvm, > > enable_remapped_mode = false; > > - /* Try to enable guest_mode in IRTE */ > - pi.base = avic_get_backing_page_address(svm); > + /* > + * Try to enable guest_mode in IRTE. Note, the address > + * of the vCPU's AVIC backing page is passed to the > + * IOMMU via vcpu_info->pi_desc_addr. > + */ > pi.ga_tag = AVIC_GATAG(to_kvm_svm(kvm)->avic_vm_id, > svm->vcpu.vcpu_id); > pi.is_guest_mode = true; > diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c > index 4f69a37cf143..635774642b89 100644 > --- a/drivers/iommu/amd/iommu.c > +++ b/drivers/iommu/amd/iommu.c > @@ -3860,7 +3860,7 @@ static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info) > > pi_data->prev_ga_tag = ir_data->cached_ga_tag; > if (pi_data->is_guest_mode) { > - ir_data->ga_root_ptr = (pi_data->base >> 12); > + ir_data->ga_root_ptr = (vcpu_pi_info->pi_desc_addr >> 12); > ir_data->ga_vector = vcpu_pi_info->vector; > ir_data->ga_tag = pi_data->ga_tag; > ret = amd_iommu_activate_guest_mode(ir_data); > diff --git a/include/linux/amd-iommu.h b/include/linux/amd-iommu.h > index 062fbd4c9b77..4f433ef39188 100644 > --- a/include/linux/amd-iommu.h > +++ b/include/linux/amd-iommu.h > @@ -20,7 +20,6 @@ struct amd_iommu; > struct amd_iommu_pi_data { > u32 ga_tag; > u32 prev_ga_tag; > - u64 base; > bool is_guest_mode; > struct vcpu_data *vcpu_data; > void *ir_data;