Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [PATCH v2 04/17] ARM: Allow IPIs to be handled as normal interrupts | Date | Thu, 25 Jun 2020 19:25:32 +0100 |
| |
On 24/06/20 20:57, Marc Zyngier wrote: > @@ -696,9 +696,76 @@ void handle_IPI(int ipinr, struct pt_regs *regs) > > if ((unsigned)ipinr < NR_IPI) > trace_ipi_exit_rcuidle(ipi_types[ipinr]); > +} > + > +/* Legacy version, should go away once all irqchips have been converted */ > +void handle_IPI(int ipinr, struct pt_regs *regs) > +{ > + struct pt_regs *old_regs = set_irq_regs(regs); > + > + irq_enter(); > + do_handle_IPI(ipinr); > + irq_exit(); > + > set_irq_regs(old_regs); > } > > +static irqreturn_t ipi_handler(int irq, void *data) > +{ > + do_handle_IPI(irq - ipi_irq_base); > + return IRQ_HANDLED; > +} > + > +static void ipi_send(const struct cpumask *target, unsigned int ipi) > +{ > + __ipi_send_mask(ipi_desc[ipi], target); > +} > + > +static void ipi_setup(int cpu) > +{ > + if (ipi_irq_base) { > + int i; > + > + for (i = 0; i < nr_ipi; i++) > + enable_percpu_irq(ipi_irq_base + i, 0); > + } > +} > + > +static void ipi_teardown(int cpu) > +{ > + if (ipi_irq_base) { > + int i; > + > + for (i = 0; i < nr_ipi; i++) > + disable_percpu_irq(ipi_irq_base + i); > + } > +} > + > +void __init set_smp_ipi_range(int ipi_base, int n) > +{ > + int i; > + > + WARN_ON(n < MAX_IPI); > + nr_ipi = min(n, MAX_IPI);
I got confused by that backtrace thing and NR_IPI vs MAX_IPI. I think I got it now : we don't want to call trace_ipi_raise() for IPI_CPU_BACKTRACE *but* we still need to alloc the desc and route it through the generic IPI layers.
The only difference I can tell is that now we will get some trace events for it via the handler entry/exit tracepoints - that shouldn't cause any issue.
> + > + for (i = 0; i < nr_ipi; i++) { > + int err; > + > + err = request_percpu_irq(ipi_base + i, ipi_handler, > + "IPI", &irq_stat); > + WARN_ON(err); > + > + ipi_desc[i] = irq_to_desc(ipi_base + i); > + irq_set_status_flags(ipi_base + i, IRQ_HIDDEN); > + } > + > + ipi_irq_base = ipi_base; > + set_smp_cross_call(ipi_send); > + > + /* Setup the boot CPU immediately */ > + ipi_setup(smp_processor_id()); > +} > + > void smp_send_reschedule(int cpu) > { > smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
| |