[PATCH 8/9] qemu, libxl, hypervisor: use virDomainDriverNodeDeviceDetachFlags() helper

Ján Tomko jtomko at redhat.com
Tue Feb 2 16:18:51 UTC 2021


On a Monday in 2021, Daniel Henrique Barboza wrote:
>libxlNodeDeviceDetachFlags() and qemuNodeDeviceDetachFlags() are mostly
>equal, aside from how the virHostdevmanager pointer is retrieved and
>the PCI stub driver used.
>
>Now that the PCI stub driver verification is done early in both functions,
>we can use the virDomainDriverNodeDeviceDetachFlags() helper to reduce
>code duplication between them. 'driverName' is checked inside the helper
>to set the appropriate stub driver.
>
>Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
>---
> src/hypervisor/domain_driver.c | 60 ++++++++++++++++++++++++++++++++++
> src/hypervisor/domain_driver.h |  4 +++
> src/libvirt_private.syms       |  1 +
> src/libxl/libxl_driver.c       | 54 ++----------------------------
> src/qemu/qemu_driver.c         | 49 ++-------------------------
> 5 files changed, 71 insertions(+), 97 deletions(-)
>
>diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
>index ea4c3c9466..6ee74d6dff 100644
>--- a/src/hypervisor/domain_driver.c
>+++ b/src/hypervisor/domain_driver.c
>@@ -459,3 +459,63 @@ virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
>
>     return virHostdevPCINodeDeviceReAttach(hostdevMgr, pci);
> }
>+
>+int
>+virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
>+                                     virHostdevManagerPtr hostdevMgr,
>+                                     const char *driverName)

This helper does not even take flags, so the only reason to keep the
'Flags' in its name is to be consistent with the driver method it
implements...

>+{
>+    virPCIDevicePtr pci = NULL;
>+    virPCIDeviceAddress devAddr;
>+    int ret = -1;
>+    virNodeDeviceDefPtr def = NULL;
>+    g_autofree char *xml = NULL;
>+    virConnectPtr nodeconn = NULL;
>+    virNodeDevicePtr nodedev = NULL;
>+
>+    if (!driverName)
>+        return -1;
>+
>+    if (!(nodeconn = virGetConnectNodeDev()))
>+        goto cleanup;
>+
>+    /* 'dev' is associated with virConnectPtr, so for split
>+     * daemons, we need to get a copy that is associated with
>+     * the virnodedevd daemon. */
>+    if (!(nodedev = virNodeDeviceLookupByName(nodeconn,
>+                                              virNodeDeviceGetName(dev))))
>+        goto cleanup;
>+
>+    xml = virNodeDeviceGetXMLDesc(nodedev, 0);
>+    if (!xml)
>+        goto cleanup;
>+
>+    def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL);
>+    if (!def)
>+        goto cleanup;
>+
>+    /* ACL check must happen against original 'dev',
>+     * not the new 'nodedev' we acquired */
>+    if (virNodeDeviceDetachFlagsEnsureACL(dev->conn, def) < 0)
>+        goto cleanup;
>+

... and the ACL check required.

But moving the ACL checks into src/hypervisor means they are no longer
covered by the check-aclrules check.

I'd rather keep the ACL checks repetitive in each driver than risk the
chance of missing them, but that invalidates most of these refactors.

Any ideas?

Jano

>+    if (virDomainDriverNodeDeviceGetPCIInfo(def, &devAddr) < 0)
>+        goto cleanup;
>+
>+    pci = virPCIDeviceNew(&devAddr);
>+    if (!pci)
>+        goto cleanup;
>+
>+    if (STREQ(driverName, "vfio"))
>+        virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
>+    else if (STREQ(driverName, "xen"))
>+        virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
>+
>+    ret = virHostdevPCINodeDeviceDetach(hostdevMgr, pci);
>+ cleanup:
>+    virPCIDeviceFree(pci);
>+    virNodeDeviceDefFree(def);
>+    virObjectUnref(nodedev);
>+    virObjectUnref(nodeconn);
>+    return ret;
>+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210202/5928490d/attachment-0001.sig>


More information about the libvir-list mailing list