mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08: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
@ -269,7 +269,7 @@ int fscache_add_cache(struct fscache_cache *cache,
|
|||||||
hlist_add_head(&ifsdef->cookie_link,
|
hlist_add_head(&ifsdef->cookie_link,
|
||||||
&fscache_fsdef_index.backing_objects);
|
&fscache_fsdef_index.backing_objects);
|
||||||
|
|
||||||
atomic_inc(&fscache_fsdef_index.usage);
|
refcount_inc(&fscache_fsdef_index.ref);
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
spin_unlock(&fscache_fsdef_index.lock);
|
spin_unlock(&fscache_fsdef_index.lock);
|
||||||
|
@ -164,7 +164,7 @@ struct fscache_cookie *fscache_alloc_cookie(
|
|||||||
goto nomem;
|
goto nomem;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_set(&cookie->usage, 1);
|
refcount_set(&cookie->ref, 1);
|
||||||
atomic_set(&cookie->n_children, 0);
|
atomic_set(&cookie->n_children, 0);
|
||||||
cookie->debug_id = atomic_inc_return(&fscache_cookie_debug_id);
|
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:
|
collision:
|
||||||
if (test_and_set_bit(FSCACHE_COOKIE_ACQUIRED, &cursor->flags)) {
|
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);
|
fscache_cookie_collision);
|
||||||
pr_err("Duplicate cookie detected\n");
|
pr_err("Duplicate cookie detected\n");
|
||||||
fscache_print_cookie(cursor, 'O');
|
fscache_print_cookie(cursor, 'O');
|
||||||
@ -826,13 +826,12 @@ void __fscache_relinquish_cookie(struct fscache_cookie *cookie,
|
|||||||
BUG_ON(!radix_tree_empty(&cookie->stores));
|
BUG_ON(!radix_tree_empty(&cookie->stores));
|
||||||
|
|
||||||
if (cookie->parent) {
|
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);
|
ASSERTCMP(atomic_read(&cookie->parent->n_children), >, 0);
|
||||||
atomic_dec(&cookie->parent->n_children);
|
atomic_dec(&cookie->parent->n_children);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dispose of the netfs's link to the cookie */
|
/* Dispose of the netfs's link to the cookie */
|
||||||
ASSERTCMP(atomic_read(&cookie->usage), >, 0);
|
|
||||||
fscache_cookie_put(cookie, fscache_cookie_put_relinquish);
|
fscache_cookie_put(cookie, fscache_cookie_put_relinquish);
|
||||||
|
|
||||||
_leave("");
|
_leave("");
|
||||||
@ -862,18 +861,17 @@ void fscache_cookie_put(struct fscache_cookie *cookie,
|
|||||||
enum fscache_cookie_trace where)
|
enum fscache_cookie_trace where)
|
||||||
{
|
{
|
||||||
struct fscache_cookie *parent;
|
struct fscache_cookie *parent;
|
||||||
int usage;
|
int ref;
|
||||||
|
|
||||||
_enter("%x", cookie->debug_id);
|
_enter("%x", cookie->debug_id);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
unsigned int cookie_debug_id = cookie->debug_id;
|
unsigned int cookie_debug_id = cookie->debug_id;
|
||||||
usage = atomic_dec_return(&cookie->usage);
|
bool zero = __refcount_dec_and_test(&cookie->ref, &ref);
|
||||||
trace_fscache_cookie(cookie_debug_id, usage, where);
|
|
||||||
|
|
||||||
if (usage > 0)
|
trace_fscache_cookie(cookie_debug_id, ref - 1, where);
|
||||||
|
if (!zero)
|
||||||
return;
|
return;
|
||||||
BUG_ON(usage < 0);
|
|
||||||
|
|
||||||
parent = cookie->parent;
|
parent = cookie->parent;
|
||||||
fscache_unhash_cookie(cookie);
|
fscache_unhash_cookie(cookie);
|
||||||
@ -886,6 +884,19 @@ void fscache_cookie_put(struct fscache_cookie *cookie,
|
|||||||
_leave("");
|
_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
|
* 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",
|
"%08x %08x %5u %5u %3u %s %03lx %-16s %px",
|
||||||
cookie->debug_id,
|
cookie->debug_id,
|
||||||
cookie->parent ? cookie->parent->debug_id : 0,
|
cookie->parent ? cookie->parent->debug_id : 0,
|
||||||
atomic_read(&cookie->usage),
|
refcount_read(&cookie->ref),
|
||||||
atomic_read(&cookie->n_children),
|
atomic_read(&cookie->n_children),
|
||||||
atomic_read(&cookie->n_active),
|
atomic_read(&cookie->n_active),
|
||||||
type,
|
type,
|
||||||
|
@ -46,7 +46,7 @@ static struct fscache_cookie_def fscache_fsdef_index_def = {
|
|||||||
|
|
||||||
struct fscache_cookie fscache_fsdef_index = {
|
struct fscache_cookie fscache_fsdef_index = {
|
||||||
.debug_id = 1,
|
.debug_id = 1,
|
||||||
.usage = ATOMIC_INIT(1),
|
.ref = REFCOUNT_INIT(1),
|
||||||
.n_active = ATOMIC_INIT(1),
|
.n_active = ATOMIC_INIT(1),
|
||||||
.lock = __SPIN_LOCK_UNLOCKED(fscache_fsdef_index.lock),
|
.lock = __SPIN_LOCK_UNLOCKED(fscache_fsdef_index.lock),
|
||||||
.backing_objects = HLIST_HEAD_INIT,
|
.backing_objects = HLIST_HEAD_INIT,
|
||||||
|
@ -54,9 +54,18 @@ extern struct fscache_cookie *fscache_alloc_cookie(struct fscache_cookie *,
|
|||||||
const void *, size_t,
|
const void *, size_t,
|
||||||
void *, loff_t);
|
void *, loff_t);
|
||||||
extern struct fscache_cookie *fscache_hash_cookie(struct fscache_cookie *);
|
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 *,
|
extern void fscache_cookie_put(struct fscache_cookie *,
|
||||||
enum fscache_cookie_trace);
|
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
|
* fsdef.c
|
||||||
*/
|
*/
|
||||||
@ -286,14 +295,6 @@ static inline void fscache_raise_event(struct fscache_object *object,
|
|||||||
fscache_enqueue_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
|
* get an extra reference to a netfs retrieval context
|
||||||
*/
|
*/
|
||||||
|
@ -123,7 +123,7 @@ struct fscache_netfs {
|
|||||||
* - indices are created on disk just-in-time
|
* - indices are created on disk just-in-time
|
||||||
*/
|
*/
|
||||||
struct fscache_cookie {
|
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_children; /* number of children of this cookie */
|
||||||
atomic_t n_active; /* number of active users of netfs ptrs */
|
atomic_t n_active; /* number of active users of netfs ptrs */
|
||||||
unsigned int debug_id;
|
unsigned int debug_id;
|
||||||
|
@ -161,26 +161,26 @@ fscache_cookie_traces;
|
|||||||
|
|
||||||
TRACE_EVENT(fscache_cookie,
|
TRACE_EVENT(fscache_cookie,
|
||||||
TP_PROTO(unsigned int cookie_debug_id,
|
TP_PROTO(unsigned int cookie_debug_id,
|
||||||
int usage,
|
int ref,
|
||||||
enum fscache_cookie_trace where),
|
enum fscache_cookie_trace where),
|
||||||
|
|
||||||
TP_ARGS(cookie_debug_id, usage, where),
|
TP_ARGS(cookie_debug_id, ref, where),
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
__field(unsigned int, cookie )
|
__field(unsigned int, cookie )
|
||||||
__field(enum fscache_cookie_trace, where )
|
__field(enum fscache_cookie_trace, where )
|
||||||
__field(int, usage )
|
__field(int, ref )
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->cookie = cookie_debug_id;
|
__entry->cookie = cookie_debug_id;
|
||||||
__entry->where = where;
|
__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),
|
__print_symbolic(__entry->where, fscache_cookie_traces),
|
||||||
__entry->cookie, __entry->usage)
|
__entry->cookie, __entry->ref)
|
||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(fscache_netfs,
|
TRACE_EVENT(fscache_netfs,
|
||||||
@ -212,7 +212,7 @@ TRACE_EVENT(fscache_acquire,
|
|||||||
__field(unsigned int, cookie )
|
__field(unsigned int, cookie )
|
||||||
__field(unsigned int, parent )
|
__field(unsigned int, parent )
|
||||||
__array(char, name, 8 )
|
__array(char, name, 8 )
|
||||||
__field(int, p_usage )
|
__field(int, p_ref )
|
||||||
__field(int, p_n_children )
|
__field(int, p_n_children )
|
||||||
__field(u8, p_flags )
|
__field(u8, p_flags )
|
||||||
),
|
),
|
||||||
@ -220,15 +220,15 @@ TRACE_EVENT(fscache_acquire,
|
|||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->cookie = cookie->debug_id;
|
__entry->cookie = cookie->debug_id;
|
||||||
__entry->parent = cookie->parent->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_n_children = atomic_read(&cookie->parent->n_children);
|
||||||
__entry->p_flags = cookie->parent->flags;
|
__entry->p_flags = cookie->parent->flags;
|
||||||
memcpy(__entry->name, cookie->def->name, 8);
|
memcpy(__entry->name, cookie->def->name, 8);
|
||||||
__entry->name[7] = 0;
|
__entry->name[7] = 0;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("c=%08x p=%08x pu=%d pc=%d pf=%02x n=%s",
|
TP_printk("c=%08x p=%08x pr=%d pc=%d pf=%02x n=%s",
|
||||||
__entry->cookie, __entry->parent, __entry->p_usage,
|
__entry->cookie, __entry->parent, __entry->p_ref,
|
||||||
__entry->p_n_children, __entry->p_flags, __entry->name)
|
__entry->p_n_children, __entry->p_flags, __entry->name)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ TRACE_EVENT(fscache_relinquish,
|
|||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
__field(unsigned int, cookie )
|
__field(unsigned int, cookie )
|
||||||
__field(unsigned int, parent )
|
__field(unsigned int, parent )
|
||||||
__field(int, usage )
|
__field(int, ref )
|
||||||
__field(int, n_children )
|
__field(int, n_children )
|
||||||
__field(int, n_active )
|
__field(int, n_active )
|
||||||
__field(u8, flags )
|
__field(u8, flags )
|
||||||
@ -250,15 +250,15 @@ TRACE_EVENT(fscache_relinquish,
|
|||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->cookie = cookie->debug_id;
|
__entry->cookie = cookie->debug_id;
|
||||||
__entry->parent = cookie->parent->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_children = atomic_read(&cookie->n_children);
|
||||||
__entry->n_active = atomic_read(&cookie->n_active);
|
__entry->n_active = atomic_read(&cookie->n_active);
|
||||||
__entry->flags = cookie->flags;
|
__entry->flags = cookie->flags;
|
||||||
__entry->retire = retire;
|
__entry->retire = retire;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("c=%08x u=%d p=%08x Nc=%d Na=%d f=%02x r=%u",
|
TP_printk("c=%08x r=%d p=%08x Nc=%d Na=%d f=%02x r=%u",
|
||||||
__entry->cookie, __entry->usage,
|
__entry->cookie, __entry->ref,
|
||||||
__entry->parent, __entry->n_children, __entry->n_active,
|
__entry->parent, __entry->n_children, __entry->n_active,
|
||||||
__entry->flags, __entry->retire)
|
__entry->flags, __entry->retire)
|
||||||
);
|
);
|
||||||
@ -270,7 +270,7 @@ TRACE_EVENT(fscache_enable,
|
|||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
__field(unsigned int, cookie )
|
__field(unsigned int, cookie )
|
||||||
__field(int, usage )
|
__field(int, ref )
|
||||||
__field(int, n_children )
|
__field(int, n_children )
|
||||||
__field(int, n_active )
|
__field(int, n_active )
|
||||||
__field(u8, flags )
|
__field(u8, flags )
|
||||||
@ -278,14 +278,14 @@ TRACE_EVENT(fscache_enable,
|
|||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->cookie = cookie->debug_id;
|
__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_children = atomic_read(&cookie->n_children);
|
||||||
__entry->n_active = atomic_read(&cookie->n_active);
|
__entry->n_active = atomic_read(&cookie->n_active);
|
||||||
__entry->flags = cookie->flags;
|
__entry->flags = cookie->flags;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("c=%08x u=%d Nc=%d Na=%d f=%02x",
|
TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x",
|
||||||
__entry->cookie, __entry->usage,
|
__entry->cookie, __entry->ref,
|
||||||
__entry->n_children, __entry->n_active, __entry->flags)
|
__entry->n_children, __entry->n_active, __entry->flags)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -296,7 +296,7 @@ TRACE_EVENT(fscache_disable,
|
|||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
__field(unsigned int, cookie )
|
__field(unsigned int, cookie )
|
||||||
__field(int, usage )
|
__field(int, ref )
|
||||||
__field(int, n_children )
|
__field(int, n_children )
|
||||||
__field(int, n_active )
|
__field(int, n_active )
|
||||||
__field(u8, flags )
|
__field(u8, flags )
|
||||||
@ -304,14 +304,14 @@ TRACE_EVENT(fscache_disable,
|
|||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->cookie = cookie->debug_id;
|
__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_children = atomic_read(&cookie->n_children);
|
||||||
__entry->n_active = atomic_read(&cookie->n_active);
|
__entry->n_active = atomic_read(&cookie->n_active);
|
||||||
__entry->flags = cookie->flags;
|
__entry->flags = cookie->flags;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("c=%08x u=%d Nc=%d Na=%d f=%02x",
|
TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x",
|
||||||
__entry->cookie, __entry->usage,
|
__entry->cookie, __entry->ref,
|
||||||
__entry->n_children, __entry->n_active, __entry->flags)
|
__entry->n_children, __entry->n_active, __entry->flags)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user