[libvirt] [PATCH v3 1/2] qemu: Add support for hot unplugging redirdev device which can use the detach-device --live

John Ferlan jferlan at redhat.com
Fri Jan 5 13:16:20 UTC 2018



On 01/05/2018 05:40 AM, Ján Tomko wrote:
> On Fri, Dec 22, 2017 at 04:04:03PM +0800, Chen Hanxiao wrote:
>> From: Chen Hanxiao <chenhanxiao at gmail.com>
>>
>> We lacked of hot unplugging redirdev device.
>> This patch add support for it.
>> We could use detach-device --live now.
>>
>> Signed-off-by: Chen Hanxiao <chenhanxiao at gmail.com>
>> ---
>> v3:
>>  use helper qemuDomainDelChardevTLSObjects
>>  address John's comments
>>
>> v2:
>>  rebase on master
>>
>> src/qemu/qemu_driver.c  |  4 ++-
>> src/qemu/qemu_hotplug.c | 91
>> +++++++++++++++++++++++++++++++++++++++++++++++++
>> src/qemu/qemu_hotplug.h |  4 +++
>> 3 files changed, 98 insertions(+), 1 deletion(-)
>>

[...]

>> +int
>> +qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
>> +                               virDomainObjPtr vm,
>> +                               virDomainRedirdevDefPtr dev)
>> +{
>> +    int ret = -1;
>> +    qemuDomainObjPrivatePtr priv = vm->privateData;
>> +    virDomainRedirdevDefPtr tmpRedirdevDef;
>> +    ssize_t idx;
>> +
>> +    if ((idx = virDomainRedirdevDefFind(vm->def, dev)) < 0) {
>> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> +                       _("no matching redirdev was not found"));
>> +        return -1;
>> +    }
>> +
>> +    tmpRedirdevDef = vm->def->redirdevs[idx];
>> +
>> +    if (!tmpRedirdevDef->info.alias) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                       _("alias not set for redirdev device"));
>> +        return -1;
>> +    }
>> +
>> +    qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info);
>> +
>> +    qemuDomainObjEnterMonitor(driver, vm);
>> +    if (qemuMonitorDelDevice(priv->mon, tmpRedirdevDef->info.alias) <
>> 0) {
>> +        ignore_value(qemuDomainObjExitMonitor(driver, vm));
>> +        goto cleanup;
>> +    }
>> +    if (qemuDomainObjExitMonitor(driver, vm) < 0)
>> +        goto cleanup;
>> +
>> +    if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
>> +        ret = qemuDomainRemoveRedirdevDevice(driver, vm,
>> tmpRedirdevDef);
> 
> If qemuDomainWaitForDeviceRemoval returns 0 (QEMU supports
> DEVICE_DEL_EVENT and did not unplug the device in 5 seconds),
> then libvirtd should remove the device asynchronnously, when the device
> deletion event arrives.
> 
> qemuDomainRemoveRedirdevDevice needs to be also called from
> qemuDomainRemoveDevice for that to happen.
> 
> Jan
> 

oh yeah - right, adding :

+    case VIR_DOMAIN_DEVICE_REDIRDEV:
+        ret = qemuDomainRemoveRedirdevDevice(driver, vm,
dev->data.redirdev);
+        break;
+

to qemuDomainRemoveDevice

Tks -

John

>> +
>> + cleanup:
>> +    qemuDomainResetDeviceRemoval(vm);
>> +    return ret;
>> +}
>> +
>> +
>> int
>> qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
>>                           virDomainObjPtr vm,
>> diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
>> index 3e0d618e0..9a0c057f1 100644
>> --- a/src/qemu/qemu_hotplug.h
>> +++ b/src/qemu/qemu_hotplug.h
>> @@ -126,6 +126,10 @@ int qemuDomainDetachWatchdog(virQEMUDriverPtr
>> driver,
>>                              virDomainObjPtr vm,
>>                              virDomainWatchdogDefPtr watchdog);
>>
>> +int qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
>> +                                   virDomainObjPtr vm,
>> +                                   virDomainRedirdevDefPtr dev);
>> +
>> int qemuDomainAttachInputDevice(virQEMUDriverPtr driver,
>>                                 virDomainObjPtr vm,
>>                                 virDomainInputDefPtr input);
>> -- 
>> 2.14.3
>>
>> -- 
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
> 
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list