[libvirt] [PATCH 3/4] qemu: hotplug: Introduce hot unplug for mediated devices
Erik Skultety
eskultet at redhat.com
Wed Mar 28 09:47:47 UTC 2018
On Tue, Mar 27, 2018 at 11:41:45AM +0200, Peter Krempa wrote:
> 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.
I'm not, this is handled from qemuDomainRemoveHostDevice which is called from
qemuDomainDetachThisHostDevice right after qemuDomainDetachMediatedDevice was
called.
...
> > +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.
All of this is already done as part of qemuDomainDetachThisHostDevice, point 1
being done right at the end of the function mentioned above
(qemuDomainWaitForDeviceRemoval), point 2 being satisfied by the last call in
the same function.
Erik
More information about the libvir-list
mailing list