diff options
| author | Chuck Lever <chuck.lever@oracle.com> | 2018-03-27 10:51:39 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@redhat.com> | 2018-04-03 15:08:12 -0400 |
| commit | aaba72cd4e793fbf1c04e06dee3d2c3710339678 (patch) | |
| tree | 07c10dd49ba18ca0cee58d1a96d27505d53f1378 /include | |
| parent | 0b9547bf6b94317b3f8e2496dc2b44cb6e599b01 (diff) | |
sunrpc: Report per-RPC execution stats
Introduce a mechanism to report the server-side execution latency of
each RPC. The goal is to enable user space to filter the trace
record for latency outliers, build histograms, etc.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/sunrpc/svc.h | 1 | ||||
| -rw-r--r-- | include/trace/events/sunrpc.h | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 786ae2255f05..3bd7504066e1 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
| @@ -283,6 +283,7 @@ struct svc_rqst { | |||
| 283 | int rq_reserved; /* space on socket outq | 283 | int rq_reserved; /* space on socket outq |
| 284 | * reserved for this request | 284 | * reserved for this request |
| 285 | */ | 285 | */ |
| 286 | ktime_t rq_stime; /* start time */ | ||
| 286 | 287 | ||
| 287 | struct cache_req rq_chandle; /* handle passed to caches for | 288 | struct cache_req rq_chandle; /* handle passed to caches for |
| 288 | * request delaying | 289 | * request delaying |
diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index 5a8157c04900..1b383f71ccd7 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h | |||
| @@ -705,6 +705,27 @@ TRACE_EVENT(svc_handle_xprt, | |||
| 705 | __entry->len, show_svc_xprt_flags(__entry->flags)) | 705 | __entry->len, show_svc_xprt_flags(__entry->flags)) |
| 706 | ); | 706 | ); |
| 707 | 707 | ||
| 708 | TRACE_EVENT(svc_stats_latency, | ||
| 709 | TP_PROTO(const struct svc_rqst *rqst), | ||
| 710 | |||
| 711 | TP_ARGS(rqst), | ||
| 712 | |||
| 713 | TP_STRUCT__entry( | ||
| 714 | __field(u32, xid) | ||
| 715 | __field(unsigned long, execute) | ||
| 716 | __string(addr, rqst->rq_xprt->xpt_remotebuf) | ||
| 717 | ), | ||
| 718 | |||
| 719 | TP_fast_assign( | ||
| 720 | __entry->xid = be32_to_cpu(rqst->rq_xid); | ||
| 721 | __entry->execute = ktime_to_us(ktime_sub(ktime_get(), | ||
| 722 | rqst->rq_stime)); | ||
| 723 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); | ||
| 724 | ), | ||
| 725 | |||
| 726 | TP_printk("addr=%s xid=0x%08x execute-us=%lu", | ||
| 727 | __get_str(addr), __entry->xid, __entry->execute) | ||
| 728 | ); | ||
| 708 | 729 | ||
| 709 | DECLARE_EVENT_CLASS(svc_deferred_event, | 730 | DECLARE_EVENT_CLASS(svc_deferred_event, |
| 710 | TP_PROTO(struct svc_deferred_req *dr), | 731 | TP_PROTO(struct svc_deferred_req *dr), |
