Skip to content

Commit fc3bc47

Browse files
Julien Thierrychristofferdall-arm
authored andcommitted
KVM: arm/arm64: vgic: Make vgic_dist->lpi_list_lock a raw_spinlock
vgic_dist->lpi_list_lock must always be taken with interrupts disabled as it is used in interrupt context. For configurations such as PREEMPT_RT_FULL, this means that it should be a raw_spinlock since RT spinlocks are interruptible. Signed-off-by: Julien Thierry <julien.thierry@arm.com> Acked-by: Christoffer Dall <christoffer.dall@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@arm.com>
1 parent 8fa3adb commit fc3bc47

File tree

4 files changed

+11
-11
lines changed

4 files changed

+11
-11
lines changed

include/kvm/arm_vgic.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ struct vgic_dist {
256256
u64 propbaser;
257257

258258
/* Protects the lpi_list and the count value below. */
259-
spinlock_t lpi_list_lock;
259+
raw_spinlock_t lpi_list_lock;
260260
struct list_head lpi_list_head;
261261
int lpi_list_count;
262262

virt/kvm/arm/vgic/vgic-init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void kvm_vgic_early_init(struct kvm *kvm)
6464
struct vgic_dist *dist = &kvm->arch.vgic;
6565

6666
INIT_LIST_HEAD(&dist->lpi_list_head);
67-
spin_lock_init(&dist->lpi_list_lock);
67+
raw_spin_lock_init(&dist->lpi_list_lock);
6868
}
6969

7070
/* CREATION */

virt/kvm/arm/vgic/vgic-its.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
7373
irq->target_vcpu = vcpu;
7474
irq->group = 1;
7575

76-
spin_lock_irqsave(&dist->lpi_list_lock, flags);
76+
raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
7777

7878
/*
7979
* There could be a race with another vgic_add_lpi(), so we need to
@@ -101,7 +101,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
101101
dist->lpi_list_count++;
102102

103103
out_unlock:
104-
spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
104+
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
105105

106106
/*
107107
* We "cache" the configuration table entries in our struct vgic_irq's.
@@ -332,7 +332,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr)
332332
if (!intids)
333333
return -ENOMEM;
334334

335-
spin_lock_irqsave(&dist->lpi_list_lock, flags);
335+
raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
336336
list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) {
337337
if (i == irq_count)
338338
break;
@@ -341,7 +341,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr)
341341
continue;
342342
intids[i++] = irq->intid;
343343
}
344-
spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
344+
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
345345

346346
*intid_ptr = intids;
347347
return i;

virt/kvm/arm/vgic/vgic.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static struct vgic_irq *vgic_get_lpi(struct kvm *kvm, u32 intid)
7272
struct vgic_irq *irq = NULL;
7373
unsigned long flags;
7474

75-
spin_lock_irqsave(&dist->lpi_list_lock, flags);
75+
raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
7676

7777
list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) {
7878
if (irq->intid != intid)
@@ -88,7 +88,7 @@ static struct vgic_irq *vgic_get_lpi(struct kvm *kvm, u32 intid)
8888
irq = NULL;
8989

9090
out_unlock:
91-
spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
91+
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
9292

9393
return irq;
9494
}
@@ -138,15 +138,15 @@ void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
138138
if (irq->intid < VGIC_MIN_LPI)
139139
return;
140140

141-
spin_lock_irqsave(&dist->lpi_list_lock, flags);
141+
raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
142142
if (!kref_put(&irq->refcount, vgic_irq_release)) {
143-
spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
143+
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
144144
return;
145145
};
146146

147147
list_del(&irq->lpi_list);
148148
dist->lpi_list_count--;
149-
spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
149+
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
150150

151151
kfree(irq);
152152
}

0 commit comments

Comments
 (0)