aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2016-06-24 10:55:46 -0400
committerJ. Bruce Fields <bfields@redhat.com>2016-07-13 15:53:43 -0400
commit104f6351f7dc0036575b4e47765d6d39c757c066 (patch)
treee919bf3518ae0370aa0c6736556fc49b7abbd5ac
parent82ea2d7615309d755579d609ad9c11daea25d0cc (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.h61
-rw-r--r--net/sunrpc/svc_xprt.c4
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
476DECLARE_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
501DEFINE_EVENT(svc_rqst_event, svc_defer,
502 TP_PROTO(struct svc_rqst *rqst),
503 TP_ARGS(rqst));
504
505DEFINE_EVENT(svc_rqst_event, svc_drop,
506 TP_PROTO(struct svc_rqst *rqst),
507 TP_ARGS(rqst));
508
476DECLARE_EVENT_CLASS(svc_rqst_status, 509DECLARE_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
674DECLARE_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
694DEFINE_EVENT(svc_deferred_event, svc_drop_deferred,
695 TP_PROTO(struct svc_deferred_req *dr),
696 TP_ARGS(dr));
697DEFINE_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 */
876void svc_drop(struct svc_rqst *rqstp) 876void 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);