Commit 76daa300 authored by David Howells's avatar David Howells
Browse files

afs: Improve server refcount/active count tracing



Improve server refcount/active count tracing to distinguish between simply
getting/putting a ref and using/unusing the server record (which changes
the activity count as well as the refcount).  This makes it a bit easier to
work out what's going on.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20250224234154.2014840-10-dhowells@redhat.com/ # v1
Link: https://lore.kernel.org/r/20250310094206.801057-6-dhowells@redhat.com/ # v4
parent 4f67bcf6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1653,7 +1653,7 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net, struct afs_server *server,
	bp = call->request;
	*bp++ = htonl(FSGIVEUPALLCALLBACKS);

	call->server = afs_use_server(server, afs_server_trace_give_up_cb);
	call->server = afs_use_server(server, afs_server_trace_use_give_up_cb);
	afs_make_call(call, GFP_NOFS);
	afs_wait_for_call_to_complete(call);
	ret = call->error;
@@ -1760,7 +1760,7 @@ bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
		return false;

	call->key	= key;
	call->server	= afs_use_server(server, afs_server_trace_get_caps);
	call->server	= afs_use_server(server, afs_server_trace_use_get_caps);
	call->peer	= rxrpc_kernel_get_peer(estate->addresses->addrs[addr_index].peer);
	call->probe	= afs_get_endpoint_state(estate, afs_estate_trace_get_getcaps);
	call->probe_index = addr_index;
+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ static void afs_free_call(struct afs_call *call)
	if (call->type->destructor)
		call->type->destructor(call);

	afs_unuse_server_notime(call->net, call->server, afs_server_trace_put_call);
	afs_unuse_server_notime(call->net, call->server, afs_server_trace_unuse_call);
	kfree(call->request);

	o = atomic_read(&net->nr_outstanding_calls);
+6 −5
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ struct afs_server *afs_find_server(struct afs_net *net, const struct rxrpc_peer

	do {
		if (server)
			afs_unuse_server_notime(net, server, afs_server_trace_put_find_rsq);
			afs_unuse_server_notime(net, server, afs_server_trace_unuse_find_rsq);
		server = NULL;
		seq++; /* 2 on the 1st/lockless path, otherwise odd */
		read_seqbegin_or_lock(&net->fs_addr_lock, &seq);
@@ -49,7 +49,7 @@ struct afs_server *afs_find_server(struct afs_net *net, const struct rxrpc_peer
		server = NULL;
		continue;
	found:
		server = afs_maybe_use_server(server, afs_server_trace_get_by_addr);
		server = afs_maybe_use_server(server, afs_server_trace_use_by_addr);

	} while (need_seqretry(&net->fs_addr_lock, seq));

@@ -76,7 +76,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
		 * changes.
		 */
		if (server)
			afs_unuse_server(net, server, afs_server_trace_put_uuid_rsq);
			afs_unuse_server(net, server, afs_server_trace_unuse_uuid_rsq);
		server = NULL;
		seq++; /* 2 on the 1st/lockless path, otherwise odd */
		read_seqbegin_or_lock(&net->fs_lock, &seq);
@@ -91,7 +91,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
			} else if (diff > 0) {
				p = p->rb_right;
			} else {
				afs_use_server(server, afs_server_trace_get_by_uuid);
				afs_use_server(server, afs_server_trace_use_by_uuid);
				break;
			}

@@ -273,7 +273,8 @@ static struct afs_addr_list *afs_vl_lookup_addrs(struct afs_cell *cell,
}

/*
 * Get or create a fileserver record.
 * Get or create a fileserver record and return it with an active-use count on
 * it.
 */
struct afs_server *afs_lookup_server(struct afs_cell *cell, struct key *key,
				     const uuid_t *uuid, u32 addr_version)
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ void afs_put_serverlist(struct afs_net *net, struct afs_server_list *slist)
	if (slist && refcount_dec_and_test(&slist->usage)) {
		for (i = 0; i < slist->nr_servers; i++)
			afs_unuse_server(net, slist->servers[i].server,
					 afs_server_trace_put_slist);
					 afs_server_trace_unuse_slist);
		kfree_rcu(slist, rcu);
	}
}
@@ -98,7 +98,7 @@ struct afs_server_list *afs_alloc_server_list(struct afs_volume *volume,
		if (j < slist->nr_servers) {
			if (slist->servers[j].server == server) {
				afs_unuse_server(volume->cell->net, server,
						 afs_server_trace_put_slist_isort);
						 afs_server_trace_unuse_slist_isort);
				continue;
			}

+15 −12
Original line number Diff line number Diff line
@@ -132,22 +132,25 @@ enum yfs_cm_operation {
	EM(afs_server_trace_destroy,		"DESTROY  ") \
	EM(afs_server_trace_free,		"FREE     ") \
	EM(afs_server_trace_gc,			"GC       ") \
	EM(afs_server_trace_get_by_addr,	"GET addr ") \
	EM(afs_server_trace_get_by_uuid,	"GET uuid ") \
	EM(afs_server_trace_get_caps,		"GET caps ") \
	EM(afs_server_trace_get_install,	"GET inst ") \
	EM(afs_server_trace_get_new_cbi,	"GET cbi  ") \
	EM(afs_server_trace_get_probe,		"GET probe") \
	EM(afs_server_trace_give_up_cb,		"giveup-cb") \
	EM(afs_server_trace_purging,		"PURGE    ") \
	EM(afs_server_trace_put_call,		"PUT call ") \
	EM(afs_server_trace_put_cbi,		"PUT cbi  ") \
	EM(afs_server_trace_put_find_rsq,	"PUT f-rsq") \
	EM(afs_server_trace_put_probe,		"PUT probe") \
	EM(afs_server_trace_put_slist,		"PUT slist") \
	EM(afs_server_trace_put_slist_isort,	"PUT isort") \
	EM(afs_server_trace_put_uuid_rsq,	"PUT u-req") \
	E_(afs_server_trace_update,		"UPDATE")
	EM(afs_server_trace_see_expired,	"SEE expd ") \
	EM(afs_server_trace_unuse_call,		"UNU call ") \
	EM(afs_server_trace_unuse_create_fail,	"UNU cfail") \
	EM(afs_server_trace_unuse_find_rsq,	"UNU f-rsq") \
	EM(afs_server_trace_unuse_slist,	"UNU slist") \
	EM(afs_server_trace_unuse_slist_isort,	"UNU isort") \
	EM(afs_server_trace_unuse_uuid_rsq,	"PUT u-req") \
	EM(afs_server_trace_update,		"UPDATE   ") \
	EM(afs_server_trace_use_by_addr,	"USE addr ") \
	EM(afs_server_trace_use_by_uuid,	"USE uuid ") \
	EM(afs_server_trace_use_cm_call,	"USE cm-cl") \
	EM(afs_server_trace_use_get_caps,	"USE gcaps") \
	EM(afs_server_trace_use_give_up_cb,	"USE gvupc") \
	E_(afs_server_trace_wait_create,	"WAIT crt ")

#define afs_volume_traces \
	EM(afs_volume_trace_alloc,		"ALLOC         ") \
@@ -1531,7 +1534,7 @@ TRACE_EVENT(afs_server,
		    __entry->reason = reason;
			   ),

	    TP_printk("s=%08x %s u=%d a=%d",
	    TP_printk("s=%08x %s r=%d a=%d",
		      __entry->server,
		      __print_symbolic(__entry->reason, afs_server_traces),
		      __entry->ref,