[libvirt] [PATCH v5 11/13] qemu: Add hotpluging support for PCI devices on S390 guests

Andrea Bolognani abologna at redhat.com
Tue Sep 11 15:21:25 UTC 2018


On Tue, 2018-09-04 at 16:39 +0800, Yi Min Zhao wrote:
[...]
> +static int
> +qemuDomainAttachExtensionDevice(qemuMonitorPtr mon,
> +                                virDomainDeviceInfoPtr info)
> +{
> +    if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci))
> +        return qemuDomainAttachZPCIDevice(mon, info);
> +
> +    return 0;

Same comment as with qemuBuildExtensionCommandLine().

[...]
> +static int
> +qemuDomainDetachExtensionDevice(qemuMonitorPtr mon,
> +                                virDomainDeviceInfoPtr info)
> +{
> +    if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci))
> +        return qemuDomainDetachZPCIDevice(mon, info);
> +
> +    return 0;

Here, too.

[...]
> @@ -805,8 +869,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
>      if (qemuHotplugDiskSourceAttach(priv->mon, diskdata) < 0)
>          goto exit_monitor;
>  
> -    if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
> +    if (qemuDomainAttachExtensionDevice(priv->mon, &disk->info) < 0)
> +        goto exit_monitor;
> +

Since the zpci device refers to the underlying device through the
target= option, does it make sense to attach the zpci device first
and the target device second? I would expect it to fail unless you
attach them the other way around...

[...]
> @@ -913,7 +982,15 @@ int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver,
>          goto cleanup;
>  
>      qemuDomainObjEnterMonitor(driver, vm);
> -    ret = qemuMonitorAddDevice(priv->mon, devstr);
> +
> +    if (qemuDomainAttachExtensionDevice(priv->mon, &controller->info) < 0) {
> +        ignore_value(qemuDomainObjExitMonitor(driver, vm));
> +        goto cleanup;
> +    }

I'm not sure this is entirely safe. Perhaps you should introduce an
exit_monitor label that ensures failure to exit the monitor is also
taken into account, and jump to that one instead?

[...]
> +    if ((ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr,
> +                                          configfd, configfd_name)) < 0)
> +        ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info));

Parentheses around here, please.

[...]
> @@ -3236,8 +3347,17 @@ qemuDomainAttachInputDevice(virQEMUDriverPtr driver,
>          goto cleanup;
>  
>      qemuDomainObjEnterMonitor(driver, vm);
> -    if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
> +
> +    if (input->bus == VIR_DOMAIN_INPUT_BUS_VIRTIO) {
> +        if (qemuDomainAttachExtensionDevice(priv->mon, &input->info) < 0)
> +            goto exit_monitor;
> +    }
> +
> +    if (qemuMonitorAddDevice(priv->mon, devstr) < 0) {
> +        if (input->bus == VIR_DOMAIN_INPUT_BUS_VIRTIO)
> +            ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &input->info));
>          goto exit_monitor;
> +    }

Shouldn't you rather check for the address type here? IIUC an input
device with BUS_VIRTIO could be virtio-ccw or virtio-mmio, for
example, and you don't want to try adding a zpci device in those
cases.

[...]
> @@ -5301,6 +5427,11 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
>          qemuDomainMarkDeviceForRemoval(vm, &detach->info);
>  
>      qemuDomainObjEnterMonitor(driver, vm);
> +    if (detach->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
> +        qemuDomainDetachExtensionDevice(priv->mon, &detach->info)) {
> +        ignore_value(qemuDomainObjExitMonitor(driver, vm));
> +        goto cleanup;
> +    }
>      if (qemuMonitorDelDevice(priv->mon, detach->info.alias)) {
>          ignore_value(qemuDomainObjExitMonitor(driver, vm));
>          goto cleanup;

This one too looks like it would benefit from an exit_monitor lable.

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list