]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Fold "struct dest_map" into "struct rtc_status"
authorSean Christopherson <seanjc@google.com>
Sat, 6 Dec 2025 00:43:09 +0000 (16:43 -0800)
committerSean Christopherson <seanjc@google.com>
Mon, 12 Jan 2026 17:31:41 +0000 (09:31 -0800)
Drop "struct dest_map" and fold its members into its one and only user,
"struct rtc_status".  Tracking "pending" EOIs and associated vCPUs is very
much a hack for legacy RTC behavior, and should never be needed for other
IRQ delivery.  In addition to making it more obvious why KVM tracks target
vCPUs, this will allow burying the "struct rtc_status" definition behind
CONFIG_KVM_IOAPIC=y, which in turn will make it even harder for KVM to
misuse the structure.

No functional change intended.

Link: https://patch.msgid.link/20251206004311.479939-8-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/ioapic.c
arch/x86/kvm/ioapic.h
arch/x86/kvm/lapic.c
arch/x86/kvm/lapic.h

index 4b49f972836225f5dd55a3c6833b6d9c75e8b3bb..9a99d01b111cebf658ac426e83407e46fd1d4e94 100644 (file)
@@ -77,7 +77,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic)
 static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
 {
        ioapic->rtc_status.pending_eoi = 0;
-       bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_IDS);
+       bitmap_zero(ioapic->rtc_status.map, KVM_MAX_VCPU_IDS);
 }
 
 static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
@@ -92,7 +92,7 @@ static void __rtc_irq_eoi_tracking_restore_one(struct kvm_vcpu *vcpu)
 {
        bool new_val, old_val;
        struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
-       struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
+       struct rtc_status *status = &ioapic->rtc_status;
        union kvm_ioapic_redirect_entry *e;
 
        e = &ioapic->redirtbl[RTC_GSI];
@@ -102,17 +102,17 @@ static void __rtc_irq_eoi_tracking_restore_one(struct kvm_vcpu *vcpu)
                return;
 
        new_val = kvm_apic_pending_eoi(vcpu, e->fields.vector);
-       old_val = test_bit(vcpu->vcpu_id, dest_map->map);
+       old_val = test_bit(vcpu->vcpu_id, status->map);
 
        if (new_val == old_val)
                return;
 
        if (new_val) {
-               __set_bit(vcpu->vcpu_id, dest_map->map);
-               dest_map->vectors[vcpu->vcpu_id] = e->fields.vector;
+               __set_bit(vcpu->vcpu_id, status->map);
+               status->vectors[vcpu->vcpu_id] = e->fields.vector;
                ioapic->rtc_status.pending_eoi++;
        } else {
-               __clear_bit(vcpu->vcpu_id, dest_map->map);
+               __clear_bit(vcpu->vcpu_id, status->map);
                ioapic->rtc_status.pending_eoi--;
                rtc_status_pending_eoi_check_valid(ioapic);
        }
@@ -143,13 +143,12 @@ static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic)
 static void rtc_irq_eoi(struct kvm_ioapic *ioapic, struct kvm_vcpu *vcpu,
                        int vector)
 {
-       struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
+       struct rtc_status *status = &ioapic->rtc_status;
 
        /* RTC special handling */
-       if (test_bit(vcpu->vcpu_id, dest_map->map) &&
-           (vector == dest_map->vectors[vcpu->vcpu_id]) &&
-           (test_and_clear_bit(vcpu->vcpu_id,
-                               ioapic->rtc_status.dest_map.map))) {
+       if (test_bit(vcpu->vcpu_id, status->map) &&
+           (vector == status->vectors[vcpu->vcpu_id]) &&
+           (test_and_clear_bit(vcpu->vcpu_id, status->map))) {
                --ioapic->rtc_status.pending_eoi;
                rtc_status_pending_eoi_check_valid(ioapic);
        }
@@ -260,15 +259,15 @@ static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr)
 void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, ulong *ioapic_handled_vectors)
 {
        struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
-       struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
+       struct rtc_status *status = &ioapic->rtc_status;
        union kvm_ioapic_redirect_entry *e;
        int index;
 
        spin_lock(&ioapic->lock);
 
        /* Make sure we see any missing RTC EOI */
-       if (test_bit(vcpu->vcpu_id, dest_map->map))
-               __set_bit(dest_map->vectors[vcpu->vcpu_id],
+       if (test_bit(vcpu->vcpu_id, status->map))
+               __set_bit(status->vectors[vcpu->vcpu_id],
                          ioapic_handled_vectors);
 
        for (index = 0; index < IOAPIC_NUM_PINS; index++) {
@@ -486,7 +485,7 @@ static int ioapic_service(struct kvm_ioapic *ioapic, int irq, bool line_status)
                 */
                BUG_ON(ioapic->rtc_status.pending_eoi != 0);
                ret = __kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe,
-                                                &ioapic->rtc_status.dest_map);
+                                                &ioapic->rtc_status);
                ioapic->rtc_status.pending_eoi = (ret < 0 ? 0 : ret);
        } else
                ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe);
index ad238a6e63dcc32ecfb78df25a5cc010404308f5..868ed593a5c9045d5061ee7201b28cc07f9b94df 100644 (file)
@@ -36,7 +36,9 @@ struct kvm_vcpu;
 
 #define RTC_GSI 8
 
