Skip to content

Commit

Permalink
Merge tag 'rxrpc-next-20180327' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/dhowells/linux-fs

David Howells says:

====================
rxrpc: Tracing updates

Here are some patches that update tracing in AF_RXRPC and AFS:

 (1) Add a tracepoint for tracking resend events.

 (2) Use debug_ids in traces rather than pointers (as pointers are now hashed)
     and allow use of the same debug_id in AFS calls as in the corresponding
     AF_RXRPC calls.  This makes filtering the trace output much easier.

 (3) Add a tracepoint for tracking call completion.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Mar 29, 2018
2 parents 492caff + 1bae5d2 commit 36fc2d7
Show file tree
Hide file tree
Showing 13 changed files with 219 additions and 142 deletions.
1 change: 1 addition & 0 deletions fs/afs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct afs_call {
bool ret_reply0; /* T if should return reply[0] on success */
bool upgrade; /* T to request service upgrade */
u16 service_id; /* Actual service ID (after upgrade) */
unsigned int debug_id; /* Trace ID */
u32 operation_ID; /* operation ID for an incoming call */
u32 count; /* count for use in unmarshalling */
__be32 tmp; /* place to extract temporary data */
Expand Down
12 changes: 8 additions & 4 deletions fs/afs/rxrpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ static struct afs_call *afs_alloc_call(struct afs_net *net,

call->type = type;
call->net = net;
call->debug_id = atomic_inc_return(&rxrpc_debug_id);
atomic_set(&call->usage, 1);
INIT_WORK(&call->async_work, afs_process_async_call);
init_waitqueue_head(&call->waitq);
Expand Down Expand Up @@ -169,11 +170,12 @@ void afs_put_call(struct afs_call *call)
afs_put_server(call->net, call->cm_server);
afs_put_cb_interest(call->net, call->cbi);
kfree(call->request);
kfree(call);

o = atomic_dec_return(&net->nr_outstanding_calls);
trace_afs_call(call, afs_call_trace_free, 0, o,
__builtin_return_address(0));
kfree(call);

o = atomic_dec_return(&net->nr_outstanding_calls);
if (o == 0)
wake_up_atomic_t(&net->nr_outstanding_calls);
}
Expand Down Expand Up @@ -378,7 +380,8 @@ long afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call,
(async ?
afs_wake_up_async_call :
afs_wake_up_call_waiter),
call->upgrade);
call->upgrade,
call->debug_id);
if (IS_ERR(rxcall)) {
ret = PTR_ERR(rxcall);
goto error_kill_call;
Expand Down Expand Up @@ -727,7 +730,8 @@ void afs_charge_preallocation(struct work_struct *work)
afs_wake_up_async_call,
afs_rx_attach,
(unsigned long)call,
GFP_KERNEL) < 0)
GFP_KERNEL,
call->debug_id) < 0)
break;
call = NULL;
}
Expand Down
11 changes: 9 additions & 2 deletions include/net/af_rxrpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ enum rxrpc_call_completion {
NR__RXRPC_CALL_COMPLETIONS
};

/*
* Debug ID counter for tracing.
*/
extern atomic_t rxrpc_debug_id;

