[PATCH net v2 10/16] afs: Make afs_put_call() take trace argument
From: David Howells
Date: Fri Jul 10 2026 - 15:27:17 EST
Make afs_put_call() take trace argument to display in the afs_call trace
line and stop showing the function return address (which isn't unique due
to inlining and tail-calling).
Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
cc: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
cc: Jeffrey Altman <jaltman@xxxxxxxxxxxx>
cc: Eric Dumazet <edumazet@xxxxxxxxxx>
cc: "David S. Miller" <davem@xxxxxxxxxxxxx>
cc: Jakub Kicinski <kuba@xxxxxxxxxx>
cc: Paolo Abeni <pabeni@xxxxxxxxxx>
cc: Simon Horman <horms@xxxxxxxxxx>
cc: linux-afs@xxxxxxxxxxxxxxxxxxx
---
fs/afs/file.c | 4 ++--
fs/afs/fs_operation.c | 2 +-
fs/afs/fsclient.c | 4 ++--
fs/afs/internal.h | 8 +++-----
fs/afs/rxrpc.c | 39 ++++++++++++++------------------------
fs/afs/vl_probe.c | 2 +-
fs/afs/vlclient.c | 8 ++++----
include/trace/events/afs.h | 38 +++++++++++++++++++++----------------
8 files changed, 49 insertions(+), 56 deletions(-)
diff --git a/fs/afs/file.c b/fs/afs/file.c
index 35d68f7f498d..625dc67f79f3 100644
--- a/fs/afs/file.c
+++ b/fs/afs/file.c
@@ -298,7 +298,7 @@ static void afs_read_receive(struct afs_call *call)
op->call_responded = call->responded;
op->call = NULL;
call->op = NULL;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_read_op);
/* If the call failed, then we need to crank the server rotation
* handle and try the next.
@@ -319,7 +319,7 @@ void afs_fetch_data_async_rx(struct work_struct *work)
if (call->state == AFS_CALL_COMPLETE) {
cancel_work(&call->async_work);
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_read_complete);
}
}
diff --git a/fs/afs/fs_operation.c b/fs/afs/fs_operation.c
index c0dbbc6d3716..9ea9db256a41 100644
--- a/fs/afs/fs_operation.c
+++ b/fs/afs/fs_operation.c
@@ -296,7 +296,7 @@ void afs_wait_for_operation(struct afs_operation *op)
op->call_abort_code = op->call->abort_code;
op->call_error = op->call->error;
op->call_responded = op->call->responded;
- afs_put_call(op->call);
+ afs_put_call(op->call, afs_call_trace_put_wait_op);
}
}
diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c
index 626e1d37b915..9acad5017fba 100644
--- a/fs/afs/fsclient.c
+++ b/fs/afs/fsclient.c
@@ -1662,7 +1662,7 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net, struct afs_server *server,
ret = call->error;
if (call->responded)
set_bit(AFS_SERVER_FL_RESPONDING, &server->flags);
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_giveupcallbacks);
return ret;
}
@@ -1778,7 +1778,7 @@ bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
trace_afs_make_fs_call(call, NULL);
afs_make_call(call, GFP_NOFS);
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_get_capabilities);
return true;
}
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index cd00956bc4cf..7b68cf141bf9 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -1380,7 +1380,7 @@ extern struct workqueue_struct *afs_async_calls;
extern int __net_init afs_open_socket(struct afs_net *);
extern void __net_exit afs_close_socket(struct afs_net *);
extern void afs_charge_preallocation(struct work_struct *);
-extern void afs_put_call(struct afs_call *);
+void afs_put_call(struct afs_call *call, enum afs_call_trace trace);
void afs_make_call(struct afs_call *call, gfp_t gfp);
void afs_deliver_to_call(struct afs_call *call);
void afs_wait_for_call_to_complete(struct afs_call *call);
@@ -1401,8 +1401,7 @@ static inline struct afs_call *afs_get_call(struct afs_call *call,
__refcount_inc(&call->ref, &r);
trace_afs_call(call->debug_id, why, r + 1,
- atomic_read(&call->net->nr_outstanding_calls),
- __builtin_return_address(0));
+ atomic_read(&call->net->nr_outstanding_calls));
return call;
}
@@ -1411,8 +1410,7 @@ static inline void afs_see_call(struct afs_call *call, enum afs_call_trace why)
int r = refcount_read(&call->ref);
trace_afs_call(call->debug_id, why, r,
- atomic_read(&call->net->nr_outstanding_calls),
- __builtin_return_address(0));
+ atomic_read(&call->net->nr_outstanding_calls));
}
static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
index a404b6f0cc7c..a1b9ced4e0f4 100644
--- a/fs/afs/rxrpc.c
+++ b/fs/afs/rxrpc.c
@@ -138,7 +138,7 @@ void afs_close_socket(struct afs_net *net)
cancel_work_sync(&net->charge_preallocation_work);
if (net->spare_incoming_call) {
- afs_put_call(net->spare_incoming_call);
+ afs_put_call(net->spare_incoming_call, afs_call_trace_put_spare_svc);
net->spare_incoming_call = NULL;
}
@@ -183,14 +183,14 @@ static struct afs_call *afs_alloc_call(struct afs_net *net,
call->iter = &call->def_iter;
o = atomic_inc_return(&net->nr_outstanding_calls);
- trace_afs_call(call->debug_id, afs_call_trace_alloc, 1, o,
- __builtin_return_address(0));
+ trace_afs_call(call->debug_id, afs_call_trace_alloc, 1, o);
return call;
}
static void afs_free_call(struct afs_call *call)
{
struct afs_net *net = call->net;
+ unsigned int debug_id = call->debug_id;
int o;
ASSERT(!work_pending(&call->async_work));
@@ -207,13 +207,10 @@ static void afs_free_call(struct afs_call *call)
afs_unuse_server_notime(call->net, call->server, afs_server_trace_unuse_call);
kfree(call->request);
-
- o = atomic_read(&net->nr_outstanding_calls);
- trace_afs_call(call->debug_id, afs_call_trace_free, 0, o,
- __builtin_return_address(0));
kfree(call);
o = atomic_dec_return(&net->nr_outstanding_calls);
+ trace_afs_call(debug_id, afs_call_trace_free, 0, o);
if (o == 0)
wake_up_var(&net->nr_outstanding_calls);
}
@@ -221,7 +218,7 @@ static void afs_free_call(struct afs_call *call)
/*
* Dispose of a reference on a call.
*/
-void afs_put_call(struct afs_call *call)
+void afs_put_call(struct afs_call *call, enum afs_call_trace trace)
{
struct afs_net *net = call->net;
unsigned int debug_id = call->debug_id;
@@ -230,8 +227,7 @@ void afs_put_call(struct afs_call *call)
zero = __refcount_dec_and_test(&call->ref, &r);
o = atomic_read(&net->nr_outstanding_calls);
- trace_afs_call(debug_id, afs_call_trace_put, r - 1, o,
- __builtin_return_address(0));
+ trace_afs_call(debug_id, trace, r - 1, o);
if (zero)
afs_free_call(call);
}
@@ -276,7 +272,7 @@ struct afs_call *afs_alloc_flat_call(struct afs_net *net,
return call;
nomem_free:
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_oom);
nomem_call:
return NULL;
}
@@ -344,7 +340,7 @@ void afs_make_call(struct afs_call *call, gfp_t gfp)
* the call to hold itself so the caller need not hang on to its ref.
*/
if (call->async)
- afs_get_call(call, afs_call_trace_get);
+ afs_get_call(call, afs_call_trace_get_make_async_call);
/* create a call */
rxcall = rxrpc_kernel_begin_call(call->net->socket, call->peer, call->key,
@@ -418,7 +414,7 @@ void afs_make_call(struct afs_call *call, gfp_t gfp)
RX_USER_ABORT, ret,
afs_abort_send_data_error);
if (call->async) {
- afs_see_call(call, afs_call_trace_async_abort);
+ afs_see_call(call, afs_call_trace_see_async_abort);
return;
}
@@ -434,7 +430,7 @@ void afs_make_call(struct afs_call *call, gfp_t gfp)
trace_afs_call_done(call);
error_kill_call:
if (call->async)
- afs_see_call(call, afs_call_trace_async_kill);
+ afs_see_call(call, afs_call_trace_see_async_kill);
if (call->type->immediate_cancel)
call->type->immediate_cancel(call);
@@ -675,11 +671,7 @@ static void afs_wake_up_async_call(struct sock *sk, struct rxrpc_call *rxcall,
trace_afs_notify_call(rxcall, call);
call->need_attention = true;
- trace_afs_call(call->debug_id, afs_call_trace_wake,
- refcount_read(&call->ref),
- atomic_read(&call->net->nr_outstanding_calls),
- __builtin_return_address(0));
-
+ afs_see_call(call, afs_call_trace_see_async_wake);
queue_work(afs_async_calls, &call->async_work);
}
@@ -693,10 +685,7 @@ static void afs_process_async_call(struct work_struct *work)
_enter("");
- trace_afs_call(call->debug_id, afs_call_trace_async_process,
- refcount_read(&call->ref),
- atomic_read(&call->net->nr_outstanding_calls),
- __builtin_return_address(0));
+ afs_see_call(call, afs_call_trace_see_async_process);
if (call->state < AFS_CALL_COMPLETE && call->need_attention) {
call->need_attention = false;
@@ -705,7 +694,7 @@ static void afs_process_async_call(struct work_struct *work)
if (call->state == AFS_CALL_COMPLETE) {
cancel_work(&call->async_work);
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_async_complete);
}
_leave("");
}
@@ -758,7 +747,7 @@ static void afs_rx_discard_new_call(struct rxrpc_call *rxcall,
struct afs_call *call = (struct afs_call *)user_call_ID;
call->rxcall = NULL;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_discard_prealloc);
}
/*
diff --git a/fs/afs/vl_probe.c b/fs/afs/vl_probe.c
index 3d2e0c925460..1d70887c9f31 100644
--- a/fs/afs/vl_probe.c
+++ b/fs/afs/vl_probe.c
@@ -186,7 +186,7 @@ static bool afs_do_probe_vlserver(struct afs_net *net,
server_index);
if (!IS_ERR(call)) {
afs_prioritise_error(_e, call->error, call->abort_code);
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_vl_get_caps);
in_progress = true;
} else {
afs_prioritise_error(_e, PTR_ERR(call), 0);
diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c
index a40b43464cfa..8a4c8c9a1e39 100644
--- a/fs/afs/vlclient.c
+++ b/fs/afs/vlclient.c
@@ -153,7 +153,7 @@ struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_vl_cursor *vc,
vc->call_abort_code = call->abort_code;
vc->call_error = call->error;
vc->call_responded = call->responded;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_vl_call);
if (vc->call_error) {
kfree(entry);
return ERR_PTR(vc->call_error);
@@ -303,7 +303,7 @@ struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_cursor *vc,
vc->call_error = call->error;
vc->call_responded = call->responded;
alist = call->ret_alist;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_vl_call);
if (vc->call_error) {
afs_put_addrlist(alist, afs_alist_trace_put_getaddru);
return ERR_PTR(vc->call_error);
@@ -666,7 +666,7 @@ struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *vc,
vc->call_error = call->error;
vc->call_responded = call->responded;
alist = call->ret_alist;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_vl_call);
if (vc->call_error) {
afs_put_addrlist(alist, afs_alist_trace_put_getaddru);
return ERR_PTR(vc->call_error);
@@ -784,7 +784,7 @@ char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *vc)
vc->call_error = call->error;
vc->call_responded = call->responded;
cellname = call->ret_str;
- afs_put_call(call);
+ afs_put_call(call, afs_call_trace_put_vl_call);
if (vc->call_error) {
kfree(cellname);
return ERR_PTR(vc->call_error);
diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h
index 4f18a2a5b9f6..df397c11df85 100644
--- a/include/trace/events/afs.h
+++ b/include/trace/events/afs.h
@@ -120,15 +120,24 @@ enum yfs_cm_operation {
* Declare tracing information enums and their string mappings for display.
*/
#define afs_call_traces \
- EM(afs_call_trace_alloc, "ALLOC") \
- EM(afs_call_trace_async_abort, "ASYAB") \
- EM(afs_call_trace_async_kill, "ASYKL") \
- EM(afs_call_trace_async_process, "ASYPR") \
- EM(afs_call_trace_free, "FREE ") \
- EM(afs_call_trace_get, "GET ") \
- EM(afs_call_trace_put, "PUT ") \
- EM(afs_call_trace_wake, "WAKE ") \
- E_(afs_call_trace_work, "QUEUE")
+ EM(afs_call_trace_alloc, "ALLOC ") \
+ EM(afs_call_trace_free, "FREE ") \
+ EM(afs_call_trace_get_make_async_call, "GET a-make ") \
+ EM(afs_call_trace_put_async_complete, "PUT a-cmpl ") \
+ EM(afs_call_trace_put_discard_prealloc, "PUT dis-pre") \
+ EM(afs_call_trace_put_get_capabilities, "PUT get-cap") \
+ EM(afs_call_trace_put_giveupcallbacks, "PUT gvup-cb") \
+ EM(afs_call_trace_put_oom, "PUT oom ") \
+ EM(afs_call_trace_put_read_complete, "PUT rd-cpl ") \
+ EM(afs_call_trace_put_read_op, "PUT rd-op ") \
+ EM(afs_call_trace_put_spare_svc, "PUT spare-s") \
+ EM(afs_call_trace_put_vl_call, "PUT vl-call") \
+ EM(afs_call_trace_put_vl_get_caps, "PUT vl-gcap") \
+ EM(afs_call_trace_put_wait_op, "PUT wt-op ") \
+ EM(afs_call_trace_see_async_abort, "SEE a-abort") \
+ EM(afs_call_trace_see_async_kill, "SEE a-kill ") \
+ EM(afs_call_trace_see_async_process, "SEE a-proc ") \
+ E_(afs_call_trace_see_async_wake, "SEE a-wake ")
#define afs_server_traces \
EM(afs_server_trace_callback, "CALLBACK ") \
@@ -694,16 +703,15 @@ TRACE_EVENT(afs_cb_call,
TRACE_EVENT(afs_call,
TP_PROTO(unsigned int call_debug_id, enum afs_call_trace op,
- int ref, int outstanding, const void *where),
+ int ref, int outstanding),
- TP_ARGS(call_debug_id, op, ref, outstanding, where),
+ TP_ARGS(call_debug_id, op, ref, outstanding),
TP_STRUCT__entry(
__field(unsigned int, call)
__field(int, op)
__field(int, ref)
__field(int, outstanding)
- __field(const void *, where)
),
TP_fast_assign(
@@ -711,15 +719,13 @@ TRACE_EVENT(afs_call,
__entry->op = op;
__entry->ref = ref;
__entry->outstanding = outstanding;
- __entry->where = where;
),
- TP_printk("c=%08x %s r=%d o=%d sp=%pSR",
+ TP_printk("c=%08x %s r=%d o=%d",
__entry->call,
__print_symbolic(__entry->op, afs_call_traces),
__entry->ref,
- __entry->outstanding,
- __entry->where)
+ __entry->outstanding)
);
TRACE_EVENT(afs_make_fs_call,