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" | ||||
| 	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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -179,6 +179,7 @@ | |||
| #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> | ||||
|  | @ -192,7 +193,6 @@ | |||
| #include "bcache_ondisk.h" | ||||
| #include "bset.h" | ||||
| #include "util.h" | ||||
| #include "closure.h" | ||||
| 
 | ||||
| struct bucket { | ||||
| 	atomic_t	pin; | ||||
|  |  | |||
|  | @ -2905,7 +2905,6 @@ static int __init bcache_init(void) | |||
| 		goto err; | ||||
| 
 | ||||
| 	bch_debug_init(); | ||||
| 	closure_debug_init(); | ||||
| 
 | ||||
| 	bcache_is_reboot = false; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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); | ||||
|  | @ -506,6 +506,9 @@ config ASSOCIATIVE_ARRAY | |||
| 
 | ||||
| 	  for more information. | ||||
| 
 | ||||
| config CLOSURES | ||||
| 	bool | ||||
| 
 | ||||
| config HAS_IOMEM | ||||
| 	bool | ||||
| 	depends on !NO_IOMEM | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
		Loading…
	
		Reference in a new issue
	
	 Kent Overstreet
						Kent Overstreet