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

nbd: add tracepoints for send/receive timing

This adds four tracepoints to nbd, enabling separate tracing of payload
and header sending/receipt.

In the send path for headers that have already been sent, we also
explicitly initialize the handle so it can be referenced by the later
tracepoint.

Signed-off-by: Andrew Hall <hall@fb.com>
Signed-off-by: Matt Mullins <mmullins@fb.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Andrew Hall and committed by
Alexei Starovoitov
2abd2de7 ea106722

+59
+8
drivers/block/nbd.c
··· 513 513 if (sent) { 514 514 if (sent >= sizeof(request)) { 515 515 skip = sent - sizeof(request); 516 + 517 + /* initialize handle for tracing purposes */ 518 + handle = nbd_cmd_handle(cmd); 519 + 516 520 goto send_pages; 517 521 } 518 522 iov_iter_advance(&from, sent); ··· 540 536 (unsigned long long)blk_rq_pos(req) << 9, blk_rq_bytes(req)); 541 537 result = sock_xmit(nbd, index, 1, &from, 542 538 (type == NBD_CMD_WRITE) ? MSG_MORE : 0, &sent); 539 + trace_nbd_header_sent(req, handle); 543 540 if (result <= 0) { 544 541 if (was_interrupted(result)) { 545 542 /* If we havne't sent anything we can just return BUSY, ··· 613 608 bio = next; 614 609 } 615 610 out: 611 + trace_nbd_payload_sent(req, handle); 616 612 nsock->pending = NULL; 617 613 nsock->sent = 0; 618 614 return 0; ··· 661 655 tag, req); 662 656 return ERR_PTR(-ENOENT); 663 657 } 658 + trace_nbd_header_received(req, handle); 664 659 cmd = blk_mq_rq_to_pdu(req); 665 660 666 661 mutex_lock(&cmd->lock); ··· 715 708 } 716 709 } 717 710 out: 711 + trace_nbd_payload_received(req, handle); 718 712 mutex_unlock(&cmd->lock); 719 713 return ret ? ERR_PTR(ret) : cmd; 720 714 }
+51
include/trace/events/nbd.h
··· 7 7 8 8 #include <linux/tracepoint.h> 9 9 10 + DECLARE_EVENT_CLASS(nbd_transport_event, 11 + 12 + TP_PROTO(struct request *req, u64 handle), 13 + 14 + TP_ARGS(req, handle), 15 + 16 + TP_STRUCT__entry( 17 + __field(struct request *, req) 18 + __field(u64, handle) 19 + ), 20 + 21 + TP_fast_assign( 22 + __entry->req = req; 23 + __entry->handle = handle; 24 + ), 25 + 26 + TP_printk( 27 + "nbd transport event: request %p, handle 0x%016llx", 28 + __entry->req, 29 + __entry->handle 30 + ) 31 + ); 32 + 33 + DEFINE_EVENT(nbd_transport_event, nbd_header_sent, 34 + 35 + TP_PROTO(struct request *req, u64 handle), 36 + 37 + TP_ARGS(req, handle) 38 + ); 39 + 40 + DEFINE_EVENT(nbd_transport_event, nbd_payload_sent, 41 + 42 + TP_PROTO(struct request *req, u64 handle), 43 + 44 + TP_ARGS(req, handle) 45 + ); 46 + 47 + DEFINE_EVENT(nbd_transport_event, nbd_header_received, 48 + 49 + TP_PROTO(struct request *req, u64 handle), 50 + 51 + TP_ARGS(req, handle) 52 + ); 53 + 54 + DEFINE_EVENT(nbd_transport_event, nbd_payload_received, 55 + 56 + TP_PROTO(struct request *req, u64 handle), 57 + 58 + TP_ARGS(req, handle) 59 + ); 60 + 10 61 DECLARE_EVENT_CLASS(nbd_send_request, 11 62 12 63 TP_PROTO(struct nbd_request *nbd_request, int index,