From: David Howells <dhowells@redhat.com>
To: netdev@vger.kernel.org
Cc: David Howells <dhowells@redhat.com>,
Marc Dionne <marc.dionne@auristor.com>,
Jakub Kicinski <kuba@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org,
Jeffrey Altman <jaltman@auristor.com>
Subject: [PATCH net v2 10/16] afs: Make afs_put_call() take trace argument
Date: Fri, 10 Jul 2026 20:22:12 +0100 [thread overview]
Message-ID: <20260710192220.1922433-11-dhowells@redhat.com> (raw)
In-Reply-To: <20260710192220.1922433-1-dhowells@redhat.com>
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 <jaltman@auristor.com>
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 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,
next prev parent reply other threads:[~2026-07-10 19:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-10 19:22 [PATCH net v2 00/16] rxrpc: Fix CHALLENGE packet handling David Howells
2026-07-10 19:22 ` [PATCH net v2 01/16] afs: Fix NULL deref in afs_deliver_cb_init_call_back_state3() David Howells
2026-07-10 19:22 ` [PATCH net v2 02/16] rxrpc: Fix sendmsg to not return an error if last packet queued David Howells
2026-07-10 19:22 ` [PATCH net v2 03/16] afs: Fix UAF when sending a message David Howells
2026-07-10 19:22 ` [PATCH net v2 04/16] afs: Fix two delivery functions to pass back -EAGAIN David Howells
2026-07-10 19:22 ` [PATCH net v2 05/16] afs: Fix afs_fs_fetch_data() to set call->async David Howells
2026-07-10 19:22 ` [PATCH net v2 06/16] rxrpc: Fix packet encryption error handling David Howells
2026-07-10 19:22 ` [PATCH net v2 07/16] rxrpc: Fix update of call->tx_pending without holding lock David Howells
2026-07-10 19:22 ` [PATCH net v2 08/16] rxrpc: Fix generation of notifications after call completion David Howells
2026-07-10 19:22 ` [PATCH net v2 09/16] afs: Simplify call refcounting David Howells
2026-07-10 19:22 ` David Howells [this message]
2026-07-10 19:22 ` [PATCH net v2 11/16] afs: Fix UAF in afs_make_call() David Howells
2026-07-10 19:22 ` [PATCH net v2 12/16] keys: Add refcounting to user-defined key type payload David Howells
2026-07-10 19:22 ` [PATCH net v2 13/16] afs: Create a server appdata key David Howells
2026-07-10 19:22 ` [PATCH net v2 14/16] rxrpc: Pass appdata key to rxrpc_call and thence to rxrpc_bundle David Howells
2026-07-10 19:22 ` [PATCH net v2 15/16] rxrpc: Fix CHALLENGE packet overqueuing and simplify RESPONSE generation David Howells
2026-07-10 19:22 ` [PATCH net v2 16/16] rxrpc: Remove OOB challenge/response code David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260710192220.1922433-11-dhowells@redhat.com \
--to=dhowells@redhat.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=jaltman@auristor.com \
--cc=kuba@kernel.org \
--cc=linux-afs@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.dionne@auristor.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox