diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-06-24 10:55:46 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2016-07-13 15:53:43 -0400 |
commit | 104f6351f7dc0036575b4e47765d6d39c757c066 (patch) | |
tree | e919bf3518ae0370aa0c6736556fc49b7abbd5ac | |
parent | 82ea2d7615309d755579d609ad9c11daea25d0cc (diff) |
SUNRPC: Add tracepoints for dropped and deferred requests
Dropping and/or deferring requests has an impact on performance. Let's
make sure we can trace those events.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | include/trace/events/sunrpc.h | 61 | ||||
-rw-r--r-- | net/sunrpc/svc_xprt.c | 4 |
2 files changed, 65 insertions, 0 deletions
diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index b014207a95a8..8a707f8a41c3 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h | |||
@@ -473,6 +473,39 @@ TRACE_EVENT(svc_recv, | |||
473 | show_rqstp_flags(__entry->flags)) | 473 | show_rqstp_flags(__entry->flags)) |
474 | ); | 474 | ); |
475 | 475 | ||
476 | DECLARE_EVENT_CLASS(svc_rqst_event, | ||
477 | |||
478 | TP_PROTO(struct svc_rqst *rqst), | ||
479 | |||
480 | TP_ARGS(rqst), | ||
481 | |||
482 | TP_STRUCT__entry( | ||
483 | __field(__be32, xid) | ||
484 | __field(unsigned long, flags) | ||
485 | __dynamic_array(unsigned char, addr, rqst->rq_addrlen) | ||
486 | ), | ||
487 | |||
488 | TP_fast_assign( | ||
489 | __entry->xid = rqst->rq_xid; | ||
490 | __entry->flags = rqst->rq_flags; | ||
491 | memcpy(__get_dynamic_array(addr), | ||
492 | &rqst->rq_addr, rqst->rq_addrlen); | ||
493 | ), | ||
494 | |||
495 | TP_printk("addr=%pIScp rq_xid=0x%x flags=%s", | ||
496 | (struct sockaddr *)__get_dynamic_array(addr), | ||
497 | be32_to_cpu(__entry->xid), | ||
498 | show_rqstp_flags(__entry->flags)) | ||
499 | ); | ||
500 | |||
501 | DEFINE_EVENT(svc_rqst_event, svc_defer, | ||
502 | TP_PROTO(struct svc_rqst *rqst), | ||
503 | TP_ARGS(rqst)); | ||
504 | |||
505 | DEFINE_EVENT(svc_rqst_event, svc_drop, | ||
506 | TP_PROTO(struct svc_rqst *rqst), | ||
507 | TP_ARGS(rqst)); | ||
508 | |||
476 | DECLARE_EVENT_CLASS(svc_rqst_status, | 509 | DECLARE_EVENT_CLASS(svc_rqst_status, |
477 | 510 | ||
478 | TP_PROTO(struct svc_rqst *rqst, int status), | 511 | TP_PROTO(struct svc_rqst *rqst, int status), |
@@ -636,6 +669,34 @@ TRACE_EVENT(svc_handle_xprt, | |||
636 | (struct sockaddr *)__get_dynamic_array(addr) : NULL, | 669 | (struct sockaddr *)__get_dynamic_array(addr) : NULL, |
637 | __entry->len, show_svc_xprt_flags(__entry->flags)) | 670 | __entry->len, show_svc_xprt_flags(__entry->flags)) |
638 | ); | 671 | ); |
672 | |||
673 | |||
674 | DECLARE_EVENT_CLASS(svc_deferred_event, | ||
675 | TP_PROTO(struct svc_deferred_req *dr), | ||
676 | |||
677 | TP_ARGS(dr), | ||
678 | |||
679 | TP_STRUCT__entry( | ||
680 | __field(__be32, xid) | ||
681 | __dynamic_array(unsigned char, addr, dr->addrlen) | ||
682 | ), | ||
683 | |||
684 | TP_fast_assign( | ||
685 | __entry->xid = *(__be32 *)(dr->args + (dr->xprt_hlen>>2)); | ||
686 | memcpy(__get_dynamic_array(addr), &dr->addr, dr->addrlen); | ||
687 | ), | ||
688 | |||
689 | TP_printk("addr=%pIScp xid=0x%x", | ||
690 | (struct sockaddr *)__get_dynamic_array(addr), | ||
691 | be32_to_cpu(__entry->xid)) | ||
692 | ); | ||
693 | |||
694 | DEFINE_EVENT(svc_deferred_event, svc_drop_deferred, | ||
695 | TP_PROTO(struct svc_deferred_req *dr), | ||
696 | TP_ARGS(dr)); | ||
697 | DEFINE_EVENT(svc_deferred_event, svc_revisit_deferred, | ||
698 | TP_PROTO(struct svc_deferred_req *dr), | ||
699 | TP_ARGS(dr)); | ||
639 | #endif /* _TRACE_SUNRPC_H */ | 700 | #endif /* _TRACE_SUNRPC_H */ |
640 | 701 | ||
641 | #include <trace/define_trace.h> | 702 | #include <trace/define_trace.h> |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 4d2189a562af..e7082a4aeb56 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
@@ -875,6 +875,7 @@ EXPORT_SYMBOL_GPL(svc_recv); | |||
875 | */ | 875 | */ |
876 | void svc_drop(struct svc_rqst *rqstp) | 876 | void svc_drop(struct svc_rqst *rqstp) |
877 | { | 877 | { |
878 | trace_svc_drop(rqstp); | ||
878 | dprintk("svc: xprt %p dropped request\n", rqstp->rq_xprt); | 879 | dprintk("svc: xprt %p dropped request\n", rqstp->rq_xprt); |
879 | svc_xprt_release(rqstp); | 880 | svc_xprt_release(rqstp); |
880 | } | 881 | } |
@@ -1152,6 +1153,7 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many) | |||
1152 | spin_unlock(&xprt->xpt_lock); | 1153 | spin_unlock(&xprt->xpt_lock); |
1153 | dprintk("revisit canceled\n"); | 1154 | dprintk("revisit canceled\n"); |
1154 | svc_xprt_put(xprt); | 1155 | svc_xprt_put(xprt); |
1156 | trace_svc_drop_deferred(dr); | ||
1155 | kfree(dr); | 1157 | kfree(dr); |
1156 | return; | 1158 | return; |
1157 | } | 1159 | } |
@@ -1209,6 +1211,7 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req) | |||
1209 | set_bit(RQ_DROPME, &rqstp->rq_flags); | 1211 | set_bit(RQ_DROPME, &rqstp->rq_flags); |
1210 | 1212 | ||
1211 | dr->handle.revisit = svc_revisit; | 1213 | dr->handle.revisit = svc_revisit; |
1214 | trace_svc_defer(rqstp); | ||
1212 | return &dr->handle; | 1215 | return &dr->handle; |
1213 | } | 1216 | } |
1214 | 1217 | ||
@@ -1249,6 +1252,7 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt) | |||
1249 | struct svc_deferred_req, | 1252 | struct svc_deferred_req, |
1250 | handle.recent); | 1253 | handle.recent); |
1251 | list_del_init(&dr->handle.recent); | 1254 | list_del_init(&dr->handle.recent); |
1255 | trace_svc_revisit_deferred(dr); | ||
1252 | } else | 1256 | } else |
1253 | clear_bit(XPT_DEFERRED, &xprt->xpt_flags); | 1257 | clear_bit(XPT_DEFERRED, &xprt->xpt_flags); |
1254 | spin_unlock(&xprt->xpt_lock); | 1258 | spin_unlock(&xprt->xpt_lock); |