Commit cb0fc0c9 authored by David Howells's avatar David Howells

rxrpc: trace: Don't use __builtin_return_address for rxrpc_call tracing

In rxrpc tracing, use enums to generate lists of points of interest rather
than __builtin_return_address() for the rxrpc_call tracepoint
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
parent 7fa25105
...@@ -127,26 +127,44 @@ ...@@ -127,26 +127,44 @@
E_(rxrpc_client_to_idle, "->Idle") E_(rxrpc_client_to_idle, "->Idle")
#define rxrpc_call_traces \ #define rxrpc_call_traces \
EM(rxrpc_call_connected, "CON") \ EM(rxrpc_call_get_input, "GET input ") \
EM(rxrpc_call_error, "*E*") \ EM(rxrpc_call_get_kernel_service, "GET krnl-srv") \
EM(rxrpc_call_got, "GOT") \ EM(rxrpc_call_get_notify_socket, "GET notify ") \
EM(rxrpc_call_got_kernel, "Gke") \ EM(rxrpc_call_get_recvmsg, "GET recvmsg ") \
EM(rxrpc_call_got_timer, "GTM") \ EM(rxrpc_call_get_release_sock, "GET rel-sock") \
EM(rxrpc_call_got_tx, "Gtx") \ EM(rxrpc_call_get_sendmsg, "GET sendmsg ") \
EM(rxrpc_call_got_userid, "Gus") \ EM(rxrpc_call_get_send_ack, "GET send-ack") \
EM(rxrpc_call_new_client, "NWc") \ EM(rxrpc_call_get_timer, "GET timer ") \
EM(rxrpc_call_new_service, "NWs") \ EM(rxrpc_call_get_userid, "GET user-id ") \
EM(rxrpc_call_put, "PUT") \ EM(rxrpc_call_new_client, "NEW client ") \
EM(rxrpc_call_put_kernel, "Pke") \ EM(rxrpc_call_new_prealloc_service, "NEW prealloc") \
EM(rxrpc_call_put_noqueue, "PnQ") \ EM(rxrpc_call_put_already_queued, "PUT alreadyq") \
EM(rxrpc_call_put_notimer, "PnT") \ EM(rxrpc_call_put_discard_prealloc, "PUT disc-pre") \
EM(rxrpc_call_put_timer, "PTM") \ EM(rxrpc_call_put_input, "PUT input ") \
EM(rxrpc_call_put_tx, "Ptx") \ EM(rxrpc_call_put_kernel, "PUT kernel ") \
EM(rxrpc_call_put_userid, "Pus") \ EM(rxrpc_call_put_recvmsg, "PUT recvmsg ") \
EM(rxrpc_call_queued, "QUE") \ EM(rxrpc_call_put_release_sock, "PUT rls-sock") \
EM(rxrpc_call_queued_ref, "QUR") \ EM(rxrpc_call_put_release_sock_tba, "PUT rls-sk-a") \
EM(rxrpc_call_release, "RLS") \ EM(rxrpc_call_put_send_ack, "PUT send-ack") \
E_(rxrpc_call_seen, "SEE") EM(rxrpc_call_put_sendmsg, "PUT sendmsg ") \
EM(rxrpc_call_put_timer, "PUT timer ") \
EM(rxrpc_call_put_timer_already, "PUT timer-al") \
EM(rxrpc_call_put_unnotify, "PUT unnotify") \
EM(rxrpc_call_put_userid_exists, "PUT u-exists") \
EM(rxrpc_call_put_work, "PUT work ") \
EM(rxrpc_call_queue_abort, "QUE abort ") \
EM(rxrpc_call_queue_requeue, "QUE requeue ") \
EM(rxrpc_call_queue_resend, "QUE resend ") \
EM(rxrpc_call_queue_timer, "QUE timer ") \
EM(rxrpc_call_see_accept, "SEE accept ") \
EM(rxrpc_call_see_activate_client, "SEE act-clnt") \
EM(rxrpc_call_see_connect_failed, "SEE con-fail") \
EM(rxrpc_call_see_connected, "SEE connect ") \
EM(rxrpc_call_see_distribute_error, "SEE dist-err") \
EM(rxrpc_call_see_input, "SEE input ") \
EM(rxrpc_call_see_release, "SEE release ") \
EM(rxrpc_call_see_userid_exists, "SEE u-exists") \
E_(rxrpc_call_see_zap, "SEE zap ")
#define rxrpc_txqueue_traces \ #define rxrpc_txqueue_traces \
EM(rxrpc_txqueue_await_reply, "AWR") \ EM(rxrpc_txqueue_await_reply, "AWR") \
...@@ -503,32 +521,29 @@ TRACE_EVENT(rxrpc_client, ...@@ -503,32 +521,29 @@ TRACE_EVENT(rxrpc_client,
); );
TRACE_EVENT(rxrpc_call, TRACE_EVENT(rxrpc_call,
TP_PROTO(unsigned int call_debug_id, enum rxrpc_call_trace op, TP_PROTO(unsigned int call_debug_id, int ref, unsigned long aux,
int usage, const void *where, const void *aux), enum rxrpc_call_trace why),
TP_ARGS(call_debug_id, op, usage, where, aux), TP_ARGS(call_debug_id, ref, aux, why),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, call ) __field(unsigned int, call )
__field(int, op ) __field(int, ref )
__field(int, usage ) __field(int, why )
__field(const void *, where ) __field(unsigned long, aux )
__field(const void *, aux )
), ),
TP_fast_assign( TP_fast_assign(
__entry->call = call_debug_id; __entry->call = call_debug_id;
__entry->op = op; __entry->ref = ref;
__entry->usage = usage; __entry->why = why;
__entry->where = where;
__entry->aux = aux; __entry->aux = aux;
), ),
TP_printk("c=%08x %s u=%d sp=%pSR a=%p", TP_printk("c=%08x %s r=%d a=%lx",
__entry->call, __entry->call,
__print_symbolic(__entry->op, rxrpc_call_traces), __print_symbolic(__entry->why, rxrpc_call_traces),
__entry->usage, __entry->ref,
__entry->where,
__entry->aux) __entry->aux)
); );
......
...@@ -847,10 +847,10 @@ void rxrpc_incoming_call(struct rxrpc_sock *, struct rxrpc_call *, ...@@ -847,10 +847,10 @@ void rxrpc_incoming_call(struct rxrpc_sock *, struct rxrpc_call *,
struct sk_buff *); struct sk_buff *);
void rxrpc_release_call(struct rxrpc_sock *, struct rxrpc_call *); void rxrpc_release_call(struct rxrpc_sock *, struct rxrpc_call *);
void rxrpc_release_calls_on_socket(struct rxrpc_sock *); void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
bool __rxrpc_queue_call(struct rxrpc_call *); bool __rxrpc_queue_call(struct rxrpc_call *, enum rxrpc_call_trace);
bool rxrpc_queue_call(struct rxrpc_call *); bool rxrpc_queue_call(struct rxrpc_call *, enum rxrpc_call_trace);
void rxrpc_see_call(struct rxrpc_call *); void rxrpc_see_call(struct rxrpc_call *, enum rxrpc_call_trace);
bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op); bool rxrpc_try_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace); void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace); void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace);
void rxrpc_cleanup_call(struct rxrpc_call *); void rxrpc_cleanup_call(struct rxrpc_call *);
......
...@@ -38,7 +38,6 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx, ...@@ -38,7 +38,6 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx,
unsigned long user_call_ID, gfp_t gfp, unsigned long user_call_ID, gfp_t gfp,
unsigned int debug_id) unsigned int debug_id)
{ {
const void *here = __builtin_return_address(0);
struct rxrpc_call *call, *xcall; struct rxrpc_call *call, *xcall;
struct rxrpc_net *rxnet = rxrpc_net(sock_net(&rx->sk)); struct rxrpc_net *rxnet = rxrpc_net(sock_net(&rx->sk));
struct rb_node *parent, **pp; struct rb_node *parent, **pp;
...@@ -102,9 +101,8 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx, ...@@ -102,9 +101,8 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx,
call->flags |= (1 << RXRPC_CALL_IS_SERVICE); call->flags |= (1 << RXRPC_CALL_IS_SERVICE);
call->state = RXRPC_CALL_SERVER_PREALLOC; call->state = RXRPC_CALL_SERVER_PREALLOC;
trace_rxrpc_call(call->debug_id, rxrpc_call_new_service, trace_rxrpc_call(call->debug_id, refcount_read(&call->ref),
refcount_read(&call->ref), user_call_ID, rxrpc_call_new_prealloc_service);
here, (const void *)user_call_ID);
write_lock(&rx->call_lock); write_lock(&rx->call_lock);
...@@ -125,11 +123,11 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx, ...@@ -125,11 +123,11 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx,
call->user_call_ID = user_call_ID; call->user_call_ID = user_call_ID;
call->notify_rx = notify_rx; call->notify_rx = notify_rx;
if (user_attach_call) { if (user_attach_call) {
rxrpc_get_call(call, rxrpc_call_got_kernel); rxrpc_get_call(call, rxrpc_call_get_kernel_service);
user_attach_call(call, user_call_ID); user_attach_call(call, user_call_ID);
} }
rxrpc_get_call(call, rxrpc_call_got_userid); rxrpc_get_call(call, rxrpc_call_get_userid);
rb_link_node(&call->sock_node, parent, pp); rb_link_node(&call->sock_node, parent, pp);
rb_insert_color(&call->sock_node, &rx->calls); rb_insert_color(&call->sock_node, &rx->calls);
set_bit(RXRPC_CALL_HAS_USERID, &call->flags); set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
...@@ -229,7 +227,7 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx) ...@@ -229,7 +227,7 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx)
} }
rxrpc_call_completed(call); rxrpc_call_completed(call);
rxrpc_release_call(rx, call); rxrpc_release_call(rx, call);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_discard_prealloc);
tail = (tail + 1) & (size - 1); tail = (tail + 1) & (size - 1);
} }
...@@ -318,7 +316,7 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx, ...@@ -318,7 +316,7 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx,
smp_store_release(&b->call_backlog_tail, smp_store_release(&b->call_backlog_tail,
(call_tail + 1) & (RXRPC_BACKLOG_MAX - 1)); (call_tail + 1) & (RXRPC_BACKLOG_MAX - 1));
rxrpc_see_call(call); rxrpc_see_call(call, rxrpc_call_see_accept);
call->conn = conn; call->conn = conn;
call->security = conn->security; call->security = conn->security;
call->security_ix = conn->security_ix; call->security_ix = conn->security_ix;
...@@ -430,7 +428,7 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, ...@@ -430,7 +428,7 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
* (recvmsg queue, to-be-accepted queue or user ID tree) or the kernel * (recvmsg queue, to-be-accepted queue or user ID tree) or the kernel
* service to prevent the call from being deallocated too early. * service to prevent the call from being deallocated too early.
*/ */
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_discard_prealloc);
_leave(" = %p{%d}", call, call->debug_id); _leave(" = %p{%d}", call, call->debug_id);
return call; return call;
......
...@@ -101,7 +101,7 @@ void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason, ...@@ -101,7 +101,7 @@ void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason,
txb->ack.reason = ack_reason; txb->ack.reason = ack_reason;
txb->ack.nAcks = 0; txb->ack.nAcks = 0;
if (!rxrpc_try_get_call(call, rxrpc_call_got)) { if (!rxrpc_try_get_call(call, rxrpc_call_get_send_ack)) {
rxrpc_put_txbuf(txb, rxrpc_txbuf_put_nomem); rxrpc_put_txbuf(txb, rxrpc_txbuf_put_nomem);
return; return;
} }
...@@ -302,7 +302,7 @@ void rxrpc_process_call(struct work_struct *work) ...@@ -302,7 +302,7 @@ void rxrpc_process_call(struct work_struct *work)
unsigned int iterations = 0; unsigned int iterations = 0;
rxrpc_serial_t ackr_serial; rxrpc_serial_t ackr_serial;
rxrpc_see_call(call); rxrpc_see_call(call, rxrpc_call_see_input);
//printk("\n--------------------\n"); //printk("\n--------------------\n");
_enter("{%d,%s,%lx}", _enter("{%d,%s,%lx}",
...@@ -436,12 +436,12 @@ void rxrpc_process_call(struct work_struct *work) ...@@ -436,12 +436,12 @@ void rxrpc_process_call(struct work_struct *work)
goto requeue; goto requeue;
out_put: out_put:
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_work);
out: out:
_leave(""); _leave("");
return; return;
requeue: requeue:
__rxrpc_queue_call(call); __rxrpc_queue_call(call, rxrpc_call_queue_requeue);
goto out; goto out;
} }
...@@ -53,9 +53,9 @@ static void rxrpc_call_timer_expired(struct timer_list *t) ...@@ -53,9 +53,9 @@ static void rxrpc_call_timer_expired(struct timer_list *t)
if (call->state < RXRPC_CALL_COMPLETE) { if (call->state < RXRPC_CALL_COMPLETE) {
trace_rxrpc_timer_expired(call, jiffies); trace_rxrpc_timer_expired(call, jiffies);
__rxrpc_queue_call(call); __rxrpc_queue_call(call, rxrpc_call_queue_timer);
} else { } else {
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_already_queued);
} }
} }
...@@ -64,10 +64,10 @@ void rxrpc_reduce_call_timer(struct rxrpc_call *call, ...@@ -64,10 +64,10 @@ void rxrpc_reduce_call_timer(struct rxrpc_call *call,
unsigned long now, unsigned long now,
enum rxrpc_timer_trace why) enum rxrpc_timer_trace why)
{ {
if (rxrpc_try_get_call(call, rxrpc_call_got_timer)) { if (rxrpc_try_get_call(call, rxrpc_call_get_timer)) {
trace_rxrpc_timer(call, why, now); trace_rxrpc_timer(call, why, now);
if (timer_reduce(&call->timer, expire_at)) if (timer_reduce(&call->timer, expire_at))
rxrpc_put_call(call, rxrpc_call_put_notimer); rxrpc_put_call(call, rxrpc_call_put_timer_already);
} }
} }
...@@ -110,7 +110,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx, ...@@ -110,7 +110,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
return NULL; return NULL;
found_extant_call: found_extant_call:
rxrpc_get_call(call, rxrpc_call_got); rxrpc_get_call(call, rxrpc_call_get_sendmsg);
read_unlock(&rx->call_lock); read_unlock(&rx->call_lock);
_leave(" = %p [%d]", call, refcount_read(&call->ref)); _leave(" = %p [%d]", call, refcount_read(&call->ref));
return call; return call;
...@@ -270,7 +270,6 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -270,7 +270,6 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
struct rxrpc_net *rxnet; struct rxrpc_net *rxnet;
struct semaphore *limiter; struct semaphore *limiter;
struct rb_node *parent, **pp; struct rb_node *parent, **pp;
const void *here = __builtin_return_address(0);
int ret; int ret;
_enter("%p,%lx", rx, p->user_call_ID); _enter("%p,%lx", rx, p->user_call_ID);
...@@ -291,9 +290,8 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -291,9 +290,8 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
call->interruptibility = p->interruptibility; call->interruptibility = p->interruptibility;
call->tx_total_len = p->tx_total_len; call->tx_total_len = p->tx_total_len;
trace_rxrpc_call(call->debug_id, rxrpc_call_new_client, trace_rxrpc_call(call->debug_id, refcount_read(&call->ref),
refcount_read(&call->ref), p->user_call_ID, rxrpc_call_new_client);
here, (const void *)p->user_call_ID);
if (p->kernel) if (p->kernel)
__set_bit(RXRPC_CALL_KERNEL, &call->flags); __set_bit(RXRPC_CALL_KERNEL, &call->flags);
...@@ -322,7 +320,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -322,7 +320,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
rcu_assign_pointer(call->socket, rx); rcu_assign_pointer(call->socket, rx);
call->user_call_ID = p->user_call_ID; call->user_call_ID = p->user_call_ID;
__set_bit(RXRPC_CALL_HAS_USERID, &call->flags); __set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
rxrpc_get_call(call, rxrpc_call_got_userid); rxrpc_get_call(call, rxrpc_call_get_userid);
rb_link_node(&call->sock_node, parent, pp); rb_link_node(&call->sock_node, parent, pp);
rb_insert_color(&call->sock_node, &rx->calls); rb_insert_color(&call->sock_node, &rx->calls);
list_add(&call->sock_link, &rx->sock_calls); list_add(&call->sock_link, &rx->sock_calls);
...@@ -344,8 +342,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -344,8 +342,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
if (ret < 0) if (ret < 0)
goto error_attached_to_socket; goto error_attached_to_socket;
trace_rxrpc_call(call->debug_id, rxrpc_call_connected, rxrpc_see_call(call, rxrpc_call_see_connected);
refcount_read(&call->ref), here, NULL);
rxrpc_start_call_timer(call); rxrpc_start_call_timer(call);
...@@ -362,11 +359,11 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -362,11 +359,11 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
release_sock(&rx->sk); release_sock(&rx->sk);
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, __rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
RX_CALL_DEAD, -EEXIST); RX_CALL_DEAD, -EEXIST);
trace_rxrpc_call(call->debug_id, rxrpc_call_error, trace_rxrpc_call(call->debug_id, refcount_read(&call->ref), 0,
refcount_read(&call->ref), here, ERR_PTR(-EEXIST)); rxrpc_call_see_userid_exists);
rxrpc_release_call(rx, call); rxrpc_release_call(rx, call);
mutex_unlock(&call->user_mutex); mutex_unlock(&call->user_mutex);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_userid_exists);
_leave(" = -EEXIST"); _leave(" = -EEXIST");
return ERR_PTR(-EEXIST); return ERR_PTR(-EEXIST);
...@@ -376,8 +373,8 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, ...@@ -376,8 +373,8 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
* leave the error to recvmsg() to deal with. * leave the error to recvmsg() to deal with.
*/ */
error_attached_to_socket: error_attached_to_socket:
trace_rxrpc_call(call->debug_id, rxrpc_call_error, trace_rxrpc_call(call->debug_id, refcount_read(&call->ref), ret,
refcount_read(&call->ref), here, ERR_PTR(ret)); rxrpc_call_see_connect_failed);
set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, __rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
RX_CALL_DEAD, ret); RX_CALL_DEAD, ret);
...@@ -428,72 +425,65 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx, ...@@ -428,72 +425,65 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
/* /*
* Queue a call's work processor, getting a ref to pass to the work queue. * Queue a call's work processor, getting a ref to pass to the work queue.
*/ */
bool rxrpc_queue_call(struct rxrpc_call *call) bool rxrpc_queue_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
const void *here = __builtin_return_address(0);
int n; int n;
if (!__refcount_inc_not_zero(&call->ref, &n)) if (!__refcount_inc_not_zero(&call->ref, &n))
return false; return false;
if (rxrpc_queue_work(&call->processor)) if (rxrpc_queue_work(&call->processor))
trace_rxrpc_call(call->debug_id, rxrpc_call_queued, n + 1, trace_rxrpc_call(call->debug_id, n + 1, 0, why);
here, NULL);
else else
rxrpc_put_call(call, rxrpc_call_put_noqueue); rxrpc_put_call(call, rxrpc_call_put_already_queued);
return true; return true;
} }
/* /*
* Queue a call's work processor, passing the callers ref to the work queue. * Queue a call's work processor, passing the callers ref to the work queue.
*/ */
bool __rxrpc_queue_call(struct rxrpc_call *call) bool __rxrpc_queue_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
const void *here = __builtin_return_address(0);
int n = refcount_read(&call->ref); int n = refcount_read(&call->ref);
ASSERTCMP(n, >=, 1); ASSERTCMP(n, >=, 1);
if (rxrpc_queue_work(&call->processor)) if (rxrpc_queue_work(&call->processor))
trace_rxrpc_call(call->debug_id, rxrpc_call_queued_ref, n, trace_rxrpc_call(call->debug_id, n, 0, why);
here, NULL);
else else
rxrpc_put_call(call, rxrpc_call_put_noqueue); rxrpc_put_call(call, rxrpc_call_put_already_queued);
return true; return true;
} }
/* /*
* Note the re-emergence of a call. * Note the re-emergence of a call.
*/ */
void rxrpc_see_call(struct rxrpc_call *call) void rxrpc_see_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
const void *here = __builtin_return_address(0);
if (call) { if (call) {
int n = refcount_read(&call->ref); int r = refcount_read(&call->ref);
trace_rxrpc_call(call->debug_id, rxrpc_call_seen, n, trace_rxrpc_call(call->debug_id, r, 0, why);
here, NULL);
} }
} }
bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op) bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
const void *here = __builtin_return_address(0); int r;
int n;
if (!__refcount_inc_not_zero(&call->ref, &n)) if (!__refcount_inc_not_zero(&call->ref, &r))
return false; return false;
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL); trace_rxrpc_call(call->debug_id, r + 1, 0, why);
return true; return true;
} }
/* /*
* Note the addition of a ref on a call. * Note the addition of a ref on a call.
*/ */
void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op) void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
const void *here = __builtin_return_address(0); int r;
int n;
__refcount_inc(&call->ref, &n); __refcount_inc(&call->ref, &r);
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL); trace_rxrpc_call(call->debug_id, r + 1, 0, why);
} }
/* /*
...@@ -510,15 +500,13 @@ static void rxrpc_cleanup_ring(struct rxrpc_call *call) ...@@ -510,15 +500,13 @@ static void rxrpc_cleanup_ring(struct rxrpc_call *call)
*/ */
void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
{ {
const void *here = __builtin_return_address(0);
struct rxrpc_connection *conn = call->conn; struct rxrpc_connection *conn = call->conn;
bool put = false; bool put = false;
_enter("{%d,%d}", call->debug_id, refcount_read(&call->ref)); _enter("{%d,%d}", call->debug_id, refcount_read(&call->ref));
trace_rxrpc_call(call->debug_id, rxrpc_call_release, trace_rxrpc_call(call->debug_id, refcount_read(&call->ref),
refcount_read(&call->ref), call->flags, rxrpc_call_see_release);
here, (const void *)call->flags);
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE); ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
...@@ -544,14 +532,14 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) ...@@ -544,14 +532,14 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
write_unlock_bh(&rx->recvmsg_lock); write_unlock_bh(&rx->recvmsg_lock);
if (put) if (put)
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_unnotify);
write_lock(&rx->call_lock); write_lock(&rx->call_lock);
if (test_and_clear_bit(RXRPC_CALL_HAS_USERID, &call->flags)) { if (test_and_clear_bit(RXRPC_CALL_HAS_USERID, &call->flags)) {
rb_erase(&call->sock_node, &rx->calls); rb_erase(&call->sock_node, &rx->calls);
memset(&call->sock_node, 0xdd, sizeof(call->sock_node)); memset(&call->sock_node, 0xdd, sizeof(call->sock_node));
rxrpc_put_call(call, rxrpc_call_put_userid); rxrpc_put_call(call, rxrpc_call_put_userid_exists);
} }
list_del(&call->sock_link); list_del(&call->sock_link);
...@@ -580,17 +568,17 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx) ...@@ -580,17 +568,17 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)
struct rxrpc_call, accept_link); struct rxrpc_call, accept_link);
list_del(&call->accept_link); list_del(&call->accept_link);
rxrpc_abort_call("SKR", call, 0, RX_CALL_DEAD, -ECONNRESET); rxrpc_abort_call("SKR", call, 0, RX_CALL_DEAD, -ECONNRESET);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_release_sock_tba);
} }
while (!list_empty(&rx->sock_calls)) { while (!list_empty(&rx->sock_calls)) {
call = list_entry(rx->sock_calls.next, call = list_entry(rx->sock_calls.next,
struct rxrpc_call, sock_link); struct rxrpc_call, sock_link);
rxrpc_get_call(call, rxrpc_call_got); rxrpc_get_call(call, rxrpc_call_get_release_sock);
rxrpc_abort_call("SKT", call, 0, RX_CALL_DEAD, -ECONNRESET); rxrpc_abort_call("SKT", call, 0, RX_CALL_DEAD, -ECONNRESET);
rxrpc_send_abort_packet(call); rxrpc_send_abort_packet(call);
rxrpc_release_call(rx, call); rxrpc_release_call(rx, call);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_release_sock);
} }
_leave(""); _leave("");
...@@ -599,20 +587,18 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx) ...@@ -599,20 +587,18 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)
/* /*
* release a call * release a call
*/ */
void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace op) void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
{ {
struct rxrpc_net *rxnet = call->rxnet; struct rxrpc_net *rxnet = call->rxnet;
const void *here = __builtin_return_address(0);
unsigned int debug_id = call->debug_id; unsigned int debug_id = call->debug_id;
bool dead; bool dead;
int n; int r;
ASSERT(call != NULL); ASSERT(call != NULL);
dead = __refcount_dec_and_test(&call->ref, &n); dead = __refcount_dec_and_test(&call->ref, &r);
trace_rxrpc_call(debug_id, op, n, here, NULL); trace_rxrpc_call(debug_id, r - 1, 0, why);
if (dead) { if (dead) {
_debug("call %d dead", call->debug_id);
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE); ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
if (!list_empty(&call->link)) { if (!list_empty(&call->link)) {
...@@ -701,7 +687,7 @@ void rxrpc_destroy_all_calls(struct rxrpc_net *rxnet) ...@@ -701,7 +687,7 @@ void rxrpc_destroy_all_calls(struct rxrpc_net *rxnet)
struct rxrpc_call, link); struct rxrpc_call, link);
_debug("Zapping call %p", call); _debug("Zapping call %p", call);
rxrpc_see_call(call); rxrpc_see_call(call, rxrpc_call_see_zap);
list_del_init(&call->link); list_del_init(&call->link);
pr_err("Call %p still in use (%d,%s,%lx,%lx)!\n", pr_err("Call %p still in use (%d,%s,%lx,%lx)!\n",
......
...@@ -540,7 +540,7 @@ static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, ...@@ -540,7 +540,7 @@ static void rxrpc_activate_one_channel(struct rxrpc_connection *conn,
clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags);
clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); clear_bit(conn->bundle_shift + channel, &bundle->avail_chans);
rxrpc_see_call(call); rxrpc_see_call(call, rxrpc_call_see_activate_client);
list_del_init(&call->chan_wait_link); list_del_init(&call->chan_wait_link);
call->peer = rxrpc_get_peer(conn->peer, rxrpc_peer_get_activate_call); call->peer = rxrpc_get_peer(conn->peer, rxrpc_peer_get_activate_call);
call->conn = rxrpc_get_connection(conn, rxrpc_conn_get_activate_call); call->conn = rxrpc_get_connection(conn, rxrpc_conn_get_activate_call);
......
...@@ -14,7 +14,7 @@ static void rxrpc_proto_abort(const char *why, ...@@ -14,7 +14,7 @@ static void rxrpc_proto_abort(const char *why,
{ {
if (rxrpc_abort_call(why, call, seq, RX_PROTOCOL_ERROR, -EBADMSG)) { if (rxrpc_abort_call(why, call, seq, RX_PROTOCOL_ERROR, -EBADMSG)) {
set_bit(RXRPC_CALL_EV_ABORT, &call->events); set_bit(RXRPC_CALL_EV_ABORT, &call->events);
rxrpc_queue_call(call); rxrpc_queue_call(call, rxrpc_call_queue_abort);
} }
} }
...@@ -175,7 +175,7 @@ static void rxrpc_congestion_management(struct rxrpc_call *call, ...@@ -175,7 +175,7 @@ static void rxrpc_congestion_management(struct rxrpc_call *call,
call->cong_cumul_acks = cumulative_acks; call->cong_cumul_acks = cumulative_acks;
trace_rxrpc_congest(call, summary, acked_serial, change); trace_rxrpc_congest(call, summary, acked_serial, change);
if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events))
rxrpc_queue_call(call); rxrpc_queue_call(call, rxrpc_call_queue_resend);
return; return;
packet_loss_detected: packet_loss_detected:
...@@ -678,7 +678,7 @@ static void rxrpc_input_check_for_lost_ack(struct rxrpc_call *call) ...@@ -678,7 +678,7 @@ static void rxrpc_input_check_for_lost_ack(struct rxrpc_call *call)
{ {
if (after(call->acks_lost_top, call->acks_prev_seq) && if (after(call->acks_lost_top, call->acks_prev_seq) &&
!test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events))
rxrpc_queue_call(call); rxrpc_queue_call(call, rxrpc_call_queue_resend);
} }
/* /*
...@@ -1099,7 +1099,7 @@ static void rxrpc_input_implicit_end_call(struct rxrpc_sock *rx, ...@@ -1099,7 +1099,7 @@ static void rxrpc_input_implicit_end_call(struct rxrpc_sock *rx,
default: default:
if (rxrpc_abort_call("IMP", call, 0, RX_CALL_DEAD, -ESHUTDOWN)) { if (rxrpc_abort_call("IMP", call, 0, RX_CALL_DEAD, -ESHUTDOWN)) {
set_bit(RXRPC_CALL_EV_ABORT, &call->events); set_bit(RXRPC_CALL_EV_ABORT, &call->events);
rxrpc_queue_call(call); rxrpc_queue_call(call, rxrpc_call_queue_abort);
} }
trace_rxrpc_improper_term(call); trace_rxrpc_improper_term(call);
break; break;
......
...@@ -310,7 +310,7 @@ void rxrpc_transmit_ack_packets(struct rxrpc_local *local) ...@@ -310,7 +310,7 @@ void rxrpc_transmit_ack_packets(struct rxrpc_local *local)
} }
list_del_init(&txb->tx_link); list_del_init(&txb->tx_link);
rxrpc_put_call(txb->call, rxrpc_call_put); rxrpc_put_call(txb->call, rxrpc_call_put_send_ack);
rxrpc_put_txbuf(txb, rxrpc_txbuf_put_ack_tx); rxrpc_put_txbuf(txb, rxrpc_txbuf_put_ack_tx);
} }
} }
......
...@@ -238,7 +238,7 @@ static void rxrpc_distribute_error(struct rxrpc_peer *peer, int error, ...@@ -238,7 +238,7 @@ static void rxrpc_distribute_error(struct rxrpc_peer *peer, int error,
struct rxrpc_call *call; struct rxrpc_call *call;
hlist_for_each_entry_rcu(call, &peer->error_targets, error_link) { hlist_for_each_entry_rcu(call, &peer->error_targets, error_link) {
rxrpc_see_call(call); rxrpc_see_call(call, rxrpc_call_see_distribute_error);
rxrpc_set_call_completion(call, compl, 0, -error); rxrpc_set_call_completion(call, compl, 0, -error);
} }
} }
......
...@@ -42,7 +42,7 @@ void rxrpc_notify_socket(struct rxrpc_call *call) ...@@ -42,7 +42,7 @@ void rxrpc_notify_socket(struct rxrpc_call *call)
} else { } else {
write_lock_bh(&rx->recvmsg_lock); write_lock_bh(&rx->recvmsg_lock);
if (list_empty(&call->recvmsg_link)) { if (list_empty(&call->recvmsg_link)) {
rxrpc_get_call(call, rxrpc_call_got); rxrpc_get_call(call, rxrpc_call_get_notify_socket);
list_add_tail(&call->recvmsg_link, &rx->recvmsg_q); list_add_tail(&call->recvmsg_link, &rx->recvmsg_q);
} }
write_unlock_bh(&rx->recvmsg_lock); write_unlock_bh(&rx->recvmsg_lock);
...@@ -451,7 +451,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, ...@@ -451,7 +451,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (!(flags & MSG_PEEK)) if (!(flags & MSG_PEEK))
list_del_init(&call->recvmsg_link); list_del_init(&call->recvmsg_link);
else else
rxrpc_get_call(call, rxrpc_call_got); rxrpc_get_call(call, rxrpc_call_get_recvmsg);
write_unlock_bh(&rx->recvmsg_lock); write_unlock_bh(&rx->recvmsg_lock);
trace_rxrpc_recvmsg(call, rxrpc_recvmsg_dequeue, 0); trace_rxrpc_recvmsg(call, rxrpc_recvmsg_dequeue, 0);
...@@ -537,7 +537,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, ...@@ -537,7 +537,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
error_unlock_call: error_unlock_call:
mutex_unlock(&call->user_mutex); mutex_unlock(&call->user_mutex);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_recvmsg);
trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, ret); trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, ret);
return ret; return ret;
...@@ -548,7 +548,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, ...@@ -548,7 +548,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
write_unlock_bh(&rx->recvmsg_lock); write_unlock_bh(&rx->recvmsg_lock);
trace_rxrpc_recvmsg(call, rxrpc_recvmsg_requeue, 0); trace_rxrpc_recvmsg(call, rxrpc_recvmsg_requeue, 0);
} else { } else {
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_recvmsg);
} }
error_no_call: error_no_call:
release_sock(&rx->sk); release_sock(&rx->sk);
......
...@@ -667,7 +667,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) ...@@ -667,7 +667,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
case RXRPC_CALL_CLIENT_AWAIT_CONN: case RXRPC_CALL_CLIENT_AWAIT_CONN:
case RXRPC_CALL_SERVER_PREALLOC: case RXRPC_CALL_SERVER_PREALLOC:
case RXRPC_CALL_SERVER_SECURING: case RXRPC_CALL_SERVER_SECURING:
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_sendmsg);
ret = -EBUSY; ret = -EBUSY;
goto error_release_sock; goto error_release_sock;
default: default:
...@@ -737,7 +737,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) ...@@ -737,7 +737,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
if (!dropped_lock) if (!dropped_lock)
mutex_unlock(&call->user_mutex); mutex_unlock(&call->user_mutex);
error_put: error_put:
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put_sendmsg);
_leave(" = %d", ret); _leave(" = %d", ret);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment