|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 06/22] ARM: vGIC: introduce locking routines for multiple IRQs
When replacing the rank lock with individual per-IRQs lock soon, we will
still need the ability to lock multiple IRQs.
Provide two helper routines which lock and unlock a number of consecutive
IRQs in the right order.
Forward-looking the locking function fills an array of pending_irq
pointers, so the lookup has only to be done once.
These routines expect that local_irq_save() has been called before the
lock routine and the respective local_irq_restore() after the unlock
function.
Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
---
xen/arch/arm/vgic.c | 20 ++++++++++++++++++++
xen/include/asm-arm/vgic.h | 4 ++++
2 files changed, 24 insertions(+)
diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
index 21b545e..434b7e2 100644
--- a/xen/arch/arm/vgic.c
+++ b/xen/arch/arm/vgic.c
@@ -375,6 +375,26 @@ static inline unsigned int vgic_get_virq_type(struct vcpu
*v, int n, int index)
return IRQ_TYPE_LEVEL_HIGH;
}
+void vgic_lock_irqs(struct vcpu *v, unsigned int nrirqs,
+ unsigned int first_irq, struct pending_irq **pirqs)
+{
+ unsigned int i;
+
+ for ( i = 0; i < nrirqs; i++ )
+ {
+ pirqs[i] = irq_to_pending(v, first_irq + i);
+ spin_lock(&pirqs[i]->lock);
+ }
+}
+
+void vgic_unlock_irqs(struct pending_irq **pirqs, unsigned int nrirqs)
+{
+ int i;
+
+ for ( i = nrirqs - 1; i >= 0; i-- )
+ spin_unlock(&pirqs[i]->lock);
+}
+
void vgic_enable_irqs(struct vcpu *v, uint32_t r, int n)
{
const unsigned long mask = r;
diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h
index 27b5e37..ecf4969 100644
--- a/xen/include/asm-arm/vgic.h
+++ b/xen/include/asm-arm/vgic.h
@@ -194,6 +194,10 @@ static inline int REG_RANK_NR(int b, uint32_t n)
}
}
+void vgic_lock_irqs(struct vcpu *v, unsigned int nrirqs, unsigned int
first_irq,
+ struct pending_irq **pirqs);
+void vgic_unlock_irqs(struct pending_irq **pirqs, unsigned int nrirqs);
+
enum gic_sgi_mode;
/*
--
2.9.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |