dm vdo: rename uds-threads.[ch] to thread-utils.[ch]
authorMike Snitzer <snitzer@kernel.org>
Fri, 9 Feb 2024 16:10:03 +0000 (10:10 -0600)
committerMike Snitzer <snitzer@kernel.org>
Fri, 1 Mar 2024 14:25:45 +0000 (09:25 -0500)
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Signed-off-by: Matthew Sakai <msakai@redhat.com>
16 files changed:
drivers/md/dm-vdo/Makefile
drivers/md/dm-vdo/config.c
drivers/md/dm-vdo/funnel-requestqueue.c
drivers/md/dm-vdo/index-page-map.c
drivers/md/dm-vdo/index-session.h
drivers/md/dm-vdo/logger.c
drivers/md/dm-vdo/status-codes.c
drivers/md/dm-vdo/thread-cond-var.c
drivers/md/dm-vdo/thread-utils.c [new file with mode: 0644]
drivers/md/dm-vdo/thread-utils.h [new file with mode: 0644]
drivers/md/dm-vdo/uds-threads.c [deleted file]
drivers/md/dm-vdo/uds-threads.h [deleted file]
drivers/md/dm-vdo/volume-index.c
drivers/md/dm-vdo/volume-index.h
drivers/md/dm-vdo/volume.c
drivers/md/dm-vdo/volume.h

index 8c06c3b969e3ef7892ca653cdd92574f2c498c5c..be5020b81c475db09e55b4fd53ca09f3fae417a3 100644 (file)
@@ -51,8 +51,8 @@ dm-vdo-objs := \
        thread-cond-var.o \
        thread-device.o \
        thread-registry.o \
+       thread-utils.o \
        uds-sysfs.o \
-       uds-threads.o \
        vdo.o \
        vio.o \
        volume-index.o \
index e9c7e9bdbce064cfed07c25a285616c084364592..0bf315e7b5d130ab58cc109c15604a1ee0d7a492 100644 (file)
@@ -9,7 +9,7 @@
 #include "memory-alloc.h"
 #include "numeric.h"
 #include "string-utils.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 
 static const u8 INDEX_CONFIG_MAGIC[] = "ALBIC";
 static const u8 INDEX_CONFIG_VERSION_6_02[] = "06.02";
