Skip to content

Commit 5cd6b1a

Browse files
committed
KVM: x86: Fold "struct dest_map" into "struct rtc_status"
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>
1 parent 1a5d7f9 commit 5cd6b1a

4 files changed

Lines changed: 34 additions & 39 deletions

File tree

arch/x86/kvm/ioapic.c

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic)
7777
static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
7878
{
7979
ioapic->rtc_status.pending_eoi = 0;
80-
bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_IDS);
80+
bitmap_zero(ioapic->rtc_status.map, KVM_MAX_VCPU_IDS);
8181
}
8282

8383
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)
9292
{
9393
bool new_val, old_val;
9494
struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
95-
struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
95+
struct rtc_status *status = &ioapic->rtc_status;
9696
union kvm_ioapic_redirect_entry *e;
9797

9898
e = &ioapic->redirtbl[RTC_GSI];
@@ -102,17 +102,17 @@ static void __rtc_irq_eoi_tracking_restore_one(struct kvm_vcpu *vcpu)
102102
return;
103103

104104
new_val = kvm_apic_pending_eoi(vcpu, e->fields.vector);
105-
old_val = test_bit(vcpu->vcpu_id, dest_map->map);
105+
old_val = test_bit(vcpu->vcpu_id, status->map);
106106

107107
if (new_val == old_val)
108108
return;
109109

110110
if (new_val) {
111-
__set_bit(vcpu->vcpu_id, dest_map->map);
112-
dest_map->vectors[vcpu->vcpu_id] = e->fields.vector;
111+
__set_bit(vcpu->vcpu_id, status->map);
112+
status->vectors[vcpu->vcpu_id] = e->fields.vector;
113113
ioapic->rtc_status.pending_eoi++;
114114
} else {
115-
__clear_bit(vcpu->vcpu_id, dest_map->map);
115+
__clear_bit(vcpu->vcpu_id, status->map);
116116
ioapic->rtc_status.pending_eoi--;
117117
rtc_status_pending_eoi_check_valid(ioapic);
118118
}
@@ -143,13 +143,12 @@ static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic)
143143
static void rtc_irq_eoi(struct kvm_ioapic *ioapic, struct kvm_vcpu *vcpu,
144144
int vector)
145145
{
146-
struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
146+
struct rtc_status *status = &ioapic->rtc_status;
147147

148148
/* RTC special handling */
149-
if (test_bit(vcpu->vcpu_id, dest_map->map) &&
150-
(vector == dest_map->vectors[vcpu->vcpu_id]) &&
151-
(test_and_clear_bit(vcpu->vcpu_id,
152-
ioapic->rtc_status.dest_map.map))) {
149+
if (test_bit(vcpu->vcpu_id, status->map) &&
150+
(vector == status->vectors[vcpu->vcpu_id]) &&
151+
(test_and_clear_bit(vcpu->vcpu_id, status->map))) {
153152
--ioapic->rtc_status.pending_eoi;
154153
rtc_status_pending_eoi_check_valid(ioapic);
155154
}
@@ -260,15 +259,15 @@ static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr)
260259
void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, ulong *ioapic_handled_vectors)
261260
{
262261
struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
263-
struct dest_map *dest_map = &ioapic->rtc_status.dest_map;
262+
struct rtc_status *status = &ioapic->rtc_status;
264263
union kvm_ioapic_redirect_entry *e;
265264
int index;
266265

267266
spin_lock(&ioapic->lock);
268267

269268
/* Make sure we see any missing RTC EOI */
270-
if (test_bit(vcpu->vcpu_id, dest_map->map))
271-
__set_bit(dest_map->vectors[vcpu->vcpu_id],
269+
if (test_bit(vcpu->vcpu_id, status->map))
270+
__set_bit(status->vectors[vcpu->vcpu_id],
272271
ioapic_handled_vectors);
273272

274273
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)
486485
*/
487486
BUG_ON(ioapic->rtc_status.pending_eoi != 0);
488487
ret = __kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe,
489-
&ioapic->rtc_status.dest_map);
488+
&ioapic->rtc_status);
490489
ioapic->rtc_status.pending_eoi = (ret < 0 ? 0 : ret);
491490
} else
492491
ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe);

arch/x86/kvm/ioapic.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ struct kvm_vcpu;
3636

3737
#define RTC_GSI 8
3838

39-
struct dest_map {
39+
struct rtc_status {
40+
int pending_eoi;
41+
4042
/* vcpu bitmap where IRQ has been sent */
4143
DECLARE_BITMAP(map, KVM_MAX_VCPU_IDS);
4244

@@ -47,12 +49,6 @@ struct dest_map {
4749
u8 vectors[KVM_MAX_VCPU_IDS];
4850
};
4951

50-
51-
struct rtc_status {
52-
int pending_eoi;
53-
struct dest_map dest_map;
54-
};
55-
5652
union kvm_ioapic_redirect_entry {
5753
u64 bits;
5854
struct {

arch/x86/kvm/lapic.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -784,15 +784,15 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_lapic_find_highest_irr);
784784

785785
static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
786786
int vector, int level, int trig_mode,
787-
struct dest_map *dest_map);
787+
struct rtc_status *rtc_status);
788788

789789
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
790-
struct dest_map *dest_map)
790+
struct rtc_status *rtc_status)
791791
{
792792
struct kvm_lapic *apic = vcpu->arch.apic;
793793

794794
return __apic_accept_irq(apic, irq->delivery_mode, irq->vector,
795-
irq->level, irq->trig_mode, dest_map);
795+
irq->level, irq->trig_mode, rtc_status);
796796
}
797797

