On Thu, 15 Oct 2020 23:03:18 +0200 Laurent Vivier <lviv...@redhat.com> wrote:
> If we hotplug a CPU during the first second of the kernel boot, > the IRQ can be sent to the kernel while the RTAS event handler > is not installed. The event is queued, but the kernel doesn't > collect it and ignores the new CPU. > > As the code relies on edge-triggered IRQ, we can re-assert it > during the event-scan RTAS call if there are still pending > events (as it is already done in check-exception). > > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > --- Any BugId to share ? > hw/ppc/spapr_events.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c > index 1069d0197b4f..1add53547ec3 100644 > --- a/hw/ppc/spapr_events.c > +++ b/hw/ppc/spapr_events.c > @@ -1000,10 +1000,22 @@ static void event_scan(PowerPCCPU *cpu, > SpaprMachineState *spapr, > target_ulong args, > uint32_t nret, target_ulong rets) > { > + int i; > if (nargs != 4 || nret != 1) { > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > return; > } > + > + for (i = 0; i < EVENT_CLASS_MAX; i++) { > + if (rtas_event_log_contains(EVENT_CLASS_MASK(i))) { > + const SpaprEventSource *source = > + spapr_event_sources_get_source(spapr->event_sources, i); > + > + g_assert(source->enabled); > + qemu_irq_pulse(spapr_qirq(spapr, source->irq)); > + } > + } > + This looks good but any reason for not putting this in a function called by both event_scan() and check_exception() ? Anyway, this can be done as a follow-up: Reviewed-by: Greg Kurz <gr...@kaod.org> > rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND); > } >