[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH v2 1/3] vfio: Move the saving of the config space to the
From: |
Shenming Lu |
Subject: |
Re: [RFC PATCH v2 1/3] vfio: Move the saving of the config space to the right place in VFIO migration |
Date: |
Fri, 19 Feb 2021 18:33:03 +0800 |
User-agent: |
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 |
On 2021/2/18 22:42, Kirti Wankhede wrote:
>
>
> On 12/9/2020 1:39 PM, Shenming Lu wrote:
>> On ARM64 the VFIO SET_IRQS ioctl is dependent on the VM interrupt
>> setup, if the restoring of the VFIO PCI device config space is
>> before the VGIC, an error might occur in the kernel.
>>
>> So we move the saving of the config space to the non-iterable
>> process, so that it will be called after the VGIC according to
>> their priorities.
>>
>> As for the possible dependence of the device specific migration
>> data on it's config space, we can let the vendor driver to
>> include any config info it needs in its own data stream.
>> (Should we note this in the header file linux-headers/linux/vfio.h?)
>>
>> Signed-off-by: Shenming Lu <lushenming@huawei.com>
>> ---
>> hw/vfio/migration.c | 25 +++++++++++++++----------
>> 1 file changed, 15 insertions(+), 10 deletions(-)
>>
>> diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
>> index 00daa50ed8..3b9de1353a 100644
>> --- a/hw/vfio/migration.c
>> +++ b/hw/vfio/migration.c
>> @@ -575,11 +575,6 @@ static int vfio_save_complete_precopy(QEMUFile *f, void
>> *opaque)
>> return ret;
>> }
>> - ret = vfio_save_device_config_state(f, opaque);
>> - if (ret) {
>> - return ret;
>> - }
>> -
>> ret = vfio_update_pending(vbasedev);
>> if (ret) {
>> return ret;
>> @@ -620,6 +615,19 @@ static int vfio_save_complete_precopy(QEMUFile *f, void
>> *opaque)
>> return ret;
>> }
>> +static void vfio_save_state(QEMUFile *f, void *opaque)
>> +{
>> + VFIODevice *vbasedev = opaque;
>> + int ret;
>> +
>> + /* The device specific data is migrated in the iterable process. */
>> + ret = vfio_save_device_config_state(f, opaque);
>> + if (ret) {
>> + error_report("%s: Failed to save device config space",
>> + vbasedev->name);
>> + }
>> +}
>> +
>
> Since error is not propagated, set error in migration stream for migration to
> fail, use qemu_file_set_error() on error.
Makes sense. I will send a v3 soon. Thanks,
Shenming
>
> Thanks,
> Kirti
>
>> static int vfio_load_setup(QEMUFile *f, void *opaque)
>> {
>> VFIODevice *vbasedev = opaque;
>> @@ -670,11 +678,7 @@ static int vfio_load_state(QEMUFile *f, void *opaque,
>> int version_id)
>> switch (data) {
>> case VFIO_MIG_FLAG_DEV_CONFIG_STATE:
>> {
>> - ret = vfio_load_device_config_state(f, opaque);
>> - if (ret) {
>> - return ret;
>> - }
>> - break;
>> + return vfio_load_device_config_state(f, opaque);
>> }
>> case VFIO_MIG_FLAG_DEV_SETUP_STATE:
>> {
>> @@ -720,6 +724,7 @@ static SaveVMHandlers savevm_vfio_handlers = {
>> .save_live_pending = vfio_save_pending,
>> .save_live_iterate = vfio_save_iterate,
>> .save_live_complete_precopy = vfio_save_complete_precopy,
>> + .save_state = vfio_save_state,
>> .load_setup = vfio_load_setup,
>> .load_cleanup = vfio_load_cleanup,
>> .load_state = vfio_load_state,
>>
> .