Hi Andre, On 11/8/19 3:42 PM, Andre Przywara wrote: > In preparation for adding functions to test SPI interrupts, generalise > some existing functions dealing with IPIs so far, since most of them > are actually generic for all kind of interrupts. > This also reformats the irq_handler() function, to later expand it > more easily. > > Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx> > --- > arm/gic.c | 40 +++++++++++++++++++++------------------- > 1 file changed, 21 insertions(+), 19 deletions(-) > > diff --git a/arm/gic.c b/arm/gic.c > index 04b3337..a114009 100644 > --- a/arm/gic.c > +++ b/arm/gic.c > @@ -135,28 +135,30 @@ static void check_ipi_sender(u32 irqstat) > } > } > > -static void check_irqnr(u32 irqnr) > +static void check_irqnr(u32 irqnr, int expected) > { > - if (irqnr != IPI_IRQ) > + if (irqnr != expected) > bad_irq[smp_processor_id()] = irqnr; > } > > -static void ipi_handler(struct pt_regs *regs __unused) > +static void irq_handler(struct pt_regs *regs __unused) > { > u32 irqstat = gic_read_iar(); > u32 irqnr = gic_iar_irqnr(irqstat); > > - if (irqnr != GICC_INT_SPURIOUS) { > - gic_write_eoir(irqstat); > - smp_rmb(); /* pairs with wmb in stats_reset */ > - ++acked[smp_processor_id()]; > - check_ipi_sender(irqstat); > - check_irqnr(irqnr); > - smp_wmb(); /* pairs with rmb in check_acked */ > - } else { > + if (irqnr == GICC_INT_SPURIOUS) { > ++spurious[smp_processor_id()]; > smp_wmb(); > + return; > } > + > + gic_write_eoir(irqstat); > + > + smp_rmb(); /* pairs with wmb in stats_reset */ > + ++acked[smp_processor_id()]; > + check_ipi_sender(irqstat); > + check_irqnr(irqnr, IPI_IRQ); > + smp_wmb(); /* pairs with rmb in check_acked */ > } > > static void gicv2_ipi_send_self(void) > @@ -216,20 +218,20 @@ static void ipi_test_smp(void) > report_prefix_pop(); > } > > -static void ipi_enable(void) > +static void irqs_enable(void) > { > gic_enable_defaults(); > #ifdef __arm__ > - install_exception_handler(EXCPTN_IRQ, ipi_handler); > + install_exception_handler(EXCPTN_IRQ, irq_handler); > #else > - install_irq_handler(EL1H_IRQ, ipi_handler); > + install_irq_handler(EL1H_IRQ, irq_handler); > #endif > local_irq_enable(); > } > > static void ipi_send(void) > { > - ipi_enable(); > + irqs_enable(); > wait_on_ready(); > ipi_test_self(); > ipi_test_smp(); > @@ -237,9 +239,9 @@ static void ipi_send(void) > exit(report_summary()); > } > > -static void ipi_recv(void) > +static void irq_recv(void) > { > - ipi_enable(); > + irqs_enable(); > cpumask_set_cpu(smp_processor_id(), &ready); > while (1) > wfi(); > @@ -250,7 +252,7 @@ static void ipi_test(void *data __unused) > if (smp_processor_id() == IPI_SENDER) > ipi_send(); > else > - ipi_recv(); > + irq_recv(); > } > > static struct gic gicv2 = { > @@ -285,7 +287,7 @@ static void ipi_clear_active_handler(struct pt_regs *regs __unused) > > smp_rmb(); /* pairs with wmb in stats_reset */ > ++acked[smp_processor_id()]; > - check_irqnr(irqnr); > + check_irqnr(irqnr, IPI_IRQ); > smp_wmb(); /* pairs with rmb in check_acked */ > } else { > ++spurious[smp_processor_id()]; > Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Thanks Eric _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm