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

sunrpc: Save remote presentation address in svc_xprt for trace events

TP_printk defines a format string that is passed to user space for
converting raw trace event records to something human-readable.

My user space's printf (Oracle Linux 7), however, does not have a
%pI format specifier. The result is that what is supposed to be an
IP address in the output of "trace-cmd report" is just a string that
says the field couldn't be displayed.

To fix this, adopt the same approach as the client: maintain a pre-
formated presentation address for occasions when %pI is not
available.

The location of the trace_svc_send trace point is adjusted so that
rqst->rq_xprt is not NULL when the trace event is recorded.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>

authored by

Chuck Lever and committed by
J. Bruce Fields
ece200dd 41f306d0

+43 -58
+4
include/linux/sunrpc/svc_xprt.h
··· 83 83 size_t xpt_locallen; /* length of address */ 84 84 struct sockaddr_storage xpt_remote; /* remote peer's address */ 85 85 size_t xpt_remotelen; /* length of address */ 86 + char xpt_remotebuf[INET6_ADDRSTRLEN + 10]; 86 87 struct rpc_wait_queue xpt_bc_pending; /* backchannel wait queue */ 87 88 struct list_head xpt_users; /* callbacks on free */ 88 89 ··· 153 152 { 154 153 memcpy(&xprt->xpt_remote, sa, salen); 155 154 xprt->xpt_remotelen = salen; 155 + snprintf(xprt->xpt_remotebuf, sizeof(xprt->xpt_remotebuf) - 1, 156 + "%pISpc", sa); 156 157 } 158 + 157 159 static inline unsigned short svc_addr_port(const struct sockaddr *sa) 158 160 { 159 161 const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
+33 -56
include/trace/events/sunrpc.h
··· 493 493 __field(u32, xid) 494 494 __field(int, len) 495 495 __field(unsigned long, flags) 496 - __dynamic_array(unsigned char, addr, rqst->rq_addrlen) 496 + __string(addr, rqst->rq_xprt->xpt_remotebuf) 497 497 ), 498 498 499 499 TP_fast_assign( 500 500 __entry->xid = be32_to_cpu(rqst->rq_xid); 501 501 __entry->len = len; 502 502 __entry->flags = rqst->rq_flags; 503 - memcpy(__get_dynamic_array(addr), 504 - &rqst->rq_addr, rqst->rq_addrlen); 503 + __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 505 504 ), 506 505 507 - TP_printk("addr=%pIScp xid=0x%08x len=%d flags=%s", 508 - (struct sockaddr *)__get_dynamic_array(addr), 509 - __entry->xid, __entry->len, 506 + TP_printk("addr=%s xid=0x%08x len=%d flags=%s", 507 + __get_str(addr), __entry->xid, __entry->len, 510 508 show_rqstp_flags(__entry->flags)) 511 509 ); 512 510 ··· 517 519 TP_STRUCT__entry( 518 520 __field(u32, xid) 519 521 __field(unsigned long, flags) 520 - __dynamic_array(unsigned char, addr, rqst->rq_addrlen) 522 + __string(addr, rqst->rq_xprt->xpt_remotebuf) 521 523 ), 522 524 523 525 TP_fast_assign( 524 526 __entry->xid = be32_to_cpu(rqst->rq_xid); 525 527 __entry->flags = rqst->rq_flags; 526 - memcpy(__get_dynamic_array(addr), 527 - &rqst->rq_addr, rqst->rq_addrlen); 528 + __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 528 529 ), 529 530 530 - TP_printk("addr=%pIScp rq_xid=0x%08x flags=%s", 531 - (struct sockaddr *)__get_dynamic_array(addr), 532 - __entry->xid, 533 - show_rqstp_flags(__entry->flags)) 531 + TP_printk("addr=%s xid=0x%08x flags=%s", 532 + __get_str(addr), __entry->xid, 533 + show_rqstp_flags(__entry->flags)) 534 534 ); 535 535 536 536 DEFINE_EVENT(svc_rqst_event, svc_defer, ··· 549 553 __field(u32, xid) 550 554 __field(int, status) 551 555 __field(unsigned long, flags) 552 - __dynamic_array(unsigned char, addr, rqst->rq_addrlen) 556 + __string(addr, rqst->rq_xprt->xpt_remotebuf) 553 557 ), 554 558 555 559 TP_fast_assign( 556 560 __entry->xid = be32_to_cpu(rqst->rq_xid); 557 561 __entry->status = status; 558 562 __entry->flags = rqst->rq_flags; 559 - memcpy(__get_dynamic_array(addr), 560 - &rqst->rq_addr, rqst->rq_addrlen); 563 + __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 561 564 ), 562 565 563 - TP_printk("addr=%pIScp rq_xid=0x%08x status=%d flags=%s", 564 - (struct sockaddr *)__get_dynamic_array(addr), 565 - __entry->xid, 566 - __entry->status, show_rqstp_flags(__entry->flags)) 566 + TP_printk("addr=%s xid=0x%08x status=%d flags=%s", 567 + __get_str(addr), __entry->xid, 568 + __entry->status, show_rqstp_flags(__entry->flags)) 567 569 ); 568 570 569 571 DEFINE_EVENT(svc_rqst_status, svc_process, ··· 598 604 __field(struct svc_xprt *, xprt) 599 605 __field(int, pid) 600 606 __field(unsigned long, flags) 601 - __dynamic_array(unsigned char, addr, xprt != NULL ? 602 - xprt->xpt_remotelen : 0) 607 + __string(addr, xprt->xpt_remotebuf) 603 608 ), 604 609 605 610 TP_fast_assign( 606 611 __entry->xprt = xprt; 607 612 __entry->pid = rqst? rqst->rq_task->pid : 0; 608 - if (xprt) { 609 - memcpy(__get_dynamic_array(addr), 610 - &xprt->xpt_remote, 611 - xprt->xpt_remotelen); 612 - __entry->flags = xprt->xpt_flags; 613 - } else 614 - __entry->flags = 0; 613 + __entry->flags = xprt->xpt_flags; 614 + __assign_str(addr, xprt->xpt_remotebuf); 615 615 ), 616 616 617 - TP_printk("xprt=0x%p addr=%pIScp pid=%d flags=%s", __entry->xprt, 618 - __get_dynamic_array_len(addr) != 0 ? 619 - (struct sockaddr *)__get_dynamic_array(addr) : NULL, 620 - __entry->pid, show_svc_xprt_flags(__entry->flags)) 617 + TP_printk("xprt=%p addr=%s pid=%d flags=%s", 618 + __entry->xprt, __get_str(addr), 619 + __entry->pid, show_svc_xprt_flags(__entry->flags)) 621 620 ); 622 621 623 622 DECLARE_EVENT_CLASS(svc_xprt_event, ··· 621 634 TP_STRUCT__entry( 622 635 __field(struct svc_xprt *, xprt) 623 636 __field(unsigned long, flags) 624 - __dynamic_array(unsigned char, addr, xprt->xpt_remotelen) 637 + __string(addr, xprt->xpt_remotebuf) 625 638 ), 626 639 627 640 TP_fast_assign( 628 641 __entry->xprt = xprt; 629 642 __entry->flags = xprt->xpt_flags; 630 - memcpy(__get_dynamic_array(addr), 631 - &xprt->xpt_remote, xprt->xpt_remotelen); 643 + __assign_str(addr, xprt->xpt_remotebuf); 632 644 ), 633 645 634 - TP_printk("xprt=0x%p addr=%pIScp flags=%s", __entry->xprt, 635 - (struct sockaddr *)__get_dynamic_array(addr), 636 - show_svc_xprt_flags(__entry->flags)) 646 + TP_printk("xprt=%p addr=%s flags=%s", 647 + __entry->xprt, __get_str(addr), 648 + show_svc_xprt_flags(__entry->flags)) 637 649 ); 638 650 639 651 DEFINE_EVENT(svc_xprt_event, svc_xprt_dequeue, ··· 668 682 __field(struct svc_xprt *, xprt) 669 683 __field(int, len) 670 684 __field(unsigned long, flags) 671 - __dynamic_array(unsigned char, addr, xprt != NULL ? 672 - xprt->xpt_remotelen : 0) 685 + __string(addr, xprt->xpt_remotebuf) 673 686 ), 674 687 675 688 TP_fast_assign( 676 689 __entry->xprt = xprt; 677 690 __entry->len = len; 678 - if (xprt) { 679 - memcpy(__get_dynamic_array(addr), 680 - &xprt->xpt_remote, 681 - xprt->xpt_remotelen); 682 - __entry->flags = xprt->xpt_flags; 683 - } else 684 - __entry->flags = 0; 691 + __entry->flags = xprt->xpt_flags; 692 + __assign_str(addr, xprt->xpt_remotebuf); 685 693 ), 686 694 687 - TP_printk("xprt=0x%p addr=%pIScp len=%d flags=%s", __entry->xprt, 688 - __get_dynamic_array_len(addr) != 0 ? 689 - (struct sockaddr *)__get_dynamic_array(addr) : NULL, 695 + TP_printk("xprt=%p addr=%s len=%d flags=%s", 696 + __entry->xprt, __get_str(addr), 690 697 __entry->len, show_svc_xprt_flags(__entry->flags)) 691 698 ); 692 699 ··· 691 712 692 713 TP_STRUCT__entry( 693 714 __field(u32, xid) 694 - __dynamic_array(unsigned char, addr, dr->addrlen) 715 + __string(addr, dr->xprt->xpt_remotebuf) 695 716 ), 696 717 697 718 TP_fast_assign( 698 719 __entry->xid = be32_to_cpu(*(__be32 *)(dr->args + 699 720 (dr->xprt_hlen>>2))); 700 - memcpy(__get_dynamic_array(addr), &dr->addr, dr->addrlen); 721 + __assign_str(addr, dr->xprt->xpt_remotebuf); 701 722 ), 702 723 703 - TP_printk("addr=%pIScp xid=0x%08x", 704 - (struct sockaddr *)__get_dynamic_array(addr), 705 - __entry->xid) 724 + TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid) 706 725 ); 707 726 708 727 DEFINE_EVENT(svc_deferred_event, svc_drop_deferred,
+2 -1
net/sunrpc/svc_xprt.c
··· 173 173 set_bit(XPT_BUSY, &xprt->xpt_flags); 174 174 rpc_init_wait_queue(&xprt->xpt_bc_pending, "xpt_bc_pending"); 175 175 xprt->xpt_net = get_net(net); 176 + strcpy(xprt->xpt_remotebuf, "uninitialized"); 176 177 } 177 178 EXPORT_SYMBOL_GPL(svc_xprt_init); 178 179 ··· 895 894 len = xprt->xpt_ops->xpo_sendto(rqstp); 896 895 mutex_unlock(&xprt->xpt_mutex); 897 896 rpc_wake_up(&xprt->xpt_bc_pending); 897 + trace_svc_send(rqstp, len); 898 898 svc_xprt_release(rqstp); 899 899 900 900 if (len == -ECONNREFUSED || len == -ENOTCONN || len == -EAGAIN) 901 901 len = 0; 902 902 out: 903 - trace_svc_send(rqstp, len); 904 903 return len; 905 904 } 906 905
+1
net/sunrpc/svcsock.c
··· 1310 1310 set_bit(XPT_CONG_CTRL, &svsk->sk_xprt.xpt_flags); 1311 1311 if (sk->sk_state == TCP_LISTEN) { 1312 1312 dprintk("setting up TCP socket for listening\n"); 1313 + strcpy(svsk->sk_xprt.xpt_remotebuf, "listener"); 1313 1314 set_bit(XPT_LISTENER, &svsk->sk_xprt.xpt_flags); 1314 1315 sk->sk_data_ready = svc_tcp_listen_data_ready; 1315 1316 set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
+3 -1
net/sunrpc/xprtrdma/svc_rdma_transport.c
··· 401 401 */ 402 402 set_bit(XPT_CONG_CTRL, &cma_xprt->sc_xprt.xpt_flags); 403 403 404 - if (listener) 404 + if (listener) { 405 + strcpy(cma_xprt->sc_xprt.xpt_remotebuf, "listener"); 405 406 set_bit(XPT_LISTENER, &cma_xprt->sc_xprt.xpt_flags); 407 + } 406 408 407 409 return cma_xprt; 408 410 }