• J
    pcie: drop version_id field for live migration · 1de53459
    Jason Baron 提交于
    While testing q35 live migration, I found that the migration would abort with
    the following error: "Unknown savevm section type 76".
    
    The error is due to this check failing in 'vmstate_load_state()':
    
        while(field->name) {
            if ((field->field_exists &&
                 field->field_exists(opaque, version_id)) ||
                (!field->field_exists &&
                 field->version_id <= version_id)) {
    
    The VMSTATE_PCIE_DEVICE() currently has a 'version_id' set to 2. However,
    'version_id' in the above check is 1. And thus we fail to load the pcie device
    field. Further the code returns to 'qemu_loadvm_state()' which produces the
    error that I saw.
    
    I'm proposing to fix this by simply dropping the 'version_id' field from
    VMSTATE_PCIE_DEVICE(). VMSTATE_PCI_DEVICE() defines no such field and further
    the vmstate_pcie_device that VMSTATE_PCI_DEVICE() refers to is already
    versioned. Thus, any versioning issues could be detected at the vmsd level.
    
    Taking a step back, I think that the 'field->version_id' should be compared
    against a saved version number for the field not the 'version_id'. Futhermore,
    once vmstate_load_state() is called recursively on another vmsd, the check of:
    
        if (version_id > vmsd->version_id) {
            return -EINVAL;
        }
    
    Will never fail since version_id is always equal to vmsd->version_id. So I'm
    wondering why we aren't storing the vmsd version id of the source in the
    migration stream?
    
    This patch also renames the 'name' field of vmstate_pcie_device from:
    PCIDevice -> PCIEDevice to differentiate it from vmstate_pci_device.
    Signed-off-by: NJason Baron <jbaron@redhat.com>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    1de53459
pci.c 61.6 KB