Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Trond Myklebust and committed by
J. Bruce Fields
104f6351 82ea2d76

+65
+61
include/trace/events/sunrpc.h
··· 473 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 509 DECLARE_EVENT_CLASS(svc_rqst_status, 477 510 478 511 TP_PROTO(struct svc_rqst *rqst, int status), ··· 669 636 (struct sockaddr *)__get_dynamic_array(addr) : NULL, 670 637 __entry->len, show_svc_xprt_flags(__entry->flags)) 671 638 ); 639 + 640 + 641 + DECLARE_EVENT_CLASS(svc_deferred_event, 642 + TP_PROTO(struct svc_deferred_req *dr), 643 + 644 + TP_ARGS(dr), 645 + 646 + TP_STRUCT__entry( 647 + __field(__be32, xid) 648 + __dynamic_array(unsigned char, addr, dr->addrlen) 649 + ), 650 + 651 + TP_fast_assign( 652 + __entry->xid = *(__be32 *)(dr->args + (dr->xprt_hlen>>2)); 653 + memcpy(__get_dynamic_array(addr), &dr->addr, dr->addrlen); 654 + ), 655 + 656 + TP_printk("addr=%pIScp xid=0x%x", 657 + (struct sockaddr *)__get_dynamic_array(addr), 658 + be32_to_cpu(__entry->xid)) 659 + ); 660 + 661 + DEFINE_EVENT(svc_deferred_event, svc_drop_deferred, 662 + TP_PROTO(struct svc_deferred_req *dr), 663 + TP_ARGS(dr)); 664 + DEFINE_EVENT(svc_deferred_event, svc_revisit_deferred, 665 + TP_PROTO(struct svc_deferred_req *dr), 666 + TP_ARGS(dr)); 672 667 #endif /* _TRACE_SUNRPC_H */ 673 668 674 669 #include <trace/define_trace.h>
+4
net/sunrpc/svc_xprt.c
··· 875 875 */ 876 876 void svc_drop(struct svc_rqst *rqstp) 877 877 { 878 + trace_svc_drop(rqstp); 878 879 dprintk("svc: xprt %p dropped request\n", rqstp->rq_xprt); 879 880 svc_xprt_release(rqstp); 880 881 } ··· 1153 1152 spin_unlock(&xprt->xpt_lock); 1154 1153 dprintk("revisit canceled\n"); 1155 1154 svc_xprt_put(xprt); 1155 + trace_svc_drop_deferred(dr); 1156 1156 kfree(dr); 1157 1157 return; 1158 1158 } ··· 1211 1209 set_bit(RQ_DROPME, &rqstp->rq_flags); 1212 1210 1213 1211 dr->handle.revisit = svc_revisit; 1212 + trace_svc_defer(rqstp); 1214 1213 return &dr->handle; 1215 1214 } 1216 1215 ··· 1252 1249 struct svc_deferred_req, 1253 1250 handle.recent); 1254 1251 list_del_init(&dr->handle.recent); 1252 + trace_svc_revisit_deferred(dr); 1255 1253 } else 1256 1254 clear_bit(XPT_DEFERRED, &xprt->xpt_flags); 1257 1255 spin_unlock(&xprt->xpt_lock);