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

SUNRPC: Don't allocate a full sockaddr_storage for tracing

We're always tracing IPv4 or IPv6 addresses, so we can save a lot
of space on the ringbuffer by allocating the correct sockaddr size.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org
Fixes: 83a712e0afef "sunrpc: add some tracepoints around ..."
Signed-off-by: J. Bruce Fields <bfields@redhat.com>

authored by

Trond Myklebust and committed by
J. Bruce Fields
db1bb44c 6343a212

+34 -13
+34 -13
include/trace/events/sunrpc.h
··· 529 529 530 530 TP_STRUCT__entry( 531 531 __field(struct svc_xprt *, xprt) 532 - __field_struct(struct sockaddr_storage, ss) 533 532 __field(int, pid) 534 533 __field(unsigned long, flags) 534 + __dynamic_array(unsigned char, addr, xprt != NULL ? 535 + xprt->xpt_remotelen : 0) 535 536 ), 536 537 537 538 TP_fast_assign( 538 539 __entry->xprt = xprt; 539 - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); 540 540 __entry->pid = rqst? rqst->rq_task->pid : 0; 541 - __entry->flags = xprt ? xprt->xpt_flags : 0; 541 + if (xprt) { 542 + memcpy(__get_dynamic_array(addr), 543 + &xprt->xpt_remote, 544 + xprt->xpt_remotelen); 545 + __entry->flags = xprt->xpt_flags; 546 + } else 547 + __entry->flags = 0; 542 548 ), 543 549 544 550 TP_printk("xprt=0x%p addr=%pIScp pid=%d flags=%s", __entry->xprt, 545 - (struct sockaddr *)&__entry->ss, 551 + __get_dynamic_array_len(addr) != 0 ? 552 + (struct sockaddr *)__get_dynamic_array(addr) : NULL, 546 553 __entry->pid, show_svc_xprt_flags(__entry->flags)) 547 554 ); 548 555 ··· 560 553 561 554 TP_STRUCT__entry( 562 555 __field(struct svc_xprt *, xprt) 563 - __field_struct(struct sockaddr_storage, ss) 564 556 __field(unsigned long, flags) 557 + __dynamic_array(unsigned char, addr, xprt != NULL ? 558 + xprt->xpt_remotelen : 0) 565 559 ), 566 560 567 561 TP_fast_assign( 568 - __entry->xprt = xprt, 569 - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); 570 - __entry->flags = xprt ? xprt->xpt_flags : 0; 562 + __entry->xprt = xprt; 563 + if (xprt) { 564 + memcpy(__get_dynamic_array(addr), 565 + &xprt->xpt_remote, 566 + xprt->xpt_remotelen); 567 + __entry->flags = xprt->xpt_flags; 568 + } else 569 + __entry->flags = 0; 571 570 ), 572 571 573 572 TP_printk("xprt=0x%p addr=%pIScp flags=%s", __entry->xprt, 574 - (struct sockaddr *)&__entry->ss, 573 + __get_dynamic_array_len(addr) != 0 ? 574 + (struct sockaddr *)__get_dynamic_array(addr) : NULL, 575 575 show_svc_xprt_flags(__entry->flags)) 576 576 ); 577 577 ··· 606 592 TP_STRUCT__entry( 607 593 __field(struct svc_xprt *, xprt) 608 594 __field(int, len) 609 - __field_struct(struct sockaddr_storage, ss) 610 595 __field(unsigned long, flags) 596 + __dynamic_array(unsigned char, addr, xprt != NULL ? 597 + xprt->xpt_remotelen : 0) 611 598 ), 612 599 613 600 TP_fast_assign( 614 601 __entry->xprt = xprt; 615 - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); 616 602 __entry->len = len; 617 - __entry->flags = xprt ? xprt->xpt_flags : 0; 603 + if (xprt) { 604 + memcpy(__get_dynamic_array(addr), 605 + &xprt->xpt_remote, 606 + xprt->xpt_remotelen); 607 + __entry->flags = xprt->xpt_flags; 608 + } else 609 + __entry->flags = 0; 618 610 ), 619 611 620 612 TP_printk("xprt=0x%p addr=%pIScp len=%d flags=%s", __entry->xprt, 621 - (struct sockaddr *)&__entry->ss, 613 + __get_dynamic_array_len(addr) != 0 ? 614 + (struct sockaddr *)__get_dynamic_array(addr) : NULL, 622 615 __entry->len, show_svc_xprt_flags(__entry->flags)) 623 616 ); 624 617 #endif /* _TRACE_SUNRPC_H */