typedef void (*rxrpc_notify_rx_t)(struct sock *, struct rxrpc_call *,
unsigned long);
typedef void (*rxrpc_notify_end_tx_t)(struct sock *, struct rxrpc_call *,
Expand All @@ -50,7 +55,8 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *,
s64,
gfp_t,
rxrpc_notify_rx_t,
bool);
bool,
unsigned int);
int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *,
struct msghdr *, size_t,
rxrpc_notify_end_tx_t);
Expand All @@ -63,7 +69,8 @@ void rxrpc_kernel_get_peer(struct socket *, struct rxrpc_call *,
struct sockaddr_rxrpc *);
u64 rxrpc_kernel_get_rtt(struct socket *, struct rxrpc_call *);
int rxrpc_kernel_charge_accept(struct socket *, rxrpc_notify_rx_t,
rxrpc_user_attach_call_t, unsigned long, gfp_t);
rxrpc_user_attach_call_t, unsigned long, gfp_t,
unsigned int);
void rxrpc_kernel_set_tx_length(struct socket *, struct rxrpc_call *, s64);
int rxrpc_kernel_retry_call(struct socket *, struct rxrpc_call *,
struct sockaddr_rxrpc *, struct key *);
Expand Down
69 changes: 30 additions & 39 deletions include/trace/events/afs.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,7 @@ TRACE_EVENT(afs_recv_data,
TP_ARGS(call, count, offset, want_more, ret),

TP_STRUCT__entry(
__field(struct rxrpc_call *, rxcall )
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(enum afs_call_state, state )
__field(unsigned int, count )
__field(unsigned int, offset )
Expand All @@ -144,8 +143,7 @@ TRACE_EVENT(afs_recv_data,
),

TP_fast_assign(
__entry->rxcall = call->rxcall;
__entry->call = call;
__entry->call = call->debug_id;
__entry->state = call->state;
__entry->unmarshall = call->unmarshall;
__entry->count = count;
Expand All @@ -154,8 +152,7 @@ TRACE_EVENT(afs_recv_data,
__entry->ret = ret;
),

TP_printk("c=%p ac=%p s=%u u=%u %u/%u wm=%u ret=%d",
__entry->rxcall,
TP_printk("c=%08x s=%u u=%u %u/%u wm=%u ret=%d",
__entry->call,
__entry->state, __entry->unmarshall,
__entry->offset, __entry->count,
Expand All @@ -168,21 +165,18 @@ TRACE_EVENT(afs_notify_call,
TP_ARGS(rxcall, call),

TP_STRUCT__entry(
__field(struct rxrpc_call *, rxcall )
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(enum afs_call_state, state )
__field(unsigned short, unmarshall )
),

TP_fast_assign(
__entry->rxcall = rxcall;
__entry->call = call;
__entry->call = call->debug_id;
__entry->state = call->state;
__entry->unmarshall = call->unmarshall;
),

TP_printk("c=%p ac=%p s=%u u=%u",
__entry->rxcall,
TP_printk("c=%08x s=%u u=%u",
__entry->call,
__entry->state, __entry->unmarshall)
);
Expand All @@ -193,21 +187,18 @@ TRACE_EVENT(afs_cb_call,
TP_ARGS(call),

TP_STRUCT__entry(
__field(struct rxrpc_call *, rxcall )
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(const char *, name )
__field(u32, op )
),

TP_fast_assign(
__entry->rxcall = call->rxcall;
__entry->call = call;
__entry->call = call->debug_id;
__entry->name = call->type->name;
__entry->op = call->operation_ID;
),

TP_printk("c=%p ac=%p %s o=%u",
__entry->rxcall,
TP_printk("c=%08x %s o=%u",
__entry->call,
__entry->name,
__entry->op)
Expand All @@ -220,22 +211,22 @@ TRACE_EVENT(afs_call,
TP_ARGS(call, op, usage, outstanding, where),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(int, op )
__field(int, usage )
__field(int, outstanding )
__field(const void *, where )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->op = op;
__entry->usage = usage;
__entry->outstanding = outstanding;
__entry->where = where;
),

TP_printk("c=%p %s u=%d o=%d sp=%pSR",
TP_printk("c=%08x %s u=%d o=%d sp=%pSR",
__entry->call,
__print_symbolic(__entry->op, afs_call_traces),
__entry->usage,
Expand All @@ -249,13 +240,13 @@ TRACE_EVENT(afs_make_fs_call,
TP_ARGS(call, fid),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(enum afs_fs_operation, op )
__field_struct(struct afs_fid, fid )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->op = call->operation_ID;
if (fid) {
__entry->fid = *fid;
Expand All @@ -266,7 +257,7 @@ TRACE_EVENT(afs_make_fs_call,
}
),

TP_printk("c=%p %06x:%06x:%06x %s",
TP_printk("c=%08x %06x:%06x:%06x %s",
__entry->call,
__entry->fid.vid,
__entry->fid.vnode,
Expand All @@ -280,16 +271,16 @@ TRACE_EVENT(afs_make_vl_call,
TP_ARGS(call),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(enum afs_vl_operation, op )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->op = call->operation_ID;
),

TP_printk("c=%p %s",
TP_printk("c=%08x %s",
__entry->call,
__print_symbolic(__entry->op, afs_vl_operations))
);
Expand All @@ -300,20 +291,20 @@ TRACE_EVENT(afs_call_done,
TP_ARGS(call),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(struct rxrpc_call *, rx_call )
__field(int, ret )
__field(u32, abort_code )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->rx_call = call->rxcall;
__entry->ret = call->error;
__entry->abort_code = call->abort_code;
),

TP_printk(" c=%p ret=%d ab=%d [%p]",
TP_printk(" c=%08x ret=%d ab=%d [%p]",
__entry->call,
__entry->ret,
__entry->abort_code,
Expand All @@ -327,7 +318,7 @@ TRACE_EVENT(afs_send_pages,
TP_ARGS(call, msg, first, last, offset),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(pgoff_t, first )
__field(pgoff_t, last )
__field(unsigned int, nr )
Expand All @@ -337,7 +328,7 @@ TRACE_EVENT(afs_send_pages,
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->first = first;
__entry->last = last;
__entry->nr = msg->msg_iter.nr_segs;
Expand All @@ -346,7 +337,7 @@ TRACE_EVENT(afs_send_pages,
__entry->flags = msg->msg_flags;
),

TP_printk(" c=%p %lx-%lx-%lx b=%x o=%x f=%x",
TP_printk(" c=%08x %lx-%lx-%lx b=%x o=%x f=%x",
__entry->call,
__entry->first, __entry->first + __entry->nr - 1, __entry->last,
__entry->bytes, __entry->offset,
Expand All @@ -360,22 +351,22 @@ TRACE_EVENT(afs_sent_pages,
TP_ARGS(call, first, last, cursor, ret),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(pgoff_t, first )
__field(pgoff_t, last )
__field(pgoff_t, cursor )
__field(int, ret )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->first = first;
__entry->last = last;
__entry->cursor = cursor;
__entry->ret = ret;
),

TP_printk(" c=%p %lx-%lx c=%lx r=%d",
TP_printk(" c=%08x %lx-%lx c=%lx r=%d",
__entry->call,
__entry->first, __entry->last,
__entry->cursor, __entry->ret)
Expand Down Expand Up @@ -450,22 +441,22 @@ TRACE_EVENT(afs_call_state,
TP_ARGS(call, from, to, ret, remote_abort),

TP_STRUCT__entry(
__field(struct afs_call *, call )
__field(unsigned int, call )
__field(enum afs_call_state, from )
__field(enum afs_call_state, to )
__field(int, ret )
__field(u32, abort )
),

TP_fast_assign(
__entry->call = call;
__entry->call = call->debug_id;
__entry->from = from;
__entry->to = to;
__entry->ret = ret;
__entry->abort = remote_abort;
),

TP_printk("c=%p %u->%u r=%d ab=%d",
TP_printk("c=%08x %u->%u r=%d ab=%d",
__entry->call,
__entry->from, __entry->to,
__entry->ret, __entry->abort)
Expand Down
Loading

0 comments on commit 36fc2d7

Please sign in to comment.