xemu/hw/ppc
Laurent Vivier fe6824d126 spapr: fix memory hot-unplugging
If, once the kernel has booted, we try to remove a memory
hotplugged while the kernel was not started, QEMU crashes on
an assert:

    qemu-system-ppc64: hw/virtio/vhost.c:651:
                       vhost_commit: Assertion `r >= 0' failed.
    ...
    #4  in vhost_commit
    #5  in memory_region_transaction_commit
    #6  in pc_dimm_memory_unplug
    #7  in spapr_memory_unplug
    #8  spapr_machine_device_unplug
    #9  in hotplug_handler_unplug
    #10 in spapr_lmb_release
    #11 in detach
    #12 in set_allocation_state
    #13 in rtas_set_indicator
    ...

If we take a closer look to the guest kernel log, we can see when
we try to unplug the memory:

    pseries-hotplug-mem: Attempting to hot-add 4 LMB(s)

What happens:

    1- The kernel has ignored the memory hotplug event because
       it was not started when it was generated.

    2- When we hot-unplug the memory,
       QEMU starts to remove the memory,
            generates an hot-unplug event,
        and signals the kernel of the incoming new event

    3- as the kernel is started, on the QEMU signal, it reads
       the event list, decodes the hotplug event and tries to
       finish the hotplugging.

    4- QEMU receive the the hotplug notification while it
       is trying to hot-unplug the memory. This moves the memory
       DRC to an invalid state

This patch prevents this by not allowing to set the allocation
state to USABLE while the DRC is awaiting release.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1432382

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2017-03-29 11:35:16 +11:00
..
e500-ccsr.h ppc: do not use ../ in include files 2013-03-01 13:57:33 +01:00
e500.c target-ppc: Add MMU model check for booke machines 2017-02-02 09:30:06 +11:00
e500.h target-ppc: Eliminate redundant and incorrect function booke206_page_size_to_tlb 2016-07-01 09:57:01 +10:00
e500plat.c dma: do not depend on kvm_enabled() 2016-05-19 16:42:28 +02:00
fdt.c Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
mac_newworld.c mac99: replace debug printf with trace points 2017-02-22 11:28:28 +11:00
mac_oldworld.c hw: Default -drive to if=ide explicitly where it works 2017-02-21 13:10:53 +01:00
mac.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
Makefile.objs prep: add IBM RS/6000 7020 (40p) memory controller 2017-01-31 10:10:13 +11:00
mpc8544_guts.c hw: explicitly include qemu-common.h and cpu.h 2016-03-22 22:20:17 +01:00
mpc8544ds.c ppc: Clean up includes 2016-01-29 15:07:22 +00:00
pnv_core.c Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
pnv_lpc.c Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
pnv_xscom.c kvm: move cpu synchronization code 2017-01-19 22:07:46 +01:00
pnv.c qemu-timer: do not include sysemu/cpus.h from util/qemu-timer.h 2017-03-14 13:28:18 +01:00
ppc4xx_devs.c qemu-common: push cpu.h inclusion out of qemu-common.h 2016-05-19 16:42:29 +02:00
ppc4xx_pci.c ppc4xx: replace debug printf with trace points 2017-02-22 11:28:28 +11:00
ppc405_boards.c clean-up: removed duplicate #includes 2016-10-28 18:17:24 +03:00
ppc405_uc.c hw/ppc/ppc405_uc.c: Avoid integer overflows 2017-02-22 14:28:53 +11:00
ppc405.h Remove unused function declarations 2016-09-15 15:32:22 +03:00
ppc440_bamboo.c target-ppc: Add MMU model check for booke machines 2017-02-02 09:30:06 +11:00
ppc_booke.c ppc: Prevent inifnite loop in decrementer auto-reload. 2017-01-31 10:10:14 +11:00
ppc.c tcg: drop global lock during TCG code execution 2017-02-24 10:32:45 +00:00
ppce500_spin.c hw/ppc: QOM'ify ppce500_spin.c 2017-01-31 10:10:13 +11:00
prep_systemio.c prep: add PReP System I/O 2017-01-31 10:10:13 +11:00
prep.c hw: Default -drive to if=ide explicitly where it works 2017-02-21 13:10:53 +01:00
rs6000_mc.c prep: add IBM RS/6000 7020 (40p) memory controller 2017-01-31 10:10:13 +11:00
spapr_cpu_core.c spapr: ensure that all threads within core are on the same NUMA node 2017-03-06 10:32:53 +11:00
spapr_drc.c spapr: fix memory hot-unplugging 2017-03-29 11:35:16 +11:00
spapr_events.c ppc/xics: use the QOM interface to get irqs 2017-03-01 11:23:39 +11:00
spapr_hcall.c target/ppc: Manage external HPT via virtual hypervisor 2017-03-01 11:23:39 +11:00
spapr_iommu.c memory: introduce IOMMUOps.notify_flag_changed 2016-09-27 09:00:04 +02:00
spapr_ovec.c spapr: replace debug printf with trace points 2017-02-22 11:28:28 +11:00
spapr_pci_vfio.c Use #include "..." for our own headers, <...> for others 2016-07-12 16:19:16 +02:00
spapr_pci.c pseries: Don't expose PCIe extended config space on older machine types 2017-03-14 11:54:17 +11:00
spapr_rng.c hw: explicitly include qemu-common.h and cpu.h 2016-03-22 22:20:17 +01:00
spapr_rtas_ddw.c spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) 2016-07-05 14:31:08 +10:00
spapr_rtas.c report guest crash information in GUEST_PANICKED event 2017-02-16 15:30:49 +01:00
spapr_rtc.c util: move declarations out of qemu-common.h 2016-03-22 22:20:17 +01:00
spapr_vio.c ppc/xics: store the ICS object under the sPAPR machine 2017-03-01 11:23:39 +11:00
spapr.c spapr: fix buffer-overflow 2017-03-29 11:35:02 +11:00
trace-events spapr: replace debug printf with trace points 2017-02-22 11:28:28 +11:00
virtex_ml507.c target-ppc: Add MMU model check for booke machines 2017-02-02 09:30:06 +11:00