index c8ba04c1089c7c424eb670fa1464b251f23d40fa..e7a3a49622959bbd871d7e0a4d26bcd62b07ff87 100644 (file)
@@ -12,7 +12,7 @@
 #include "funnel-queue.h"
 #include "logger.h"
 #include "memory-alloc.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 
 /*
  * This queue will attempt to handle requests in reasonably sized batches instead of reacting
index f3748a915c03bd51a13b64a254217d159692836b..8441f86ef3a4e0efa262d6afd4caf3641d2416d2 100644 (file)
@@ -12,7 +12,7 @@
 #include "numeric.h"
 #include "permassert.h"
 #include "string-utils.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 #include "uds.h"
 
 /*
index c77ee021d510df2badc1bd5724e7ccf1f5e76e3b..62a9020dd9fa84bc4065eb3a505660422b127e84 100644 (file)
@@ -10,7 +10,7 @@
 #include <linux/cache.h>
 
 #include "config.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 #include "uds.h"
 
 /*
index 1efbf8d52f2cfdc050bf45729e133b67a422c90f..ff1c570f81bf5de5f9ada49d40859991a8f5b477 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/sched.h>
 
 #include "thread-device.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 
 struct priority_name {
        const char *name;
index b4d7eb7f94ff067f85e3ad56287ca602051c47fa..d77bc5e4a99a3f61ed222d9198f9e50308981d2a 100644 (file)
@@ -8,7 +8,7 @@
 #include "errors.h"
 #include "logger.h"
 #include "permassert.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 
 const struct error_info vdo_status_list[] = {
        { "VDO_NOT_IMPLEMENTED", "Not implemented" },
index ed7f0b79ca0a89d179b4b2699d324e08dabc4073..82b80338b448915745a4d399fb34a4dad04e84a9 100644 (file)
@@ -7,8 +7,8 @@
 #include <linux/minmax.h>
 
 #include "errors.h"
+#include "thread-utils.h"
 #include "time-utils.h"
-#include "uds-threads.h"
 
 int uds_init_cond(struct cond_var *cv)
 {
diff --git a/drivers/md/dm-vdo/thread-utils.c b/drivers/md/dm-vdo/thread-utils.c
new file mode 100644 (file)
index 0000000..1a1eb9a
--- /dev/null
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright 2023 Red Hat
+ */
+
+#include "thread-utils.h"
+
+#include <linux/completion.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/kthread.h>
+#include <linux/sched.h>
+
+#include "errors.h"
+#include "logger.h"
+#include "memory-alloc.h"
+
+static struct hlist_head thread_list;
+static struct mutex thread_mutex;
+static atomic_t thread_once = ATOMIC_INIT(0);
+
+struct thread {
+       void (*thread_function)(void *thread_data);
+       void *thread_data;
+       struct hlist_node thread_links;
+       struct task_struct *thread_task;
+       struct completion thread_done;
+};
+
+enum {
+       ONCE_NOT_DONE = 0,
+       ONCE_IN_PROGRESS = 1,
+       ONCE_COMPLETE = 2,
+};
+
+/* Run a function once only, and record that fact in the atomic value. */
+void uds_perform_once(atomic_t *once, void (*function)(void))
+{
+       for (;;) {
+               switch (atomic_cmpxchg(once, ONCE_NOT_DONE, ONCE_IN_PROGRESS)) {
+               case ONCE_NOT_DONE:
+                       function();
+                       atomic_set_release(once, ONCE_COMPLETE);
+                       return;
+               case ONCE_IN_PROGRESS:
+                       cond_resched();
+                       break;
+               case ONCE_COMPLETE:
+                       return;
+               default:
+                       return;
+               }
+       }
+}
+
+static void thread_init(void)
+{
+       mutex_init(&thread_mutex);
+}
+
+static int thread_starter(void *arg)
+{
+       struct registered_thread allocating_thread;
+       struct thread *thread = arg;
+
+       thread->thread_task = current;
+       uds_perform_once(&thread_once, thread_init);
+       mutex_lock(&thread_mutex);
+       hlist_add_head(&thread->thread_links, &thread_list);
+       mutex_unlock(&thread_mutex);
+       uds_register_allocating_thread(&allocating_thread, NULL);
+       thread->thread_function(thread->thread_data);
+       uds_unregister_allocating_thread();
+       complete(&thread->thread_done);
+       return 0;
+}
+
+int uds_create_thread(void (*thread_function)(void *), void *thread_data,
+                     const char *name, struct thread **new_thread)
+{
+       char *name_colon = strchr(name, ':');
+       char *my_name_colon = strchr(current->comm, ':');
+       struct task_struct *task;
+       struct thread *thread;
+       int result;
+
+       result = uds_allocate(1, struct thread, __func__, &thread);
+       if (result != UDS_SUCCESS) {
+               uds_log_warning("Error allocating memory for %s", name);
+               return result;
+       }
+
+       thread->thread_function = thread_function;
+       thread->thread_data = thread_data;
+       init_completion(&thread->thread_done);
+       /*
+        * Start the thread, with an appropriate thread name.
+        *
+        * If the name supplied contains a colon character, use that name. This causes uds module
+        * threads to have names like "uds:callbackW" and the main test runner thread to be named
+        * "zub:runtest".
+        *
+        * Otherwise if the current thread has a name containing a colon character, prefix the name
+        * supplied with the name of the current thread up to (and including) the colon character.
+        * Thus when the "kvdo0:dedupeQ" thread opens an index session, all the threads associated
+        * with that index will have names like "kvdo0:foo".
+        *
+        * Otherwise just use the name supplied. This should be a rare occurrence.
+        */
+       if ((name_colon == NULL) && (my_name_colon != NULL)) {
+               task = kthread_run(thread_starter, thread, "%.*s:%s",
+                                  (int) (my_name_colon - current->comm), current->comm,
+                                  name);
+       } else {
+               task = kthread_run(thread_starter, thread, "%s", name);
+       }
+
+       if (IS_ERR(task)) {
+               uds_free(thread);
+               return PTR_ERR(task);
+       }
+
+       *new_thread = thread;
+       return UDS_SUCCESS;
+}
+
+int uds_join_threads(struct thread *thread)
+{
+       while (wait_for_completion_interruptible(&thread->thread_done))
+               fsleep(1000);
+
+       mutex_lock(&thread_mutex);
+       hlist_del(&thread->thread_links);
+       mutex_unlock(&thread_mutex);
+       uds_free(thread);
+       return UDS_SUCCESS;
+}
diff --git a/drivers/md/dm-vdo/thread-utils.h b/drivers/md/dm-vdo/thread-utils.h
new file mode 100644 (file)
index 0000000..30637dd
--- /dev/null
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright 2023 Red Hat
+ */
+
+#ifndef THREAD_UTILS_H
+#define THREAD_UTILS_H
+
+#include <linux/atomic.h>
+#include <linux/delay.h>
+#include <linux/jiffies.h>
+#include <linux/mutex.h>
+#include <linux/semaphore.h>
+#include <linux/wait.h>
+
+#include "errors.h"
+
+/* Thread and synchronization utilities for UDS */
+
+struct cond_var {
+       wait_queue_head_t wait_queue;
+};
+
+struct thread;
+
+
+int __must_check uds_create_thread(void (*thread_function)(void *), void *thread_data,
+                                  const char *name, struct thread **new_thread);
+
+void uds_perform_once(atomic_t *once_state, void (*function) (void));
+
+int uds_join_threads(struct thread *thread);
+
+int __must_check uds_init_cond(struct cond_var *cond);
+int uds_signal_cond(struct cond_var *cond);
+int uds_broadcast_cond(struct cond_var *cond);
+int uds_wait_cond(struct cond_var *cond, struct mutex *mutex);
+int uds_destroy_cond(struct cond_var *cond);
+
+static inline int __must_check uds_init_mutex(struct mutex *mutex)
+{
+       mutex_init(mutex);
+       return UDS_SUCCESS;
+}
+
+static inline int uds_destroy_mutex(struct mutex *mutex)
+{
+       return UDS_SUCCESS;
+}
+
+static inline void uds_lock_mutex(struct mutex *mutex)
+{
+       mutex_lock(mutex);
+}
+
+static inline void uds_unlock_mutex(struct mutex *mutex)
+{
+       mutex_unlock(mutex);
+}
+
+
+#endif /* UDS_THREADS_H */
diff --git a/drivers/md/dm-vdo/uds-threads.c b/drivers/md/dm-vdo/uds-threads.c
deleted file mode 100644 (file)
index 3bfd22b..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright 2023 Red Hat
- */
-
-#include "uds-threads.h"
-
-#include <linux/completion.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-
-#include "errors.h"
-#include "logger.h"
-#include "memory-alloc.h"
-
-static struct hlist_head thread_list;
-static struct mutex thread_mutex;
-static atomic_t thread_once = ATOMIC_INIT(0);
-
-struct thread {
-       void (*thread_function)(void *thread_data);
-       void *thread_data;
-       struct hlist_node thread_links;
-       struct task_struct *thread_task;
-       struct completion thread_done;
-};
-
-enum {
-       ONCE_NOT_DONE = 0,
-       ONCE_IN_PROGRESS = 1,
-       ONCE_COMPLETE = 2,
-};
-
-/* Run a function once only, and record that fact in the atomic value. */
-void uds_perform_once(atomic_t *once, void (*function)(void))
-{
-       for (;;) {
-               switch (atomic_cmpxchg(once, ONCE_NOT_DONE, ONCE_IN_PROGRESS)) {
-               case ONCE_NOT_DONE:
-                       function();
-                       atomic_set_release(once, ONCE_COMPLETE);
-                       return;
-               case ONCE_IN_PROGRESS:
-                       cond_resched();
-                       break;
-               case ONCE_COMPLETE:
-                       return;
-               default:
-                       return;
-               }
-       }
-}
-
-static void thread_init(void)
-{
-       mutex_init(&thread_mutex);
-}
-
-static int thread_starter(void *arg)
-{
-       struct registered_thread allocating_thread;
-       struct thread *thread = arg;
-
-       thread->thread_task = current;
-       uds_perform_once(&thread_once, thread_init);
-       mutex_lock(&thread_mutex);
-       hlist_add_head(&thread->thread_links, &thread_list);
-       mutex_unlock(&thread_mutex);
-       uds_register_allocating_thread(&allocating_thread, NULL);
-       thread->thread_function(thread->thread_data);
-       uds_unregister_allocating_thread();
-       complete(&thread->thread_done);
-       return 0;
-}
-
-int uds_create_thread(void (*thread_function)(void *), void *thread_data,
-                     const char *name, struct thread **new_thread)
-{
-       char *name_colon = strchr(name, ':');
-       char *my_name_colon = strchr(current->comm, ':');
-       struct task_struct *task;
-       struct thread *thread;
-       int result;
-
-       result = uds_allocate(1, struct thread, __func__, &thread);
-       if (result != UDS_SUCCESS) {
-               uds_log_warning("Error allocating memory for %s", name);
-               return result;
-       }
-
-       thread->thread_function = thread_function;
-       thread->thread_data = thread_data;
-       init_completion(&thread->thread_done);
-       /*
-        * Start the thread, with an appropriate thread name.
-        *
-        * If the name supplied contains a colon character, use that name. This causes uds module
-        * threads to have names like "uds:callbackW" and the main test runner thread to be named
-        * "zub:runtest".
-        *
-        * Otherwise if the current thread has a name containing a colon character, prefix the name
-        * supplied with the name of the current thread up to (and including) the colon character.
-        * Thus when the "kvdo0:dedupeQ" thread opens an index session, all the threads associated
-        * with that index will have names like "kvdo0:foo".
-        *
-        * Otherwise just use the name supplied. This should be a rare occurrence.
-        */
-       if ((name_colon == NULL) && (my_name_colon != NULL)) {
-               task = kthread_run(thread_starter, thread, "%.*s:%s",
-                                  (int) (my_name_colon - current->comm), current->comm,
-                                  name);
-       } else {
-               task = kthread_run(thread_starter, thread, "%s", name);
-       }
-
-       if (IS_ERR(task)) {
-               uds_free(thread);
-               return PTR_ERR(task);
-       }
-
-       *new_thread = thread;
-       return UDS_SUCCESS;
-}
-
-int uds_join_threads(struct thread *thread)
-{
-       while (wait_for_completion_interruptible(&thread->thread_done))
-               fsleep(1000);
-
-       mutex_lock(&thread_mutex);
-       hlist_del(&thread->thread_links);
-       mutex_unlock(&thread_mutex);
-       uds_free(thread);
-       return UDS_SUCCESS;
-}
diff --git a/drivers/md/dm-vdo/uds-threads.h b/drivers/md/dm-vdo/uds-threads.h
deleted file mode 100644 (file)
index 2a0580e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright 2023 Red Hat
- */
-
-#ifndef UDS_THREADS_H
-#define UDS_THREADS_H
-
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/jiffies.h>
-#include <linux/mutex.h>
-#include <linux/semaphore.h>
-#include <linux/wait.h>
-
-#include "errors.h"
-#include "time-utils.h"
-
-/* Thread and synchronization utilities for UDS */
-
-struct cond_var {
-       wait_queue_head_t wait_queue;
-};
-
-struct thread;
-
-
-int __must_check uds_create_thread(void (*thread_function)(void *), void *thread_data,
-                                  const char *name, struct thread **new_thread);
-
-void uds_perform_once(atomic_t *once_state, void (*function) (void));
-
-int uds_join_threads(struct thread *thread);
-
-int __must_check uds_init_cond(struct cond_var *cond);
-int uds_signal_cond(struct cond_var *cond);
-int uds_broadcast_cond(struct cond_var *cond);
-int uds_wait_cond(struct cond_var *cond, struct mutex *mutex);
-int uds_destroy_cond(struct cond_var *cond);
-
-static inline int __must_check uds_init_mutex(struct mutex *mutex)
-{
-       mutex_init(mutex);
-       return UDS_SUCCESS;
-}
-
-static inline int uds_destroy_mutex(struct mutex *mutex)
-{
-       return UDS_SUCCESS;
-}
-
-static inline void uds_lock_mutex(struct mutex *mutex)
-{
-       mutex_lock(mutex);
-}
-
-static inline void uds_unlock_mutex(struct mutex *mutex)
-{
-       mutex_unlock(mutex);
-}
-
-
-#endif /* UDS_THREADS_H */
index eebc19fe7d6f10fe6e142657065a570bb0ce5e34..daeafe7691eaee50392857dd1f65266823a43f55 100644 (file)
@@ -18,8 +18,8 @@
 #include "memory-alloc.h"
 #include "numeric.h"
 #include "permassert.h"
