To save some state when the guest is migrated, we capture the IRQ bitmap after all devices have been reseted and store it as a reference for the machine.
Signed-off-by: Cédric Le Goater <c...@kaod.org> --- We should probably merge this patch with the previous in the next versions of the patchset. For the moment, I thought it would be interesting to isolate the topic for discussion. hw/ppc/spapr.c | 7 ++++++- include/hw/ppc/spapr.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 4ef0b73559ca..bf0e5b4f815b 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1437,6 +1437,9 @@ static void ppc_spapr_reset(void) qemu_devices_reset(); spapr_clear_pending_events(spapr); + spapr->irq_map_ref = bitmap_new(spapr->nr_irqs); + bitmap_copy(spapr->irq_map_ref, spapr->irq_map, spapr->nr_irqs); + /* * We place the device tree and RTAS just below either the top of the RMA, * or just below 2GB, whichever is lowere, so that it can be @@ -1683,7 +1686,9 @@ static const VMStateDescription vmstate_spapr_patb_entry = { static bool spapr_irq_map_needed(void *opaque) { - return true; + sPAPRMachineState *spapr = opaque; + + return !bitmap_equal(spapr->irq_map, spapr->irq_map_ref, spapr->nr_irqs); } static const VMStateDescription vmstate_spapr_irq_map = { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 5835c694caff..023436c32b2a 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -81,6 +81,7 @@ struct sPAPRMachineState { struct sPAPRNVRAM *nvram; int32_t nr_irqs; unsigned long *irq_map; + unsigned long *irq_map_ref; ICSState *ics; sPAPRRTCState rtc; -- 2.13.6