[libvirt] [PATCH 3/4] qemu: hotplug: Introduce hot unplug for mediated devices

Peter Krempa pkrempa at redhat.com
Tue Mar 27 09:41:45 UTC 2018


On Tue, Mar 27, 2018 at 10:57:15 +0200, Erik Skultety wrote:
> Mediated devices support hot-{plug,unplug} since their introduction in
> kernel 4.10, however this feature has been missing in libvirt since
> commit ec783d7c introduced a hostdev type for mdevs.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  src/qemu/qemu_hotplug.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
> 
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 4abc7393b..ff77b47bc 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -4030,6 +4030,17 @@ qemuDomainRemoveSCSIVHostDevice(virQEMUDriverPtr driver,
>      qemuHostdevReAttachSCSIVHostDevices(driver, vm->def->name, &hostdev, 1);
>  }
>  
> +
> +static void
> +qemuDomainRemoveMediatedDevice(virQEMUDriverPtr driver,
> +                               virDomainObjPtr vm,
> +                               virDomainHostdevDefPtr hostdev)
> +{
> +    qemuHostdevReAttachMediatedDevices(driver, vm->def->name, &hostdev, 1);
> +    qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);

Looks like you are missing teardown of the cgroups, and namespace
membership here.

> +}
> +
> +
>  static int
>  qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>                             virDomainObjPtr vm,
> @@ -4132,6 +4143,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>          qemuDomainRemoveSCSIVHostDevice(driver, vm, hostdev);
>          break;
>      case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
> +        qemuDomainRemoveMediatedDevice(driver, vm, hostdev);
>          break;
>      case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
>          break;
> @@ -5059,6 +5071,32 @@ qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driver,
>      return ret;
>  }
>  
> +
> +static int
> +qemuDomainDetachMediatedDevice(virQEMUDriverPtr driver,
> +                               virDomainObjPtr vm,
> +                               virDomainHostdevDefPtr detach)
> +{
> +    int ret = -1;
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> +    if (!detach->info->alias) {
> +        virReportError(VIR_ERR_OPERATION_FAILED,
> +                       "%s", _("device cannot be detached without a device alias"));
> +        return -1;
> +    }
> +
> +    qemuDomainMarkDeviceForRemoval(vm, detach->info);
> +
> +    qemuDomainObjEnterMonitor(driver, vm);
> +    ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +        ret = -1;

You need to wait for removal here and delete it inplace if the call
returns soon enough.. Also call to qemuDomainResetDeviceRemoval is
missing.

> +
> +    return ret;
> +}
> +
> +
>  static int
>  qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
>                                 virDomainObjPtr vm,
> @@ -5082,6 +5120,9 @@ qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
>      case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
>          ret = qemuDomainDetachSCSIVHostDevice(driver, vm, detach);
>          break;
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
> +        ret = qemuDomainDetachMediatedDevice(driver, vm, detach);
> +        break;
>      default:
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                         _("hot unplug is not supported for hostdev subsys type '%s'"),
> @@ -5111,6 +5152,7 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
>      virDomainHostdevSubsysUSBPtr usbsrc = &subsys->u.usb;
>      virDomainHostdevSubsysPCIPtr pcisrc = &subsys->u.pci;
>      virDomainHostdevSubsysSCSIPtr scsisrc = &subsys->u.scsi;
> +    virDomainHostdevSubsysMediatedDevPtr mdevsrc = &subsys->u.mdev;
>      virDomainHostdevDefPtr detach = NULL;
>      int idx;
>  
> @@ -5159,6 +5201,11 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
>              }
>              break;
>          }
> +        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
> +            virReportError(VIR_ERR_DEVICE_MISSING,
> +                           _("mediated device '%s' not found"),
> +                           mdevsrc->uuidstr);
> +            break;
>          case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
>              break;
>          default:
> -- 
> 2.14.3
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180327/aeb23ee9/attachment-0001.sig>


More information about the libvir-list mailing list