]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nodedev: factor out function to add mediated devices
authorJonathon Jongsma <jjongsma@redhat.com>
Tue, 2 Mar 2021 17:14:06 +0000 (11:14 -0600)
committerJonathon Jongsma <jjongsma@redhat.com>
Wed, 7 Apr 2021 20:24:20 +0000 (15:24 -0500)
To accomodate re-use of this functionality in a following patch, split
out the processing of an individual mdev definition into a separate
function.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
src/node_device/node_device_driver.c

index 01e189b73a9a5371e968aadb656450a190de0556..6cc09a80ef6d1a665c3ad87e7ce9031f9fe5b2fa 100644 (file)
@@ -1220,6 +1220,61 @@ nodeDeviceDestroy(virNodeDevicePtr device)
     return ret;
 }
 
+
+/* takes ownership of @def and potentially frees it. @def should not be used
+ * after returning from this function */
+static int
+nodeDeviceUpdateMediatedDevice(virNodeDeviceDef *def)
+{
+    virNodeDeviceObj *obj;
+    virObjectEvent *event;
+    bool defined = false;
+    g_autoptr(virNodeDeviceDef) owned = def;
+    g_autofree char *name = g_strdup(owned->name);
+
+    owned->driver = g_strdup("vfio_mdev");
+
+    if (!(obj = virNodeDeviceObjListFindByName(driver->devs, owned->name))) {
+        virNodeDeviceDef *d = g_steal_pointer(&owned);
+        if (!(obj = virNodeDeviceObjListAssignDef(driver->devs, d))) {
+            virNodeDeviceDefFree(d);
+            return -1;
+        }
+    } else {
+        bool changed;
+        virNodeDeviceDef *olddef = virNodeDeviceObjGetDef(obj);
+
+        defined = virNodeDeviceObjIsPersistent(obj);
+        /* Active devices contain some additional information (e.g. sysfs
+         * path) that is not provided by mdevctl, so re-use the existing
+         * definition and copy over new mdev data */
+        changed = nodeDeviceDefCopyFromMdevctl(olddef, owned);
+
+        if (defined && !changed) {
+            /* if this device was already defined and the definition
+             * hasn't changed, there's nothing to do for this device */
+            virNodeDeviceObjEndAPI(&obj);
+            return 0;
+        }
+    }
+
+    /* all devices returned by virMdevctlListDefined() are persistent */
+    virNodeDeviceObjSetPersistent(obj, true);
+
+    if (!defined)
+        event = virNodeDeviceEventLifecycleNew(name,
+                                               VIR_NODE_DEVICE_EVENT_DEFINED,
+                                               0);
+    else
+        event = virNodeDeviceEventUpdateNew(name);
+
+    virNodeDeviceObjEndAPI(&obj);
+    virObjectEventStateQueue(driver->nodeDeviceEventState, event);
+
+    return 0;
+}
+
+
 virNodeDevice*
 nodeDeviceDefineXML(virConnect *conn,
                     const char *xmlDesc,
@@ -1533,52 +1588,9 @@ nodeDeviceUpdateMediatedDevices(void)
     virNodeDeviceObjListForEachRemove(driver->devs,
                                       removeMissingPersistentMdev, &data);
 
-    for (i = 0; i < data.ndefs; i++) {
-        virNodeDeviceObj *obj;
-        virObjectEvent *event;
-        g_autoptr(virNodeDeviceDef) def = defs[i];
-        g_autofree char *name = g_strdup(def->name);
-        bool defined = false;
-
-        def->driver = g_strdup("vfio_mdev");
-
-        if (!(obj = virNodeDeviceObjListFindByName(driver->devs, def->name))) {
-            virNodeDeviceDef *d = g_steal_pointer(&def);
-            if (!(obj = virNodeDeviceObjListAssignDef(driver->devs, d))) {
-                virNodeDeviceDefFree(d);
-                return -1;
-            }
-        } else {
-            bool changed;
-            virNodeDeviceDef *olddef = virNodeDeviceObjGetDef(obj);
-
-            defined = virNodeDeviceObjIsPersistent(obj);
-            /* Active devices contain some additional information (e.g. sysfs
-             * path) that is not provided by mdevctl, so re-use the existing
-             * definition and copy over new mdev data */
-            changed = nodeDeviceDefCopyFromMdevctl(olddef, def);
-
-            if (defined && !changed) {
-                /* if this device was already defined and the definition
-                 * hasn't changed, there's nothing to do for this device */
-                virNodeDeviceObjEndAPI(&obj);
-                continue;
-            }
-        }
-
-        /* all devices returned by virMdevctlListDefined() are persistent */
-        virNodeDeviceObjSetPersistent(obj, true);
-
-        if (!defined)
-            event = virNodeDeviceEventLifecycleNew(name,
-                                                   VIR_NODE_DEVICE_EVENT_DEFINED,
-                                                   0);
-        else
-            event = virNodeDeviceEventUpdateNew(name);
-
-        virNodeDeviceObjEndAPI(&obj);
-        virObjectEventStateQueue(driver->nodeDeviceEventState, event);
-    }
+    for (i = 0; i < data.ndefs; i++)
+        if (nodeDeviceUpdateMediatedDevice(defs[i]) < 0)
+            return -1;
 
     return 0;
 }