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: David 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
This commit is contained in:
+2
-2
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user