]> xenbits.xensource.com Git - libvirt.git/commitdiff
nodedev: reset active config data on udev remove event
authorBoris Fiuczynski <fiuczy@linux.ibm.com>
Tue, 23 Apr 2024 18:08:50 +0000 (20:08 +0200)
committerJonathon Jongsma <jjongsma@redhat.com>
Tue, 18 Jun 2024 14:00:11 +0000 (09:00 -0500)
When a mdev device is destroyed or stopped the udev remove event
handling needs to reset the active config data of the node object
representing a persisted mdev.

Reviewed-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
src/conf/node_device_conf.c
src/libvirt_private.syms
src/node_device/node_device_driver.c
src/node_device/node_device_driver.h
src/node_device/node_device_udev.c
src/util/virmdev.c
src/util/virmdev.h

index d2b578178bee1d9bf060af0c7fa8a9440565c264..416238bec1541594edb5801966f8a6c5f50faae9 100644 (file)
@@ -2581,15 +2581,9 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps)
         g_free(data->sg.path);
         break;
     case VIR_NODE_DEV_CAP_MDEV:
-        g_free(data->mdev.defined_config.type);
-        g_free(data->mdev.active_config.type);
         g_free(data->mdev.uuid);
-        for (i = 0; i < data->mdev.defined_config.nattributes; i++)
-            virMediatedDeviceAttrFree(data->mdev.defined_config.attributes[i]);
-        g_free(data->mdev.defined_config.attributes);
-        for (i = 0; i < data->mdev.active_config.nattributes; i++)
-            virMediatedDeviceAttrFree(data->mdev.active_config.attributes[i]);
-        g_free(data->mdev.active_config.attributes);
+        virMediatedDeviceConfigClear(&data->mdev.defined_config);
+        virMediatedDeviceConfigClear(&data->mdev.active_config);
         g_free(data->mdev.parent_addr);
         break;
     case VIR_NODE_DEV_CAP_CSS_DEV:
index 8d760aca04643a3fbb090128322f71443f7acc53..bac4a8a366dfbd34e4dc9e28849d9dc762575607 100644 (file)
@@ -2765,6 +2765,8 @@ virMacMapWriteFile;
 # util/virmdev.h
 virMediatedDeviceAttrFree;
 virMediatedDeviceAttrNew;
+virMediatedDeviceConfigClear;
+virMediatedDeviceConfigFree;
 virMediatedDeviceFree;
 virMediatedDeviceGetIOMMUGroupDev;
 virMediatedDeviceGetIOMMUGroupNum;
index 700776c90c35bd8bfca3fce9593874e210e7accc..eb62802943e775e34c8a95ed7eb15f7c45b12ea0 100644 (file)
@@ -2016,6 +2016,19 @@ nodeDeviceDefCopyFromMdevctl(virNodeDeviceDef *dst,
 }
 
 
+/* A mediated device definition contains data from mdevctl about the active
+ * device. When the device is deactivated the active configuration data needs
+ * to be removed. */
+void
+nodeDeviceDefResetMdevActiveConfig(virNodeDeviceDef *def)
+{
+    if (def->caps->data.type != VIR_NODE_DEV_CAP_MDEV)
+        return;
+
+    virMediatedDeviceConfigClear(&def->caps->data.mdev.active_config);
+}
+
+
 int
 nodeDeviceSetAutostart(virNodeDevice *device,
                        int autostart)
index b3bc4b2e96edc0614745efb007f72ed5c3d45664..f195cfef9d49bf60e1c91ab64520d79feb7fbe2c 100644 (file)
@@ -197,3 +197,6 @@ int
 nodeDeviceUpdate(virNodeDevice *dev,
                  const char *xmlDesc,
                  unsigned int flags);
+
+void
+nodeDeviceDefResetMdevActiveConfig(virNodeDeviceDef *def);
index 42d169d852b5f12c1f5b215779946b7729e2d25f..da8d14b0e7e6ea2880996e8d4bbfdf99dc08c4d2 100644 (file)
@@ -1464,6 +1464,7 @@ udevRemoveOneDeviceSysPath(const char *path)
     if (virNodeDeviceObjIsPersistent(obj)) {
         VIR_FREE(def->sysfs_path);
         virNodeDeviceObjSetActive(obj, false);
+        nodeDeviceDefResetMdevActiveConfig(def);
     } else {
         VIR_DEBUG("Removing device '%s' with sysfs path '%s'",
                   def->name, path);
index 992f3eb1b74c57c8dfdcaf2d648125ad0601b605..6ecdbdf0ab773c476df93783992c6f039fbd727e 100644 (file)
@@ -516,6 +516,26 @@ void virMediatedDeviceAttrFree(virMediatedDeviceAttr *attr)
     g_free(attr);
 }
 
+void virMediatedDeviceConfigFree(virMediatedDeviceConfig *config)
+{
+    if (!config)
+        return;
+
+    virMediatedDeviceConfigClear(config);
+    g_free(config);
+}
+
+void virMediatedDeviceConfigClear(virMediatedDeviceConfig *config)
+{
+    size_t i = 0;
+
+    g_clear_pointer(&config->type, g_free);
+    for (i = 0; i < config->nattributes; i++)
+        virMediatedDeviceAttrFree(config->attributes[i]);
+    config->nattributes = 0;
+    g_clear_pointer(&config->attributes, g_free);
+}
+
 
 #define MDEV_BUS_DIR "/sys/class/mdev_bus"
 
index 853041ac061999efc37ef077a08a091e1d1de985..e8e69040e5d463d7e388816e8356dda073dd4060 100644 (file)
@@ -54,6 +54,10 @@ struct _virMediatedDeviceConfig {
     size_t nattributes;
 };
 
+void virMediatedDeviceConfigClear(virMediatedDeviceConfig *config);
+void virMediatedDeviceConfigFree(virMediatedDeviceConfig *config);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMediatedDeviceConfig, virMediatedDeviceConfigFree);
+
 typedef struct _virMediatedDeviceType virMediatedDeviceType;
 struct _virMediatedDeviceType {
     char *id;