forked from mirrors/linux
		
	bcache: move closures to lib/
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>
This commit is contained in:
		
							parent
							
								
									957e48087d
								
							
						
					
					
						commit
						8c8d2d9670
					
				
					 10 changed files with 43 additions and 43 deletions
				
			
		|  | @ -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 | ||||||
| 	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 @@ | ||||||
| 
 | 
 | ||||||
| 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 @@ | ||||||
| #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 @@ | ||||||
| #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) | ||||||
| 		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 @@ | ||||||
| #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 @@ | ||||||
| #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 { | ||||||
| 
 | 
 | ||||||
| 	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) | ||||||
| 		__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) {} | ||||||
| 
 | 
 | ||||||
| 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) | ||||||
| 	 */ | 	 */ | ||||||
| 	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) | ||||||
|  */ |  */ | ||||||
| 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) | ||||||
|  */ |  */ | ||||||
| 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 | ||||||
| 
 | 
 | ||||||
| 	  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 | ||||||
| 	  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 | ||||||
| 
 | 
 | ||||||
| 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 @@ | ||||||
|  * 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) | ||||||
| { | { | ||||||
| 	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) | ||||||
| { | { | ||||||
| 	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) | ||||||
| 		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) | ||||||
| 
 | 
 | ||||||
| 	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) | ||||||
| 
 | 
 | ||||||
| 	__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) | ||||||
| 	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) | ||||||
| 	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) | ||||||
| 			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) | ||||||
| 
 | 
 | ||||||
| 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"); |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Kent Overstreet
						Kent Overstreet