• D
    hw/ppc: migrating the DRC state of hotplugged devices · a50919dd
    Daniel Henrique Barboza 提交于
    In pseries, a firmware abstraction called Dynamic Reconfiguration
    Connector (DRC) is used to assign a particular dynamic resource
    to the guest and provide an interface to manage configuration/removal
    of the resource associated with it. In other words, DRC is the
    'plugged state' of a device.
    
    Before this patch, DRC wasn't being migrated. This causes
    post-migration problems due to DRC state mismatch between source and
    target. The DRC state of a device X in the source might
    change, while in the target the DRC state of X is still fresh. When
    migrating the guest, X will not have the same hotplugged state as it
    did in the source. This means that we can't hot unplug X in the
    target after migration is completed because its DRC state is not consistent.
    https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1677552 is one
    bug that is caused by this DRC state mismatch between source and
    target.
    
    To migrate the DRC state, we defined the VMStateDescription struct for
    spapr_drc to enable the transmission of spapr_drc state in migration.
    Not all the elements in the DRC state are migrated - only those
    that can be modified by guest actions or device add/remove
    operations:
    
    - 'isolation_state', 'allocation_state' and 'indicator_state'
    are involved in the DR state transition diagram from
    PAPR+ 2.7, 13.4;
    
    - 'configured', 'signalled', 'awaiting_release' and 'awaiting_allocation'
    are needed in attaching and detaching devices;
    
    - 'indicator_state' provides users with hardware state information.
    
    These are the DRC elements that are migrated.
    
    In this patch the DRC state is migrated for PCI, LMB and CPU
    connector types. At this moment there is no support to migrate
    DRC for the PHB (PCI Host Bridge) type.
    
    In the 'realize' function the DRC is registered using vmstate_register,
    similar to what hw/ppc/spapr_iommu.c does in 'spapr_tce_table_realize'.
    This approach works because  DRCs are bus-less and do not sit
    on a BusClass that implements bc->get_dev_path, so as a fallback the
    VMSD gets identified via "spapr_drc"/get_index(drc).
    Signed-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
    Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
    a50919dd
spapr_drc.c 32.0 KB