mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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