+#include "thread-utils.h"
 #include "uds.h"
-#include "uds-threads.h"
 
 /*
  * The volume index is a combination of two separate subindexes, one containing sparse hook entries
index 537e9947cf4a3a99e53d03c9580b3d4d5227e9d9..2eb2cee7ee5884f2b3079b6965c178f14210daa7 100644 (file)
@@ -10,8 +10,8 @@
 
 #include "config.h"
 #include "delta-index.h"
+#include "thread-utils.h"
 #include "uds.h"
-#include "uds-threads.h"
 
 /*
  * The volume index is the primary top-level index for UDS. It contains records which map a record
index 8bd64057c2ca6321b6ffbaefd50b6d6a5db0cc3f..5b3cb5d89e47ec7b40c458c59ac8eb28aa6546ee 100644 (file)
@@ -20,7 +20,7 @@
 #include "permassert.h"
 #include "sparse-cache.h"
 #include "string-utils.h"
-#include "uds-threads.h"
+#include "thread-utils.h"
 
 /*
  * The first block of the volume layout is reserved for the volume header, which is no longer used.
index 066680282340b972b74cf59914f9897d9741272a..7ef9945d84031f59fd2289bd3825aa997250b536 100644 (file)
@@ -19,8 +19,8 @@
 #include "permassert.h"
 #include "radix-sort.h"
 #include "sparse-cache.h"
+#include "thread-utils.h"
 #include "uds.h"
-#include "uds-threads.h"
 
 /*
  * The volume manages deduplication records on permanent storage. The term "volume" can also refer