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@redhat.com>
---
src/qemu/qemu_hotplug.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 6ec401e21..4abc7393b 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2567,6 +2567,88 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriverPtr driver,
}
+static int
+qemuDomainAttachMediatedDevice(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainHostdevDefPtr hostdev)
+{
+ int ret = -1;
+ char *devstr = NULL;
+ bool added = false;
+ bool teardowncgroup = false;
+ bool teardownlabel = false;
+ bool teardowndevice = false;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_HOSTDEV,
+ { .hostdev = hostdev } };
+
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
+ return -1;
+
+ if (qemuHostdevPrepareMediatedDevices(driver,
+ vm->def->name,
+ &hostdev,
+ 1) < 0)
+ goto cleanup;
+ added = true;
+
+ if (qemuDomainNamespaceSetupHostdev(vm, hostdev) < 0)
+ goto cleanup;
+ teardowndevice = true;
+
+ if (qemuSetupHostdevCgroup(vm, hostdev) < 0)
+ goto cleanup;
+ teardowncgroup = true;
+
+ if (qemuSecuritySetHostdevLabel(driver, vm, hostdev) < 0)
+ goto cleanup;
+ teardownlabel = true;
+
+ if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
+ goto cleanup;
+
+ if (!(devstr = qemuBuildHostdevMediatedDevStr(vm->def, hostdev,
+ priv->qemuCaps)))
+ goto cleanup;
+
+ if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs+1) < 0)
+ goto cleanup;
+
+ qemuDomainObjEnterMonitor(driver, vm);
+ ret = qemuMonitorAddDevice(priv->mon, devstr);
+ if (qemuDomainObjExitMonitor(driver, vm) < 0) {
+ ret = -1;
+ goto cleanup;
+ }
+
+ virDomainAuditHostdev(vm, hostdev, "attach", ret == 0);
+ if (ret < 0)
+ goto cleanup;
+
+ VIR_APPEND_ELEMENT_INPLACE(vm->def->hostdevs, vm->def->nhostdevs, hostdev);
+ ret = 0;
+ cleanup:
+ if (ret < 0) {
+ if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
+ VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
+ if (teardownlabel &&
+ qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0)
+ VIR_WARN("Unable to restore host device labelling on hotplug fail");
+ if (teardowndevice &&
+ qemuDomainNamespaceTeardownHostdev(vm, hostdev) < 0)
+ VIR_WARN("Unable to remove host device from /dev");
+ if (added)
+ qemuHostdevReAttachMediatedDevices(driver,
+ vm->def->name,
+ vm->def->hostdevs,
+ vm->def->nhostdevs);
+ qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
+ }
+ VIR_FREE(devstr);
+ return ret;
+}
+
+
int
qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
@@ -2602,6 +2684,10 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
if (qemuDomainAttachSCSIVHostDevice(driver, vm, hostdev) < 0)
goto error;
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ if (qemuDomainAttachMediatedDevice(driver, vm, hostdev) < 0)
+ goto error;
+ break;
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
--
2.14.3
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Tue, Mar 27, 2018 at 10:57:14 +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.
I think the feature was missing since d77e1a9642fe1efe9aa5f737a640354.
>
> Signed-off-by: Erik Skultety <eskultet@redhat.com>
> ---
> src/qemu/qemu_hotplug.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 86 insertions(+)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 6ec401e21..4abc7393b 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -2567,6 +2567,88 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriverPtr driver,
> }
>
>
> +static int
> +qemuDomainAttachMediatedDevice(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + virDomainHostdevDefPtr hostdev)
> +{
> + int ret = -1;
> + char *devstr = NULL;
> + bool added = false;
> + bool teardowncgroup = false;
> + bool teardownlabel = false;
> + bool teardowndevice = false;
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_HOSTDEV,
> + { .hostdev = hostdev } };
> +
> + if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
> + return -1;
> +
> + if (qemuHostdevPrepareMediatedDevices(driver,
> + vm->def->name,
> + &hostdev,
> + 1) < 0)
> + goto cleanup;
> + added = true;
> +
> + if (qemuDomainNamespaceSetupHostdev(vm, hostdev) < 0)
> + goto cleanup;
> + teardowndevice = true;
> +
> + if (qemuSetupHostdevCgroup(vm, hostdev) < 0)
> + goto cleanup;
> + teardowncgroup = true;
> +
> + if (qemuSecuritySetHostdevLabel(driver, vm, hostdev) < 0)
> + goto cleanup;
> + teardownlabel = true;
> +
> + if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
> + goto cleanup;
> +
> + if (!(devstr = qemuBuildHostdevMediatedDevStr(vm->def, hostdev,
> + priv->qemuCaps)))
> + goto cleanup;
Usually we'd call this prior to setting up everything, bug given that
this does not do any validation it's okay.
> +
> + if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs+1) < 0)
Spaces around + sign.
> + goto cleanup;
> +
> + qemuDomainObjEnterMonitor(driver, vm);
> + ret = qemuMonitorAddDevice(priv->mon, devstr);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> + ret = -1;
> + goto cleanup;
> + }
> +
> + virDomainAuditHostdev(vm, hostdev, "attach", ret == 0);
> + if (ret < 0)
> + goto cleanup;
> +
> + VIR_APPEND_ELEMENT_INPLACE(vm->def->hostdevs, vm->def->nhostdevs, hostdev);
> + ret = 0;
> + cleanup:
> + if (ret < 0) {
> + if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
> + VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
> + if (teardownlabel &&
> + qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0)
> + VIR_WARN("Unable to restore host device labelling on hotplug fail");
> + if (teardowndevice &&
> + qemuDomainNamespaceTeardownHostdev(vm, hostdev) < 0)
> + VIR_WARN("Unable to remove host device from /dev");
> + if (added)
> + qemuHostdevReAttachMediatedDevices(driver,
> + vm->def->name,
> + vm->def->hostdevs,
> + vm->def->nhostdevs);
All of them?!?
> + qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
> + }
> + VIR_FREE(devstr);
> + return ret;
> +}
> +
> +
> int
> qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> @@ -2602,6 +2684,10 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
> if (qemuDomainAttachSCSIVHostDevice(driver, vm, hostdev) < 0)
> goto error;
> break;
> + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
> + if (qemuDomainAttachMediatedDevice(driver, vm, hostdev) < 0)
> + goto error;
> + break;
>
> default:
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> --
> 2.14.3
>
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.