• L
    spapr: fix memory hot-unplugging · fe6824d1
    Laurent Vivier 提交于
    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=1432382Signed-off-by: NLaurent Vivier <lvivier@redhat.com>
    Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
    fe6824d1
spapr_drc.c 30.0 KB