mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	fscache: Use refcount_t for the cookie refcount instead of atomic_t
Use refcount_t for the fscache_cookie refcount instead of atomic_t and rename the 'usage' member to 'ref' in such cases. The tracepoints that reference it change from showing "u=%d" to "r=%d". Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Jeff Layton <jlayton@redhat.com> cc: linux-cachefs@redhat.com Link: https://lore.kernel.org/r/162431204358.2908479.8006938388213098079.stgit@warthog.procyon.org.uk/
This commit is contained in:
		
							parent
							
								
									33cba85922
								
							
						
					
					
						commit
						20ec197bfa
					
				
					 6 changed files with 55 additions and 43 deletions
				
			
		|  | @ -269,7 +269,7 @@ int fscache_add_cache(struct fscache_cache *cache, | |||
| 	hlist_add_head(&ifsdef->cookie_link, | ||||
| 		       &fscache_fsdef_index.backing_objects); | ||||
| 
 | ||||
| 	atomic_inc(&fscache_fsdef_index.usage); | ||||
| 	refcount_inc(&fscache_fsdef_index.ref); | ||||
| 
 | ||||
| 	/* done */ | ||||
| 	spin_unlock(&fscache_fsdef_index.lock); | ||||
|  |  | |||
|  | @ -164,7 +164,7 @@ struct fscache_cookie *fscache_alloc_cookie( | |||
| 			goto nomem; | ||||
| 	} | ||||
| 
 | ||||
| 	atomic_set(&cookie->usage, 1); | ||||
| 	refcount_set(&cookie->ref, 1); | ||||
| 	atomic_set(&cookie->n_children, 0); | ||||
| 	cookie->debug_id = atomic_inc_return(&fscache_cookie_debug_id); | ||||
| 
 | ||||
|  | @ -225,7 +225,7 @@ struct fscache_cookie *fscache_hash_cookie(struct fscache_cookie *candidate) | |||
| 
 | ||||
| collision: | ||||
| 	if (test_and_set_bit(FSCACHE_COOKIE_ACQUIRED, &cursor->flags)) { | ||||
| 		trace_fscache_cookie(cursor->debug_id, atomic_read(&cursor->usage), | ||||
| 		trace_fscache_cookie(cursor->debug_id, refcount_read(&cursor->ref), | ||||
| 				     fscache_cookie_collision); | ||||
| 		pr_err("Duplicate cookie detected\n"); | ||||
| 		fscache_print_cookie(cursor, 'O'); | ||||
|  | @ -826,13 +826,12 @@ void __fscache_relinquish_cookie(struct fscache_cookie *cookie, | |||
| 	BUG_ON(!radix_tree_empty(&cookie->stores)); | ||||
| 
 | ||||
| 	if (cookie->parent) { | ||||
| 		ASSERTCMP(atomic_read(&cookie->parent->usage), >, 0); | ||||
| 		ASSERTCMP(refcount_read(&cookie->parent->ref), >, 0); | ||||
| 		ASSERTCMP(atomic_read(&cookie->parent->n_children), >, 0); | ||||
| 		atomic_dec(&cookie->parent->n_children); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Dispose of the netfs's link to the cookie */ | ||||
| 	ASSERTCMP(atomic_read(&cookie->usage), >, 0); | ||||
| 	fscache_cookie_put(cookie, fscache_cookie_put_relinquish); | ||||
| 
 | ||||
| 	_leave(""); | ||||
|  | @ -862,18 +861,17 @@ void fscache_cookie_put(struct fscache_cookie *cookie, | |||
| 			enum fscache_cookie_trace where) | ||||
| { | ||||
| 	struct fscache_cookie *parent; | ||||
| 	int usage; | ||||
| 	int ref; | ||||
| 
 | ||||
| 	_enter("%x", cookie->debug_id); | ||||
| 
 | ||||
| 	do { | ||||
| 		unsigned int cookie_debug_id = cookie->debug_id; | ||||
| 		usage = atomic_dec_return(&cookie->usage); | ||||
| 		trace_fscache_cookie(cookie_debug_id, usage, where); | ||||
| 		bool zero = __refcount_dec_and_test(&cookie->ref, &ref); | ||||
| 
 | ||||
| 		if (usage > 0) | ||||
| 		trace_fscache_cookie(cookie_debug_id, ref - 1, where); | ||||
| 		if (!zero) | ||||
| 			return; | ||||
| 		BUG_ON(usage < 0); | ||||
| 
 | ||||
| 		parent = cookie->parent; | ||||
| 		fscache_unhash_cookie(cookie); | ||||
|  | @ -886,6 +884,19 @@ void fscache_cookie_put(struct fscache_cookie *cookie, | |||
| 	_leave(""); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Get a reference to a cookie. | ||||
|  */ | ||||
| struct fscache_cookie *fscache_cookie_get(struct fscache_cookie *cookie, | ||||
| 					  enum fscache_cookie_trace where) | ||||
| { | ||||
| 	int ref; | ||||
| 
 | ||||
| 	__refcount_inc(&cookie->ref, &ref); | ||||
| 	trace_fscache_cookie(cookie->debug_id, ref + 1, where); | ||||
| 	return cookie; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * check the consistency between the netfs inode and the backing cache | ||||
|  * | ||||
|  | @ -1003,7 +1014,7 @@ static int fscache_cookies_seq_show(struct seq_file *m, void *v) | |||
| 		   "%08x %08x %5u %5u %3u %s %03lx %-16s %px", | ||||
| 		   cookie->debug_id, | ||||
| 		   cookie->parent ? cookie->parent->debug_id : 0, | ||||
| 		   atomic_read(&cookie->usage), | ||||
| 		   refcount_read(&cookie->ref), | ||||
| 		   atomic_read(&cookie->n_children), | ||||
| 		   atomic_read(&cookie->n_active), | ||||
| 		   type, | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ static struct fscache_cookie_def fscache_fsdef_index_def = { | |||
| 
 | ||||
| struct fscache_cookie fscache_fsdef_index = { | ||||
| 	.debug_id	= 1, | ||||
| 	.usage		= ATOMIC_INIT(1), | ||||
| 	.ref		= REFCOUNT_INIT(1), | ||||
| 	.n_active	= ATOMIC_INIT(1), | ||||
| 	.lock		= __SPIN_LOCK_UNLOCKED(fscache_fsdef_index.lock), | ||||
| 	.backing_objects = HLIST_HEAD_INIT, | ||||
|  |  | |||
|  | @ -54,9 +54,18 @@ extern struct fscache_cookie *fscache_alloc_cookie(struct fscache_cookie *, | |||
| 						   const void *, size_t, | ||||
| 						   void *, loff_t); | ||||
| extern struct fscache_cookie *fscache_hash_cookie(struct fscache_cookie *); | ||||
| extern struct fscache_cookie *fscache_cookie_get(struct fscache_cookie *, | ||||
| 						 enum fscache_cookie_trace); | ||||
| extern void fscache_cookie_put(struct fscache_cookie *, | ||||
| 			       enum fscache_cookie_trace); | ||||
| 
 | ||||
| static inline void fscache_cookie_see(struct fscache_cookie *cookie, | ||||
| 				      enum fscache_cookie_trace where) | ||||
| { | ||||
| 	trace_fscache_cookie(cookie->debug_id, refcount_read(&cookie->ref), | ||||
| 			     where); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * fsdef.c | ||||
|  */ | ||||
|  | @ -286,14 +295,6 @@ static inline void fscache_raise_event(struct fscache_object *object, | |||
| 		fscache_enqueue_object(object); | ||||
| } | ||||
| 
 | ||||
| static inline void fscache_cookie_get(struct fscache_cookie *cookie, | ||||
| 				      enum fscache_cookie_trace where) | ||||
| { | ||||
| 	int usage = atomic_inc_return(&cookie->usage); | ||||
| 
 | ||||
| 	trace_fscache_cookie(cookie->debug_id, usage, where); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * get an extra reference to a netfs retrieval context | ||||
|  */ | ||||
|  |  | |||
|  | @ -123,7 +123,7 @@ struct fscache_netfs { | |||
|  * - indices are created on disk just-in-time | ||||
|  */ | ||||
| struct fscache_cookie { | ||||
| 	atomic_t			usage;		/* number of users of this cookie */ | ||||
| 	refcount_t			ref;		/* number of users of this cookie */ | ||||
| 	atomic_t			n_children;	/* number of children of this cookie */ | ||||
| 	atomic_t			n_active;	/* number of active users of netfs ptrs */ | ||||
| 	unsigned int			debug_id; | ||||
|  |  | |||
|  | @ -161,26 +161,26 @@ fscache_cookie_traces; | |||
| 
 | ||||
| TRACE_EVENT(fscache_cookie, | ||||
| 	    TP_PROTO(unsigned int cookie_debug_id, | ||||
| 		     int usage, | ||||
| 		     int ref, | ||||
| 		     enum fscache_cookie_trace where), | ||||
| 
 | ||||
| 	    TP_ARGS(cookie_debug_id, usage, where), | ||||
| 	    TP_ARGS(cookie_debug_id, ref, where), | ||||
| 
 | ||||
| 	    TP_STRUCT__entry( | ||||
| 		    __field(unsigned int,		cookie		) | ||||
| 		    __field(enum fscache_cookie_trace,	where		) | ||||
| 		    __field(int,			usage		) | ||||
| 		    __field(int,			ref		) | ||||
| 			     ), | ||||
| 
 | ||||
| 	    TP_fast_assign( | ||||
| 		    __entry->cookie	= cookie_debug_id; | ||||
| 		    __entry->where	= where; | ||||
| 		    __entry->usage	= usage; | ||||
| 		    __entry->ref	= ref; | ||||
| 			   ), | ||||
| 
 | ||||
| 	    TP_printk("%s c=%08x u=%d", | ||||
| 	    TP_printk("%s c=%08x r=%d", | ||||
| 		      __print_symbolic(__entry->where, fscache_cookie_traces), | ||||
| 		      __entry->cookie, __entry->usage) | ||||
| 		      __entry->cookie, __entry->ref) | ||||
| 	    ); | ||||
| 
 | ||||
| TRACE_EVENT(fscache_netfs, | ||||
|  | @ -212,7 +212,7 @@ TRACE_EVENT(fscache_acquire, | |||
| 		    __field(unsigned int,		cookie		) | ||||
| 		    __field(unsigned int,		parent		) | ||||
| 		    __array(char,			name, 8		) | ||||
| 		    __field(int,			p_usage		) | ||||
| 		    __field(int,			p_ref		) | ||||
| 		    __field(int,			p_n_children	) | ||||
| 		    __field(u8,				p_flags		) | ||||
| 			     ), | ||||
|  | @ -220,15 +220,15 @@ TRACE_EVENT(fscache_acquire, | |||
| 	    TP_fast_assign( | ||||
| 		    __entry->cookie		= cookie->debug_id; | ||||
| 		    __entry->parent		= cookie->parent->debug_id; | ||||
| 		    __entry->p_usage		= atomic_read(&cookie->parent->usage); | ||||
| 		    __entry->p_ref		= refcount_read(&cookie->parent->ref); | ||||
| 		    __entry->p_n_children	= atomic_read(&cookie->parent->n_children); | ||||
| 		    __entry->p_flags		= cookie->parent->flags; | ||||
| 		    memcpy(__entry->name, cookie->def->name, 8); | ||||
| 		    __entry->name[7]		= 0; | ||||
| 			   ), | ||||
| 
 | ||||
| 	    TP_printk("c=%08x p=%08x pu=%d pc=%d pf=%02x n=%s", | ||||
| 		      __entry->cookie, __entry->parent, __entry->p_usage, | ||||
| 	    TP_printk("c=%08x p=%08x pr=%d pc=%d pf=%02x n=%s", | ||||
| 		      __entry->cookie, __entry->parent, __entry->p_ref, | ||||
| 		      __entry->p_n_children, __entry->p_flags, __entry->name) | ||||
| 	    ); | ||||
| 
 | ||||
|  | @ -240,7 +240,7 @@ TRACE_EVENT(fscache_relinquish, | |||
| 	    TP_STRUCT__entry( | ||||
| 		    __field(unsigned int,		cookie		) | ||||
| 		    __field(unsigned int,		parent		) | ||||
| 		    __field(int,			usage		) | ||||
| 		    __field(int,			ref		) | ||||
| 		    __field(int,			n_children	) | ||||
| 		    __field(int,			n_active	) | ||||
| 		    __field(u8,				flags		) | ||||
|  | @ -250,15 +250,15 @@ TRACE_EVENT(fscache_relinquish, | |||
| 	    TP_fast_assign( | ||||
| 		    __entry->cookie	= cookie->debug_id; | ||||
| 		    __entry->parent	= cookie->parent->debug_id; | ||||
| 		    __entry->usage	= atomic_read(&cookie->usage); | ||||
| 		    __entry->ref	= refcount_read(&cookie->ref); | ||||
| 		    __entry->n_children	= atomic_read(&cookie->n_children); | ||||
| 		    __entry->n_active	= atomic_read(&cookie->n_active); | ||||
| 		    __entry->flags	= cookie->flags; | ||||
| 		    __entry->retire	= retire; | ||||
| 			   ), | ||||
| 
 | ||||
| 	    TP_printk("c=%08x u=%d p=%08x Nc=%d Na=%d f=%02x r=%u", | ||||
| 		      __entry->cookie, __entry->usage, | ||||
| 	    TP_printk("c=%08x r=%d p=%08x Nc=%d Na=%d f=%02x r=%u", | ||||
| 		      __entry->cookie, __entry->ref, | ||||
| 		      __entry->parent, __entry->n_children, __entry->n_active, | ||||
| 		      __entry->flags, __entry->retire) | ||||
| 	    ); | ||||
|  | @ -270,7 +270,7 @@ TRACE_EVENT(fscache_enable, | |||
| 
 | ||||
| 	    TP_STRUCT__entry( | ||||
| 		    __field(unsigned int,		cookie		) | ||||
| 		    __field(int,			usage		) | ||||
| 		    __field(int,			ref		) | ||||
| 		    __field(int,			n_children	) | ||||
| 		    __field(int,			n_active	) | ||||
| 		    __field(u8,				flags		) | ||||
|  | @ -278,14 +278,14 @@ TRACE_EVENT(fscache_enable, | |||
| 
 | ||||
| 	    TP_fast_assign( | ||||
| 		    __entry->cookie	= cookie->debug_id; | ||||
| 		    __entry->usage	= atomic_read(&cookie->usage); | ||||
| 		    __entry->ref	= refcount_read(&cookie->ref); | ||||
| 		    __entry->n_children	= atomic_read(&cookie->n_children); | ||||
| 		    __entry->n_active	= atomic_read(&cookie->n_active); | ||||
| 		    __entry->flags	= cookie->flags; | ||||
| 			   ), | ||||
| 
 | ||||
| 	    TP_printk("c=%08x u=%d Nc=%d Na=%d f=%02x", | ||||
| 		      __entry->cookie, __entry->usage, | ||||
| 	    TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x", | ||||
| 		      __entry->cookie, __entry->ref, | ||||
| 		      __entry->n_children, __entry->n_active, __entry->flags) | ||||
| 	    ); | ||||
| 
 | ||||
|  | @ -296,7 +296,7 @@ TRACE_EVENT(fscache_disable, | |||
| 
 | ||||
| 	    TP_STRUCT__entry( | ||||
| 		    __field(unsigned int,		cookie		) | ||||
| 		    __field(int,			usage		) | ||||
| 		    __field(int,			ref		) | ||||
| 		    __field(int,			n_children	) | ||||
| 		    __field(int,			n_active	) | ||||
| 		    __field(u8,				flags		) | ||||
|  | @ -304,14 +304,14 @@ TRACE_EVENT(fscache_disable, | |||
| 
 | ||||
| 	    TP_fast_assign( | ||||
| 		    __entry->cookie	= cookie->debug_id; | ||||
| 		    __entry->usage	= atomic_read(&cookie->usage); | ||||
| 		    __entry->ref	= refcount_read(&cookie->ref); | ||||
| 		    __entry->n_children	= atomic_read(&cookie->n_children); | ||||
| 		    __entry->n_active	= atomic_read(&cookie->n_active); | ||||
| 		    __entry->flags	= cookie->flags; | ||||
| 			   ), | ||||
| 
 | ||||
| 	    TP_printk("c=%08x u=%d Nc=%d Na=%d f=%02x", | ||||
| 		      __entry->cookie, __entry->usage, | ||||
| 	    TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x", | ||||
| 		      __entry->cookie, __entry->ref, | ||||
| 		      __entry->n_children, __entry->n_active, __entry->flags) | ||||
| 	    ); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 David Howells
						David Howells