Skip to content
  • Laurent Vivier's avatar
    fe6824d1
    spapr: fix memory hot-unplugging · fe6824d1
    Laurent Vivier authored
    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: default avatarLaurent Vivier <lvivier@redhat.com>
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    fe6824d1
    spapr: fix memory hot-unplugging
    Laurent Vivier authored
    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: default avatarLaurent Vivier <lvivier@redhat.com>
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Loading