-struct dest_map {
+struct rtc_status {
+       int pending_eoi;
+
        /* vcpu bitmap where IRQ has been sent */
        DECLARE_BITMAP(map, KVM_MAX_VCPU_IDS);
 
@@ -47,12 +49,6 @@ struct dest_map {
        u8 vectors[KVM_MAX_VCPU_IDS];
 };
 
-
-struct rtc_status {
-       int pending_eoi;
-       struct dest_map dest_map;
-};
-
 union kvm_ioapic_redirect_entry {
        u64 bits;
        struct {
index 769facb27d3d9cd39ad355479adaf7a968d1632d..0a44765aba12a432f3fae0f00d30f4523a8d47bc 100644 (file)
@@ -784,15 +784,15 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_lapic_find_highest_irr);
 
 static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
                             int vector, int level, int trig_mode,
-                            struct dest_map *dest_map);
+                            struct rtc_status *rtc_status);
 
 int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
-                    struct dest_map *dest_map)
+                    struct rtc_status *rtc_status)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
 
        return __apic_accept_irq(apic, irq->delivery_mode, irq->vector,
-                       irq->level, irq->trig_mode, dest_map);
+                                irq->level, irq->trig_mode, rtc_status);
 }
 
 static int __pv_send_ipi(unsigned long *ipi_bitmap, struct kvm_apic_map *map,
@@ -1177,7 +1177,7 @@ static inline bool kvm_apic_map_get_dest_lapic(struct kvm *kvm,
 
 static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
                                            struct kvm_lapic_irq *irq, int *r,
-                                           struct dest_map *dest_map)
+                                           struct rtc_status *rtc_status)
 {
        struct kvm_apic_map *map;
        unsigned long bitmap;
@@ -1192,7 +1192,7 @@ static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *s
                        *r = 0;
                        return true;
                }
-               *r = kvm_apic_set_irq(src->vcpu, irq, dest_map);
+               *r = kvm_apic_set_irq(src->vcpu, irq, rtc_status);
                return true;
        }
 
@@ -1205,7 +1205,7 @@ static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *s
                for_each_set_bit(i, &bitmap, 16) {
                        if (!dst[i])
                                continue;
-                       *r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map);
+                       *r += kvm_apic_set_irq(dst[i]->vcpu, irq, rtc_status);
                }
        }
 
@@ -1293,14 +1293,14 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_intr_is_single_vcpu);
 
 int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
                               struct kvm_lapic_irq *irq,
-                              struct dest_map *dest_map)
+                              struct rtc_status *rtc_status)
 {
        int r = -1;
        struct kvm_vcpu *vcpu, *lowest = NULL;
        unsigned long i, dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)];
        unsigned int dest_vcpus = 0;
 
-       if (__kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map))
+       if (__kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, rtc_status))
                return r;
 
        if (irq->dest_mode == APIC_DEST_PHYSICAL &&
@@ -1322,7 +1322,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
                if (!kvm_lowest_prio_delivery(irq)) {
                        if (r < 0)
                                r = 0;
-                       r += kvm_apic_set_irq(vcpu, irq, dest_map);
+                       r += kvm_apic_set_irq(vcpu, irq, rtc_status);
                } else if (kvm_apic_sw_enabled(vcpu->arch.apic)) {
                        if (!vector_hashing_enabled) {
                                if (!lowest)
@@ -1344,7 +1344,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
        }
 
        if (lowest)
-               r = kvm_apic_set_irq(lowest, irq, dest_map);
+               r = kvm_apic_set_irq(lowest, irq, rtc_status);
 
        return r;
 }
@@ -1355,7 +1355,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
  */
 static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
                             int vector, int level, int trig_mode,
-                            struct dest_map *dest_map)
+                            struct rtc_status *rtc_status)
 {
        int result = 0;
        struct kvm_vcpu *vcpu = apic->vcpu;
@@ -1376,9 +1376,9 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 
                result = 1;
 
-               if (dest_map) {
-                       __set_bit(vcpu->vcpu_id, dest_map->map);
-                       dest_map->vectors[vcpu->vcpu_id] = vector;
+               if (rtc_status) {
+                       __set_bit(vcpu->vcpu_id, rtc_status->map);
+                       rtc_status->vectors[vcpu->vcpu_id] = vector;
                }
 
                if (apic_test_vector(vector, apic->regs + APIC_TMR) != !!trig_mode) {
index 901c05a5ac603f67744375d09b3cd37ce9746a7b..71c80fa020e06fa0a0a5952ba42d9daf74e126b8 100644 (file)
@@ -88,7 +88,7 @@ struct kvm_lapic {
        int nr_lvt_entries;
 };
 
-struct dest_map;
+struct rtc_status;
 
 int kvm_create_lapic(struct kvm_vcpu *vcpu);
 void kvm_free_lapic(struct kvm_vcpu *vcpu);
@@ -110,7 +110,7 @@ bool __kvm_apic_update_irr(unsigned long *pir, void *regs, int *max_irr);
 bool kvm_apic_update_irr(struct kvm_vcpu *vcpu, unsigned long *pir, int *max_irr);
 void kvm_apic_update_ppr(struct kvm_vcpu *vcpu);
 int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
-                    struct dest_map *dest_map);
+                    struct rtc_status *rtc_status);
 int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type);
 void kvm_apic_update_apicv(struct kvm_vcpu *vcpu);
 int kvm_alloc_apic_access_page(struct kvm *kvm);
@@ -120,7 +120,7 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
                                   struct kvm_lapic_irq *irq, int *r);
 int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
                               struct kvm_lapic_irq *irq,
-                              struct dest_map *dest_map);
+                              struct rtc_status *rtc_status);
 
 static inline int kvm_irq_delivery_to_apic(struct kvm *kvm,
                                           struct kvm_lapic *src,