diff options
author | David Howells <dhowells@redhat.com> | 2021-03-29 14:53:50 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2021-08-27 14:34:03 +0200 |
commit | 20ec197bfa13c5b799fc9527790ea7b5374fc8f2 (patch) | |
tree | 77224ac38587572748156ae6bf02835a74585afb | |
parent | fscache: Fix fscache_cookie_put() to not deref after dec (diff) | |
download | linux-20ec197bfa13c5b799fc9527790ea7b5374fc8f2.tar.xz linux-20ec197bfa13c5b799fc9527790ea7b5374fc8f2.zip |
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/
-rw-r--r-- | fs/fscache/cache.c | 2 | ||||
-rw-r--r-- | fs/fscache/cookie.c | 31 | ||||
-rw-r--r-- | fs/fscache/fsdef.c | 2 | ||||
-rw-r--r-- | fs/fscache/internal.h | 17 | ||||
-rw-r--r-- | include/linux/fscache.h | 2 | ||||
-rw-r--r-- | include/trace/events/fscache.h | 44 |
6 files changed, 55 insertions, 43 deletions
diff --git a/fs/fscache/cache.c b/fs/fscache/cache.c index e7a5d7ab4085..bd4f44c1cce0 100644 --- a/fs/fscache/cache.c +++ b/fs/fscache/cache.c @@ -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); diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c index 6df3732cf1b4..cd42be646ed3 100644 --- a/fs/fscache/cookie.c +++ b/fs/fscache/cookie.c @@ -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); @@ -887,6 +885,19 @@ void fscache_cookie_put(struct fscache_cookie *cookie, } /* + * 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 * * NOTE: it only serves no-index type @@ -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, diff --git a/fs/fscache/fsdef.c b/fs/fscache/fsdef.c index 5f8f6fe243fe..0402673c680e 100644 --- a/fs/fscache/fsdef.c +++ b/fs/fscache/fsdef.c @@ -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, diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h index 345105dbbfd1..c3e4804b8fcb 100644 --- a/fs/fscache/internal.h +++ b/fs/fscache/internal.h @@ -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 */ diff --git a/include/linux/fscache.h b/include/linux/fscache.h index ea61e54a6bc5..a4dab5998613 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h @@ -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; diff --git a/include/trace/events/fscache.h b/include/trace/events/fscache.h index 19d65d9d4357..446392f5ba83 100644 --- a/include/trace/events/fscache.h +++ b/include/trace/events/fscache.h @@ -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) ); |