]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bcache: move closures to lib/
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 18 Mar 2017 00:35:23 +0000 (16:35 -0800)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 19 Oct 2023 18:47:33 +0000 (14:47 -0400)
Prep work for bcachefs - being a fork of bcache it also uses closures

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Acked-by: Coly Li <colyli@suse.de>
Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
drivers/md/bcache/Kconfig
drivers/md/bcache/Makefile
drivers/md/bcache/bcache.h
drivers/md/bcache/super.c
drivers/md/bcache/util.h
include/linux/closure.h [moved from drivers/md/bcache/closure.h with 97% similarity]
lib/Kconfig
lib/Kconfig.debug
lib/Makefile
lib/closure.c [moved from drivers/md/bcache/closure.c with 88% similarity]

index 529c9d04e9a4310bb688466a29f41548f9e58274..b2d10063d35fb48ddb542f6934aa7ad172d276f1 100644 (file)
@@ -4,6 +4,7 @@ config BCACHE
        tristate "Block device as cache"
        select BLOCK_HOLDER_DEPRECATED if SYSFS
        select CRC64
+       select CLOSURES
        help
        Allows a block device to be used as cache for other devices; uses
        a btree for indexing and the layout is optimized for SSDs.
@@ -19,15 +20,6 @@ config BCACHE_DEBUG
        Enables extra debugging tools, allows expensive runtime checks to be
        turned on.
 
-config BCACHE_CLOSURES_DEBUG
-       bool "Debug closures"
-       depends on BCACHE
-       select DEBUG_FS
-       help
-       Keeps all active closures in a linked list and provides a debugfs
-       interface to list them, which makes it possible to see asynchronous
-       operations that get stuck.
-
 config BCACHE_ASYNC_REGISTRATION
        bool "Asynchronous device registration"
        depends on BCACHE
index 5b87e59676b86b806e79c9831e13801c8e1b1fa1..054e8a33a7ab170fd042d7a37743f0c9f76d2e08 100644 (file)
@@ -2,6 +2,6 @@
 
 obj-$(CONFIG_BCACHE)   += bcache.o
 
-bcache-y               := alloc.o bset.o btree.o closure.o debug.o extents.o\
-       io.o journal.o movinggc.o request.o stats.o super.o sysfs.o trace.o\
+bcache-y               := alloc.o bset.o btree.o debug.o extents.o io.o\
+       journal.o movinggc.o request.o stats.o super.o sysfs.o trace.o\
        util.o writeback.o features.o
index 5a79bb3c272f1ba9adfd786699f983ae4505c6a1..7c0d00432612798aef0b431bbee6b9d43a095b21 100644 (file)
 #define pr_fmt(fmt) "bcache: %s() " fmt, __func__
 
 #include <linux/bio.h>
+#include <linux/closure.h>
 #include <linux/kobject.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
 #include "bcache_ondisk.h"
 #include "bset.h"
 #include "util.h"
-#include "closure.h"
 
 struct bucket {
        atomic_t        pin;
index 0ae2b3676293074a1621226ceee76f0cac6b5d63..4affe587586c428a018a5590ada3e09d3544e076 100644 (file)
@@ -2905,7 +2905,6 @@ static int __init bcache_init(void)
                goto err;
 
        bch_debug_init();
-       closure_debug_init();
 
        bcache_is_reboot = false;
 
index 6f3cb7c9213037498cd8de2a24e28f867495ac67..f61ab1bada6cf5abd9c2dca6386271e9d7fb5d52 100644 (file)
@@ -4,6 +4,7 @@
 #define _BCACHE_UTIL_H
 
 #include <linux/blkdev.h>
+#include <linux/closure.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/sched/clock.h>
@@ -13,8 +14,6 @@
 #include <linux/workqueue.h>
 #include <linux/crc64.h>
 
-#include "closure.h"
-
 struct closure;
 
 #ifdef CONFIG_BCACHE_DEBUG
similarity index 97%
rename from drivers/md/bcache/closure.h
rename to include/linux/closure.h
index c88cdc4ae4ec5ebf9d6105e7f8f51cb461811df2..0ec9e7bc8d9734f4b4f2e50dc2fab39b398ae766 100644 (file)
@@ -155,7 +155,7 @@ struct closure {
 
        atomic_t                remaining;
 
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
 #define CLOSURE_MAGIC_DEAD     0xc054dead
 #define CLOSURE_MAGIC_ALIVE    0xc054a11e
 
@@ -184,15 +184,13 @@ static inline void closure_sync(struct closure *cl)
                __closure_sync(cl);
 }
 
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
 
-void closure_debug_init(void);
 void closure_debug_create(struct closure *cl);
 void closure_debug_destroy(struct closure *cl);
 
 #else
 
-static inline void closure_debug_init(void) {}
 static inline void closure_debug_create(struct closure *cl) {}
 static inline void closure_debug_destroy(struct closure *cl) {}
 
@@ -200,21 +198,21 @@ static inline void closure_debug_destroy(struct closure *cl) {}
 
 static inline void closure_set_ip(struct closure *cl)
 {
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
        cl->ip = _THIS_IP_;
 #endif
 }
 
 static inline void closure_set_ret_ip(struct closure *cl)
 {
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
        cl->ip = _RET_IP_;
 #endif
 }
 
 static inline void closure_set_waiting(struct closure *cl, unsigned long f)
 {
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
        cl->waiting_on = f;
 #endif
 }
@@ -243,6 +241,7 @@ static inline void closure_queue(struct closure *cl)
         */
        BUILD_BUG_ON(offsetof(struct closure, fn)
                     != offsetof(struct work_struct, func));
+
        if (wq) {
                INIT_WORK(&cl->work, cl->work.func);
                BUG_ON(!queue_work(wq, &cl->work));
@@ -255,7 +254,7 @@ static inline void closure_queue(struct closure *cl)
  */
 static inline void closure_get(struct closure *cl)
 {
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
        BUG_ON((atomic_inc_return(&cl->remaining) &
                CLOSURE_REMAINING_MASK) <= 1);
 #else
@@ -271,7 +270,7 @@ static inline void closure_get(struct closure *cl)
  */
 static inline void closure_init(struct closure *cl, struct closure *parent)
 {
-       memset(cl, 0, sizeof(struct closure));
+       cl->fn = NULL;
        cl->parent = parent;
        if (parent)
                closure_get(parent);
index c686f4adc1246a0e1d65f7c15a35d10e992ba2ca..263aa6ae8d7ce2c858073ff35eefa24828536e0f 100644 (file)
@@ -506,6 +506,9 @@ config ASSOCIATIVE_ARRAY
 
          for more information.
 
+config CLOSURES
+       bool
+
 config HAS_IOMEM
        bool
        depends on !NO_IOMEM
index fa307f93fa2e20d043b4a1c9094023aedd3d1d92..ce3a4abf40f812f1bdf3e3264e720570789e7c7f 100644 (file)
@@ -1720,6 +1720,15 @@ config DEBUG_NOTIFIERS
          This is a relatively cheap check but if you care about maximum
          performance, say N.
 
+config DEBUG_CLOSURES
+       bool "Debug closures (bcache async widgits)"
+       depends on CLOSURES
+       select DEBUG_FS
+       help
+         Keeps all active closures in a linked list and provides a debugfs
+         interface to list them, which makes it possible to see asynchronous
+         operations that get stuck.
+
 config DEBUG_MAPLE_TREE
        bool "Debug maple trees"
        depends on DEBUG_KERNEL
index 740109b6e2c89f0748d4ed5013139db0803c9bb2..57d394575919f3de5c97c08281c6999fcaff4441 100644 (file)
@@ -255,6 +255,8 @@ obj-$(CONFIG_ATOMIC64_SELFTEST) += atomic64_test.o
 
 obj-$(CONFIG_CPU_RMAP) += cpu_rmap.o
 
+obj-$(CONFIG_CLOSURES) += closure.o
+
 obj-$(CONFIG_DQL) += dynamic_queue_limits.o
 
 obj-$(CONFIG_GLOB) += glob.o
similarity index 88%
rename from drivers/md/bcache/closure.c
rename to lib/closure.c
index d8d9394a6beb103ac72031cd2d7b17c798772f01..b38ded00b9b052869e5ffab9873d0faffe955422 100644 (file)
@@ -6,13 +6,12 @@
  * Copyright 2012 Google, Inc.
  */
 
+#include <linux/closure.h>
 #include <linux/debugfs.h>
-#include <linux/module.h>
+#include <linux/export.h>
 #include <linux/seq_file.h>
 #include <linux/sched/debug.h>
 
-#include "closure.h"
-
 static inline void closure_put_after_sub(struct closure *cl, int flags)
 {
        int r = flags & CLOSURE_REMAINING_MASK;
@@ -45,6 +44,7 @@ void closure_sub(struct closure *cl, int v)
 {
        closure_put_after_sub(cl, atomic_sub_return(v, &cl->remaining));
 }
+EXPORT_SYMBOL(closure_sub);
 
 /*
  * closure_put - decrement a closure's refcount
@@ -53,6 +53,7 @@ void closure_put(struct closure *cl)
 {
        closure_put_after_sub(cl, atomic_dec_return(&cl->remaining));
 }
+EXPORT_SYMBOL(closure_put);
 
 /*
  * closure_wake_up - wake up all closures on a wait list, without memory barrier
@@ -74,6 +75,7 @@ void __closure_wake_up(struct closure_waitlist *wait_list)
                closure_sub(cl, CLOSURE_WAITING + 1);
        }
 }
+EXPORT_SYMBOL(__closure_wake_up);
 
 /**
  * closure_wait - add a closure to a waitlist
@@ -93,6 +95,7 @@ bool closure_wait(struct closure_waitlist *waitlist, struct closure *cl)
 
        return true;
 }
+EXPORT_SYMBOL(closure_wait);
 
 struct closure_syncer {
        struct task_struct      *task;
@@ -127,8 +130,9 @@ void __sched __closure_sync(struct closure *cl)
 
        __set_current_state(TASK_RUNNING);
 }
+EXPORT_SYMBOL(__closure_sync);
 
-#ifdef CONFIG_BCACHE_CLOSURES_DEBUG
+#ifdef CONFIG_DEBUG_CLOSURES
 
 static LIST_HEAD(closure_list);
 static DEFINE_SPINLOCK(closure_list_lock);
@@ -144,6 +148,7 @@ void closure_debug_create(struct closure *cl)
        list_add(&cl->all, &closure_list);
        spin_unlock_irqrestore(&closure_list_lock, flags);
 }
+EXPORT_SYMBOL(closure_debug_create);
 
 void closure_debug_destroy(struct closure *cl)
 {
@@ -156,8 +161,7 @@ void closure_debug_destroy(struct closure *cl)
        list_del(&cl->all);
        spin_unlock_irqrestore(&closure_list_lock, flags);
 }
-
-static struct dentry *closure_debug;
+EXPORT_SYMBOL(closure_debug_destroy);
 
 static int debug_show(struct seq_file *f, void *data)
 {
@@ -181,7 +185,7 @@ static int debug_show(struct seq_file *f, void *data)
                        seq_printf(f, " W %pS\n",
                                   (void *) cl->waiting_on);
 
-               seq_printf(f, "\n");
+               seq_puts(f, "\n");
        }
 
        spin_unlock_irq(&closure_list_lock);
@@ -190,18 +194,11 @@ static int debug_show(struct seq_file *f, void *data)
 
 DEFINE_SHOW_ATTRIBUTE(debug);
 
-void  __init closure_debug_init(void)
+static int __init closure_debug_init(void)
 {
-       if (!IS_ERR_OR_NULL(bcache_debug))
-               /*
-                * it is unnecessary to check return value of
-                * debugfs_create_file(), we should not care
-                * about this.
-                */
-               closure_debug = debugfs_create_file(
-                       "closures", 0400, bcache_debug, NULL, &debug_fops);
+       debugfs_create_file("closures", 0400, NULL, NULL, &debug_fops);
+       return 0;
 }
-#endif
+late_initcall(closure_debug_init)
 
-MODULE_AUTHOR("Kent Overstreet <koverstreet@google.com>");
-MODULE_LICENSE("GPL");
+#endif