Commit 8c8d2d96 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcache: move closures to lib/

Prep work for bcachefs - being a fork of bcache it also uses closures
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
Acked-by: default avatarColy Li <colyli@suse.de>
Reviewed-by: default avatarRandy Dunlap <rdunlap@infradead.org>
parent 957e4808
...@@ -4,6 +4,7 @@ config BCACHE ...@@ -4,6 +4,7 @@ config BCACHE
tristate "Block device as cache" tristate "Block device as cache"
select BLOCK_HOLDER_DEPRECATED if SYSFS select BLOCK_HOLDER_DEPRECATED if SYSFS
select CRC64 select CRC64
select CLOSURES
help help
Allows a block device to be used as cache for other devices; uses Allows a block device to be used as cache for other devices; uses
a btree for indexing and the layout is optimized for SSDs. a btree for indexing and the layout is optimized for SSDs.
...@@ -19,15 +20,6 @@ config BCACHE_DEBUG ...@@ -19,15 +20,6 @@ config BCACHE_DEBUG
Enables extra debugging tools, allows expensive runtime checks to be Enables extra debugging tools, allows expensive runtime checks to be
turned on. 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 config BCACHE_ASYNC_REGISTRATION
bool "Asynchronous device registration" bool "Asynchronous device registration"
depends on BCACHE depends on BCACHE
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
obj-$(CONFIG_BCACHE) += bcache.o obj-$(CONFIG_BCACHE) += bcache.o
bcache-y := alloc.o bset.o btree.o closure.o debug.o extents.o\ bcache-y := alloc.o bset.o btree.o debug.o extents.o io.o\
io.o journal.o movinggc.o request.o stats.o super.o sysfs.o trace.o\ journal.o movinggc.o request.o stats.o super.o sysfs.o trace.o\
util.o writeback.o features.o util.o writeback.o features.o
...@@ -179,6 +179,7 @@ ...@@ -179,6 +179,7 @@
#define pr_fmt(fmt) "bcache: %s() " fmt, __func__ #define pr_fmt(fmt) "bcache: %s() " fmt, __func__
#include <linux/bio.h> #include <linux/bio.h>
#include <linux/closure.h>
#include <linux/kobject.h> #include <linux/kobject.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/mutex.h> #include <linux/mutex.h>
...@@ -192,7 +193,6 @@ ...@@ -192,7 +193,6 @@
#include "bcache_ondisk.h" #include "bcache_ondisk.h"
#include "bset.h" #include "bset.h"
#include "util.h" #include "util.h"
#include "closure.h"
struct bucket { struct bucket {
atomic_t pin; atomic_t pin;
......
...@@ -2905,7 +2905,6 @@ static int __init bcache_init(void) ...@@ -2905,7 +2905,6 @@ static int __init bcache_init(void)
goto err; goto err;
bch_debug_init(); bch_debug_init();
closure_debug_init();
bcache_is_reboot = false; bcache_is_reboot = false;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#define _BCACHE_UTIL_H #define _BCACHE_UTIL_H
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/closure.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched/clock.h> #include <linux/sched/clock.h>
...@@ -13,8 +14,6 @@ ...@@ -13,8 +14,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/crc64.h> #include <linux/crc64.h>
#include "closure.h"
struct closure; struct closure;
#ifdef CONFIG_BCACHE_DEBUG #ifdef CONFIG_BCACHE_DEBUG
......
...@@ -155,7 +155,7 @@ struct closure { ...@@ -155,7 +155,7 @@ struct closure {
atomic_t remaining; atomic_t remaining;
#ifdef CONFIG_BCACHE_CLOSURES_DEBUG #ifdef CONFIG_DEBUG_CLOSURES
#define CLOSURE_MAGIC_DEAD 0xc054dead #define CLOSURE_MAGIC_DEAD 0xc054dead
#define CLOSURE_MAGIC_ALIVE 0xc054a11e #define CLOSURE_MAGIC_ALIVE 0xc054a11e
...@@ -184,15 +184,13 @@ static inline void closure_sync(struct closure *cl) ...@@ -184,15 +184,13 @@ static inline void closure_sync(struct closure *cl)
__closure_sync(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_create(struct closure *cl);
void closure_debug_destroy(struct closure *cl); void closure_debug_destroy(struct closure *cl);
#else #else
static inline void closure_debug_init(void) {}
static inline void closure_debug_create(struct closure *cl) {} static inline void closure_debug_create(struct closure *cl) {}
static inline void closure_debug_destroy(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) {} ...@@ -200,21 +198,21 @@ static inline void closure_debug_destroy(struct closure *cl) {}
static inline void closure_set_ip(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_; cl->ip = _THIS_IP_;
#endif #endif
} }
static inline void closure_set_ret_ip(struct closure *cl) static inline void closure_set_ret_ip(struct closure *cl)
{ {
#ifdef CONFIG_BCACHE_CLOSURES_DEBUG #ifdef CONFIG_DEBUG_CLOSURES
cl->ip = _RET_IP_; cl->ip = _RET_IP_;
#endif #endif
} }
static inline void closure_set_waiting(struct closure *cl, unsigned long f) 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; cl->waiting_on = f;
#endif #endif
} }
...@@ -243,6 +241,7 @@ static inline void closure_queue(struct closure *cl) ...@@ -243,6 +241,7 @@ static inline void closure_queue(struct closure *cl)
*/ */
BUILD_BUG_ON(offsetof(struct closure, fn) BUILD_BUG_ON(offsetof(struct closure, fn)
!= offsetof(struct work_struct, func)); != offsetof(struct work_struct, func));
if (wq) { if (wq) {
INIT_WORK(&cl->work, cl->work.func); INIT_WORK(&cl->work, cl->work.func);
BUG_ON(!queue_work(wq, &cl->work)); BUG_ON(!queue_work(wq, &cl->work));
...@@ -255,7 +254,7 @@ static inline void closure_queue(struct closure *cl) ...@@ -255,7 +254,7 @@ static inline void closure_queue(struct closure *cl)
*/ */
static inline void closure_get(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) & BUG_ON((atomic_inc_return(&cl->remaining) &
CLOSURE_REMAINING_MASK) <= 1); CLOSURE_REMAINING_MASK) <= 1);
#else #else
...@@ -271,7 +270,7 @@ static inline void closure_get(struct closure *cl) ...@@ -271,7 +270,7 @@ static inline void closure_get(struct closure *cl)
*/ */
static inline void closure_init(struct closure *cl, struct closure *parent) static inline void closure_init(struct closure *cl, struct closure *parent)
{ {
memset(cl, 0, sizeof(struct closure)); cl->fn = NULL;
cl->parent = parent; cl->parent = parent;
if (parent) if (parent)
closure_get(parent); closure_get(parent);
......
...@@ -506,6 +506,9 @@ config ASSOCIATIVE_ARRAY ...@@ -506,6 +506,9 @@ config ASSOCIATIVE_ARRAY
for more information. for more information.
config CLOSURES
bool
config HAS_IOMEM config HAS_IOMEM
bool bool
depends on !NO_IOMEM depends on !NO_IOMEM
......
...@@ -1720,6 +1720,15 @@ config DEBUG_NOTIFIERS ...@@ -1720,6 +1720,15 @@ config DEBUG_NOTIFIERS
This is a relatively cheap check but if you care about maximum This is a relatively cheap check but if you care about maximum
performance, say N. 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 config DEBUG_MAPLE_TREE
bool "Debug maple trees" bool "Debug maple trees"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
......
...@@ -255,6 +255,8 @@ obj-$(CONFIG_ATOMIC64_SELFTEST) += atomic64_test.o ...@@ -255,6 +255,8 @@ obj-$(CONFIG_ATOMIC64_SELFTEST) += atomic64_test.o
obj-$(CONFIG_CPU_RMAP) += cpu_rmap.o obj-$(CONFIG_CPU_RMAP) += cpu_rmap.o
obj-$(CONFIG_CLOSURES) += closure.o
obj-$(CONFIG_DQL) += dynamic_queue_limits.o obj-$(CONFIG_DQL) += dynamic_queue_limits.o
obj-$(CONFIG_GLOB) += glob.o obj-$(CONFIG_GLOB) += glob.o
......
...@@ -6,13 +6,12 @@ ...@@ -6,13 +6,12 @@
* Copyright 2012 Google, Inc. * Copyright 2012 Google, Inc.
*/ */
#include <linux/closure.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/module.h> #include <linux/export.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/sched/debug.h> #include <linux/sched/debug.h>
#include "closure.h"
static inline void closure_put_after_sub(struct closure *cl, int flags) static inline void closure_put_after_sub(struct closure *cl, int flags)
{ {
int r = flags & CLOSURE_REMAINING_MASK; int r = flags & CLOSURE_REMAINING_MASK;
...@@ -45,6 +44,7 @@ void closure_sub(struct closure *cl, int v) ...@@ -45,6 +44,7 @@ void closure_sub(struct closure *cl, int v)
{ {
closure_put_after_sub(cl, atomic_sub_return(v, &cl->remaining)); closure_put_after_sub(cl, atomic_sub_return(v, &cl->remaining));
} }
EXPORT_SYMBOL(closure_sub);
/* /*
* closure_put - decrement a closure's refcount * closure_put - decrement a closure's refcount
...@@ -53,6 +53,7 @@ void closure_put(struct closure *cl) ...@@ -53,6 +53,7 @@ void closure_put(struct closure *cl)
{ {
closure_put_after_sub(cl, atomic_dec_return(&cl->remaining)); 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 * 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) ...@@ -74,6 +75,7 @@ void __closure_wake_up(struct closure_waitlist *wait_list)
closure_sub(cl, CLOSURE_WAITING + 1); closure_sub(cl, CLOSURE_WAITING + 1);
} }
} }
EXPORT_SYMBOL(__closure_wake_up);
/** /**
* closure_wait - add a closure to a waitlist * closure_wait - add a closure to a waitlist
...@@ -93,6 +95,7 @@ bool closure_wait(struct closure_waitlist *waitlist, struct closure *cl) ...@@ -93,6 +95,7 @@ bool closure_wait(struct closure_waitlist *waitlist, struct closure *cl)
return true; return true;
} }
EXPORT_SYMBOL(closure_wait);
struct closure_syncer { struct closure_syncer {
struct task_struct *task; struct task_struct *task;
...@@ -127,8 +130,9 @@ void __sched __closure_sync(struct closure *cl) ...@@ -127,8 +130,9 @@ void __sched __closure_sync(struct closure *cl)
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
} }
EXPORT_SYMBOL(__closure_sync);
#ifdef CONFIG_BCACHE_CLOSURES_DEBUG #ifdef CONFIG_DEBUG_CLOSURES
static LIST_HEAD(closure_list); static LIST_HEAD(closure_list);
static DEFINE_SPINLOCK(closure_list_lock); static DEFINE_SPINLOCK(closure_list_lock);
...@@ -144,6 +148,7 @@ void closure_debug_create(struct closure *cl) ...@@ -144,6 +148,7 @@ void closure_debug_create(struct closure *cl)
list_add(&cl->all, &closure_list); list_add(&cl->all, &closure_list);
spin_unlock_irqrestore(&closure_list_lock, flags); spin_unlock_irqrestore(&closure_list_lock, flags);
} }
EXPORT_SYMBOL(closure_debug_create);
void closure_debug_destroy(struct closure *cl) void closure_debug_destroy(struct closure *cl)
{ {
...@@ -156,8 +161,7 @@ void closure_debug_destroy(struct closure *cl) ...@@ -156,8 +161,7 @@ void closure_debug_destroy(struct closure *cl)
list_del(&cl->all); list_del(&cl->all);
spin_unlock_irqrestore(&closure_list_lock, flags); spin_unlock_irqrestore(&closure_list_lock, flags);
} }
EXPORT_SYMBOL(closure_debug_destroy);
static struct dentry *closure_debug;
static int debug_show(struct seq_file *f, void *data) static int debug_show(struct seq_file *f, void *data)
{ {
...@@ -181,7 +185,7 @@ 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", seq_printf(f, " W %pS\n",
(void *) cl->waiting_on); (void *) cl->waiting_on);
seq_printf(f, "\n"); seq_puts(f, "\n");
} }
spin_unlock_irq(&closure_list_lock); spin_unlock_irq(&closure_list_lock);
...@@ -190,18 +194,11 @@ static int debug_show(struct seq_file *f, void *data) ...@@ -190,18 +194,11 @@ static int debug_show(struct seq_file *f, void *data)
DEFINE_SHOW_ATTRIBUTE(debug); DEFINE_SHOW_ATTRIBUTE(debug);
void __init closure_debug_init(void) static int __init closure_debug_init(void)
{ {
if (!IS_ERR_OR_NULL(bcache_debug)) debugfs_create_file("closures", 0400, NULL, NULL, &debug_fops);
/* return 0;
* 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);
} }
#endif late_initcall(closure_debug_init)
MODULE_AUTHOR("Kent Overstreet <koverstreet@google.com>"); #endif
MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment