[PATCH net v3 08/14] afs: Make afs_put_call() take trace argument
From: David Howells <dhowells@redhat.com>
Date: 2026-07-13 08:11:12
Also in:
lkml
Subsystem:
afs filesystem, filesystems (vfs and infrastructure), the rest, tracing · Maintainers:
David Howells, Marc Dionne, Alexander Viro, Christian Brauner, Linus Torvalds, Steven Rostedt, Masami Hiramatsu
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@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeffrey Altman <redacted> cc: Eric Dumazet <edumazet@google.com> cc: "David S. Miller" <davem@davemloft.net> cc: Jakub Kicinski <kuba@kernel.org> cc: Paolo Abeni <pabeni@redhat.com> cc: Simon Horman <horms@kernel.org> cc: linux-afs@lists.infradead.org --- 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 20801b29521d..b887047398b9 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 e55363f1d5ab..4901d0acbe14 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h@@ -1379,7 +1379,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);
@@ -1400,8 +1400,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; }
@@ -1410,8 +1409,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,