[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC v2 03/16] gic:vgic:gic-vgic: introduce non-atomic bitops
From: Andrii Anisov <andrii_anisov@xxxxxxxx> All bit operations for gic, vgic and gic-vgic are performed under spinlocks, so there is no need for atomic bit ops here, they only introduce excessive call to functions used more expensive exclusive ARM instructions. Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx> --- This patch was not changed. Its only here to list what is really evaluated for IRQ latency impact. So ugly non-atomic bitops are still here. Moreover, taking in cosideration this [1], a closer look is needed into bitops in XEN on ARM. [1] https://lists.xenproject.org/archives/html/xen-devel/2018-11/msg03425.html --- xen/arch/arm/gic-vgic.c | 16 ++++++++++++++++ xen/arch/arm/gic.c | 16 ++++++++++++++++ xen/arch/arm/vgic.c | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c index 471e2d0..0f8f8d5 100644 --- a/xen/arch/arm/gic-vgic.c +++ b/xen/arch/arm/gic-vgic.c @@ -25,6 +25,22 @@ #include <asm/gic.h> #include <asm/vgic.h> +#undef set_bit +#define set_bit(nr, addr) (*(addr) |= (1<<nr)) + +#undef clear_bit +#define clear_bit(nr, addr) (*(addr) &= ~(1<<nr)) + +#undef test_bit +#define test_bit(nr,addr) (*(addr) & (1<<nr)) + +#undef test_and_clear_bit +#define test_and_clear_bit(nr,addr) ({ \ + bool _x; \ + _x = (*(addr) & (1<<nr)); \ + (*(addr) &= ~(1<<nr)); \ + (_x);}) + #define lr_all_full() (this_cpu(lr_mask) == ((1 << gic_get_nr_lrs()) - 1)) #undef GIC_DEBUG diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 77fc06f..f576b66 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -40,6 +40,22 @@ DEFINE_PER_CPU(uint64_t, lr_mask); +#undef set_bit +#define set_bit(nr, addr) (*(addr) |= (1<<nr)) + +#undef clear_bit +#define clear_bit(nr, addr) (*(addr) &= ~(1<<nr)) + +#undef test_bit +#define test_bit(nr,addr) (*(addr) & (1<<nr)) + +#undef test_and_clear_bit +#define test_and_clear_bit(nr,addr) ({ \ + bool _x; \ + _x = (*(addr) & (1<<nr)); \ + (*(addr) &= ~(1<<nr)); \ + (_x);}) + #undef GIC_DEBUG const struct gic_hw_operations *gic_hw_ops; diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 458b2a8..057a721 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -33,6 +33,22 @@ #include <asm/gic.h> #include <asm/vgic.h> +#undef set_bit +#define set_bit(nr, addr) (*(addr) |= (1<<nr)) + +#undef clear_bit +#define clear_bit(nr, addr) (*(addr) &= ~(1<<nr)) + +#undef test_bit +#define test_bit(nr,addr) (*(addr) & (1<<nr)) + +#undef test_and_clear_bit +#define test_and_clear_bit(nr,addr) ({ \ + bool _x = (*(addr) & (1<<nr)); \ + (*(addr) &= ~(1<<nr)); \ + return (_x); \ +}) + static inline struct vgic_irq_rank *vgic_get_rank(struct vcpu *v, int rank) { if ( rank == 0 ) -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |