]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: SVM: Add helper to deduplicate code for getting AVIC backing page
authorSean Christopherson <seanjc@google.com>
Wed, 11 Jun 2025 22:45:13 +0000 (15:45 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 20 Jun 2025 20:52:57 +0000 (13:52 -0700)
Add a helper to get the physical address of the AVIC backing page, both
to deduplicate code and to prepare for getting the address directly from
apic->regs, at which point it won't be all that obvious that the address
in question is what SVM calls the AVIC backing page.

No functional change intended.

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Tested-by: Sairaj Kodilkar <sarunkod@amd.com>
Reviewed-by: Naveen N Rao (AMD) <naveen@kernel.org>
Link: https://lore.kernel.org/r/20250611224604.313496-12-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/avic.c

index 61ea794a4dcef0ac3260e02e80b7ce8dca51d12a..75317c189409663d081a03fbddc7164a7d7f9f44 100644 (file)
@@ -235,14 +235,18 @@ free_avic:
        return err;
 }
 
+static phys_addr_t avic_get_backing_page_address(struct vcpu_svm *svm)
+{
+       return __sme_set(page_to_phys(svm->avic_backing_page));
+}
+
 void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb)
 {
        struct kvm_svm *kvm_svm = to_kvm_svm(svm->vcpu.kvm);
-       phys_addr_t bpa = __sme_set(page_to_phys(svm->avic_backing_page));
        phys_addr_t lpa = __sme_set(page_to_phys(kvm_svm->avic_logical_id_table_page));
        phys_addr_t ppa = __sme_set(page_to_phys(kvm_svm->avic_physical_id_table_page));
 
-       vmcb->control.avic_backing_page = bpa;
+       vmcb->control.avic_backing_page = avic_get_backing_page_address(svm);
        vmcb->control.avic_logical_id = lpa;
        vmcb->control.avic_physical_id = ppa;
        vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE;
@@ -306,7 +310,7 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu)
        BUILD_BUG_ON(__PHYSICAL_MASK_SHIFT >
                     fls64(AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK));
 
-       new_entry = __sme_set(page_to_phys(svm->avic_backing_page)) |
+       new_entry = avic_get_backing_page_address(svm) |
                    AVIC_PHYSICAL_ID_ENTRY_VALID_MASK;
        WRITE_ONCE(*entry, new_entry);
 
@@ -846,7 +850,7 @@ get_pi_vcpu_info(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e,
        pr_debug("SVM: %s: use GA mode for irq %u\n", __func__,
                 irq.vector);
        *svm = to_svm(vcpu);
-       vcpu_info->pi_desc_addr = __sme_set(page_to_phys((*svm)->avic_backing_page));
+       vcpu_info->pi_desc_addr = avic_get_backing_page_address(*svm);
        vcpu_info->vector = irq.vector;
 
        return 0;
@@ -907,7 +911,7 @@ 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 = __sme_set(page_to_phys(svm->avic_backing_page));
+                       pi.base = avic_get_backing_page_address(svm);
                        pi.ga_tag = AVIC_GATAG(to_kvm_svm(kvm)->avic_vm_id,
                                                     svm->vcpu.vcpu_id);
                        pi.is_guest_mode = true;