798798
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,
11771177

11781178
static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
11791179
struct kvm_lapic_irq *irq, int *r,
1180-
struct dest_map *dest_map)
1180+
struct rtc_status *rtc_status)
11811181
{
11821182
struct kvm_apic_map *map;
11831183
unsigned long bitmap;
@@ -1192,7 +1192,7 @@ static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *s
11921192
*r = 0;
11931193
return true;
11941194
}
1195-
*r = kvm_apic_set_irq(src->vcpu, irq, dest_map);
1195+
*r = kvm_apic_set_irq(src->vcpu, irq, rtc_status);
11961196
return true;
11971197
}
11981198

@@ -1205,7 +1205,7 @@ static bool __kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *s
12051205
for_each_set_bit(i, &bitmap, 16) {
12061206
if (!dst[i])
12071207
continue;
1208-
*r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map);
1208+
*r += kvm_apic_set_irq(dst[i]->vcpu, irq, rtc_status);
12091209
}
12101210
}
12111211

@@ -1293,14 +1293,14 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_intr_is_single_vcpu);
12931293

12941294
int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
12951295
struct kvm_lapic_irq *irq,
1296-
struct dest_map *dest_map)
1296+
struct rtc_status *rtc_status)
12971297
{
12981298
int r = -1;
12991299
struct kvm_vcpu *vcpu, *lowest = NULL;
13001300
unsigned long i, dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)];
13011301
unsigned int dest_vcpus = 0;
13021302

1303-
if (__kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map))
1303+
if (__kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, rtc_status))
13041304
return r;
13051305

13061306
if (irq->dest_mode == APIC_DEST_PHYSICAL &&
@@ -1322,7 +1322,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
13221322
if (!kvm_lowest_prio_delivery(irq)) {
13231323
if (r < 0)
13241324
r = 0;
1325-
r += kvm_apic_set_irq(vcpu, irq, dest_map);
1325+
r += kvm_apic_set_irq(vcpu, irq, rtc_status);
13261326
} else if (kvm_apic_sw_enabled(vcpu->arch.apic)) {
13271327
if (!vector_hashing_enabled) {
13281328
if (!lowest)
@@ -1344,7 +1344,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
13441344
}
13451345

13461346
if (lowest)
1347-
r = kvm_apic_set_irq(lowest, irq, dest_map);
1347+
r = kvm_apic_set_irq(lowest, irq, rtc_status);
13481348

13491349
return r;
13501350
}
@@ -1355,7 +1355,7 @@ int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
13551355
*/
13561356
static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
13571357
int vector, int level, int trig_mode,
1358-
struct dest_map *dest_map)
1358+
struct rtc_status *rtc_status)
13591359
{
13601360
int result = 0;
13611361
struct kvm_vcpu *vcpu = apic->vcpu;
@@ -1376,9 +1376,9 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
13761376

13771377
result = 1;
13781378

1379-
if (dest_map) {
1380-
__set_bit(vcpu->vcpu_id, dest_map->map);
1381-
dest_map->vectors[vcpu->vcpu_id] = vector;
1379+
if (rtc_status) {
1380+
__set_bit(vcpu->vcpu_id, rtc_status->map);
1381+
rtc_status->vectors[vcpu->vcpu_id] = vector;
13821382
}
13831383

13841384
if (apic_test_vector(vector, apic->regs + APIC_TMR) != !!trig_mode) {

arch/x86/kvm/lapic.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ struct kvm_lapic {
8888
int nr_lvt_entries;
8989
};
9090

91-
struct dest_map;
91+
struct rtc_status;
9292

9393
int kvm_create_lapic(struct kvm_vcpu *vcpu);
9494
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);
110110
bool kvm_apic_update_irr(struct kvm_vcpu *vcpu, unsigned long *pir, int *max_irr);
111111
void kvm_apic_update_ppr(struct kvm_vcpu *vcpu);
112112
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
113-
struct dest_map *dest_map);
113+
struct rtc_status *rtc_status);
114114
int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type);
115115
void kvm_apic_update_apicv(struct kvm_vcpu *vcpu);
116116
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,
120120
struct kvm_lapic_irq *irq, int *r);
121121
int __kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
122122
struct kvm_lapic_irq *irq,
123-
struct dest_map *dest_map);
123+
struct rtc_status *rtc_status);
124124

125125
static inline int kvm_irq_delivery_to_apic(struct kvm *kvm,
126126
struct kvm_lapic *src,

0 commit comments

Comments
 (0)