106 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 05230da856d2f016c21f49a406780fbe15f74c32 Mon Sep 17 00:00:00 2001
 | |
| Message-ID: <05230da856d2f016c21f49a406780fbe15f74c32.1689602377.git.jdenemar@redhat.com>
 | |
| From: Jonathon Jongsma <jjongsma@redhat.com>
 | |
| Date: Wed, 5 Jul 2023 15:35:59 -0500
 | |
| Subject: [PATCH] nodedev: refactor mdevctl thread functions
 | |
| 
 | |
| Factor out a new scheduleMdevctlUpdate() function so that we can re-use
 | |
| it from other places. Now that other events can make it necessary to
 | |
| re-query mdevctl for mdev updates, this function will be useful for
 | |
| coalescing multiple updates in quick succession into a single mdevctl
 | |
| query.
 | |
| 
 | |
| Also rename a couple functions. The names weren't very descriptive of
 | |
| their behavior. For example, the old scheduleMdevctlHandler() function
 | |
| didn't actually schedule anything, it just started a thread. So rename
 | |
| it to free up the 'schedule' name for the above refactored function.
 | |
| 
 | |
| Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
 | |
| Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
 | |
| (cherry picked from commit 9b7fadc5dc33b85b597c95d944dc23c02c29c29f)
 | |
| 
 | |
| Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2143158
 | |
| 
 | |
| Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
 | |
| ---
 | |
|  src/node_device/node_device_udev.c | 36 ++++++++++++++++++++----------
 | |
|  1 file changed, 24 insertions(+), 12 deletions(-)
 | |
| 
 | |
| diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
 | |
| index fce4212728..86ef4af728 100644
 | |
| --- a/src/node_device/node_device_udev.c
 | |
| +++ b/src/node_device/node_device_udev.c
 | |
| @@ -2075,7 +2075,7 @@ udevPCITranslateInit(bool privileged G_GNUC_UNUSED)
 | |
|  
 | |
|  
 | |
|  static void
 | |
| -mdevctlHandlerThread(void *opaque G_GNUC_UNUSED)
 | |
| +mdevctlUpdateThreadFunc(void *opaque G_GNUC_UNUSED)
 | |
|  {
 | |
|      udevEventData *priv = driver->privateData;
 | |
|      VIR_LOCK_GUARD lock = virLockGuardLock(&priv->mdevctlLock);
 | |
| @@ -2086,7 +2086,7 @@ mdevctlHandlerThread(void *opaque G_GNUC_UNUSED)
 | |
|  
 | |
|  
 | |
|  static void
 | |
| -scheduleMdevctlHandler(int timer G_GNUC_UNUSED, void *opaque)
 | |
| +launchMdevctlUpdateThread(int timer G_GNUC_UNUSED, void *opaque)
 | |
|  {
 | |
|      udevEventData *priv = opaque;
 | |
|      virThread thread;
 | |
| @@ -2096,7 +2096,7 @@ scheduleMdevctlHandler(int timer G_GNUC_UNUSED, void *opaque)
 | |
|          priv->mdevctlTimeout = -1;
 | |
|      }
 | |
|  
 | |
| -    if (virThreadCreateFull(&thread, false, mdevctlHandlerThread,
 | |
| +    if (virThreadCreateFull(&thread, false, mdevctlUpdateThreadFunc,
 | |
|                              "mdevctl-thread", false, NULL) < 0) {
 | |
|          virReportSystemError(errno, "%s",
 | |
|                               _("failed to create mdevctl thread"));
 | |
| @@ -2192,6 +2192,26 @@ mdevctlEnableMonitor(udevEventData *priv)
 | |
|  }
 | |
|  
 | |
|  
 | |
| +/* Schedules an mdevctl update for 100ms in the future, canceling any existing
 | |
| + * timeout that may have been set. In this way, multiple update requests in
 | |
| + * quick succession can be collapsed into a single update. if @force is true,
 | |
| + * an update thread will be spawned immediately. */
 | |
| +static void
 | |
| +scheduleMdevctlUpdate(udevEventData *data,
 | |
| +                      bool force)
 | |
| +{
 | |
| +    if (!force) {
 | |
| +        if (data->mdevctlTimeout > 0)
 | |
| +            virEventRemoveTimeout(data->mdevctlTimeout);
 | |
| +        data->mdevctlTimeout = virEventAddTimeout(100, launchMdevctlUpdateThread,
 | |
| +                                                  data, NULL);
 | |
| +        return;
 | |
| +    }
 | |
| +
 | |
| +    launchMdevctlUpdateThread(-1, data);
 | |
| +}
 | |
| +
 | |
| +
 | |
|  static void
 | |
|  mdevctlEventHandleCallback(GFileMonitor *monitor G_GNUC_UNUSED,
 | |
|                             GFile *file,
 | |
| @@ -2222,15 +2242,7 @@ mdevctlEventHandleCallback(GFileMonitor *monitor G_GNUC_UNUSED,
 | |
|       * configuration change, try to coalesce these changes by waiting for the
 | |
|       * CHANGES_DONE_HINT event. As a fallback,  add a timeout to trigger the
 | |
|       * signal if that event never comes */
 | |
| -    if (event_type != G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) {
 | |
| -        if (priv->mdevctlTimeout > 0)
 | |
| -            virEventRemoveTimeout(priv->mdevctlTimeout);
 | |
| -        priv->mdevctlTimeout = virEventAddTimeout(100, scheduleMdevctlHandler,
 | |
| -                                                  priv, NULL);
 | |
| -        return;
 | |
| -    }
 | |
| -
 | |
| -    scheduleMdevctlHandler(-1, priv);
 | |
| +    scheduleMdevctlUpdate(priv, (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT));
 | |
|  }
 | |
|  
 | |
|  
 | |
| -- 
 | |
| 2.41.0
 |