Commit 20ec197b authored by David Howells's avatar David Howells
Browse files

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: default avatarDavid Howells <dhowells@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
cc: linux-cachefs@redhat.com
Link: https://lore.kernel.org/r/162431204358.2908479.8006938388213098079.stgit@warthog.procyon.org.uk/
parent 33cba859
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+21 −10
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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,
+9 −8
Original line number Diff line number Diff line
@@ -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
 */
+1 −1
Original line number Diff line number Diff line
@@ -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;
Loading