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

hv_netvsc: add trace points

This adds tracepoints to the driver which has proved useful in
debugging startup and shutdown race conditions.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Stephen Hemminger and committed by
David S. Miller
ec966381 0e96460e

+220 -2
+1 -1
drivers/net/hyperv/Makefile
··· 1 1 obj-$(CONFIG_HYPERV_NET) += hv_netvsc.o 2 2 3 - hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o 3 + hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o netvsc_trace.o
+25 -1
drivers/net/hyperv/netvsc.c
··· 36 36 #include <asm/sync_bitops.h> 37 37 38 38 #include "hyperv_net.h" 39 + #include "netvsc_trace.h" 39 40 40 41 /* 41 42 * Switch the data path from the synthetic interface to the VF ··· 57 56 else 58 57 init_pkt->msg.v4_msg.active_dp.active_datapath = 59 58 NVSP_DATAPATH_SYNTHETIC; 59 + 60 + trace_nvsp_send(ndev, init_pkt); 60 61 61 62 vmbus_sendpacket(dev->channel, init_pkt, 62 63 sizeof(struct nvsp_message), ··· 127 124 revoke_packet->msg.v1_msg. 128 125 revoke_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID; 129 126 127 + trace_nvsp_send(ndev, revoke_packet); 128 + 130 129 ret = vmbus_sendpacket(device->channel, 131 130 revoke_packet, 132 131 sizeof(struct nvsp_message), ··· 168 163 NVSP_MSG1_TYPE_REVOKE_SEND_BUF; 169 164 revoke_packet->msg.v1_msg.revoke_send_buf.id = 170 165 NETVSC_SEND_BUFFER_ID; 166 + 167 + trace_nvsp_send(ndev, revoke_packet); 171 168 172 169 ret = vmbus_sendpacket(device->channel, 173 170 revoke_packet, ··· 312 305 init_packet->msg.v1_msg. 313 306 send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID; 314 307 308 + trace_nvsp_send(ndev, init_packet); 309 + 315 310 /* Send the gpadl notification request */ 316 311 ret = vmbus_sendpacket(device->channel, init_packet, 317 312 sizeof(struct nvsp_message), ··· 393 384 net_device->send_buf_gpadl_handle; 394 385 init_packet->msg.v1_msg.send_send_buf.id = NETVSC_SEND_BUFFER_ID; 395 386 387 + trace_nvsp_send(ndev, init_packet); 388 + 396 389 /* Send the gpadl notification request */ 397 390 ret = vmbus_sendpacket(device->channel, init_packet, 398 391 sizeof(struct nvsp_message), ··· 463 452 init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver; 464 453 init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver; 465 454 455 + trace_nvsp_send(ndev, init_packet); 456 + 466 457 /* Send the init request */ 467 458 ret = vmbus_sendpacket(device->channel, init_packet, 468 459 sizeof(struct nvsp_message), ··· 497 484 init_packet->msg.v2_msg.send_ndis_config.capability.teaming = 1; 498 485 } 499 486 487 + trace_nvsp_send(ndev, init_packet); 488 + 500 489 ret = vmbus_sendpacket(device->channel, init_packet, 501 490 sizeof(struct nvsp_message), 502 491 (unsigned long)init_packet, ··· 511 496 struct netvsc_device *net_device, 512 497 const struct netvsc_device_info *device_info) 513 498 { 499 + struct net_device *ndev = hv_get_drvdata(device); 514 500 static const u32 ver_list[] = { 515 501 NVSP_PROTOCOL_VERSION_1, NVSP_PROTOCOL_VERSION_2, 516 502 NVSP_PROTOCOL_VERSION_4, NVSP_PROTOCOL_VERSION_5 ··· 551 535 init_packet->msg.v1_msg. 552 536 send_ndis_ver.ndis_minor_ver = 553 537 ndis_version & 0xFFFF; 538 + 539 + trace_nvsp_send(ndev, init_packet); 554 540 555 541 /* Send the init request */ 556 542 ret = vmbus_sendpacket(device->channel, init_packet, ··· 765 747 struct sk_buff *skb) 766 748 { 767 749 struct nvsp_message nvmsg; 768 - struct nvsp_1_message_send_rndis_packet * const rpkt = 750 + struct nvsp_1_message_send_rndis_packet *rpkt = 769 751 &nvmsg.msg.v1_msg.send_rndis_pkt; 770 752 struct netvsc_channel * const nvchan = 771 753 &net_device->chan_table[packet->q_idx]; ··· 793 775 794 776 if (out_channel->rescind) 795 777 return -ENODEV; 778 + 779 + trace_nvsp_send_pkt(ndev, out_channel, rpkt); 796 780 797 781 if (packet->page_buf_cnt) { 798 782 if (packet->cp_partial) ··· 1099 1079 + vmxferpage_packet->ranges[i].byte_offset; 1100 1080 u32 buflen = vmxferpage_packet->ranges[i].byte_count; 1101 1081 1082 + trace_rndis_recv(ndev, q_idx, data); 1083 + 1102 1084 /* Pass it to the upper layer */ 1103 1085 status = rndis_filter_receive(ndev, net_device, 1104 1086 channel, data, buflen); ··· 1164 1142 { 1165 1143 struct net_device_context *net_device_ctx = netdev_priv(ndev); 1166 1144 struct nvsp_message *nvmsg = hv_pkt_data(desc); 1145 + 1146 + trace_nvsp_recv(ndev, channel, nvmsg); 1167 1147 1168 1148 switch (desc->type) { 1169 1149 case VM_PKT_COMP:
+7
drivers/net/hyperv/netvsc_trace.c
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #include <linux/netdevice.h> 3 + 4 + #include "hyperv_net.h" 5 + 6 + #define CREATE_TRACE_POINTS 7 + #include "netvsc_trace.h"
+182
drivers/net/hyperv/netvsc_trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + 3 + #if !defined(_NETVSC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 4 + #define _NETVSC_TRACE_H 5 + 6 + #include <linux/tracepoint.h> 7 + 8 + #undef TRACE_SYSTEM 9 + #define TRACE_SYSTEM netvsc 10 + #define TRACE_INCLUDE_FILE netvsc_trace 11 + 12 + TRACE_DEFINE_ENUM(RNDIS_MSG_PACKET); 13 + TRACE_DEFINE_ENUM(RNDIS_MSG_INDICATE); 14 + TRACE_DEFINE_ENUM(RNDIS_MSG_INIT); 15 + TRACE_DEFINE_ENUM(RNDIS_MSG_INIT_C); 16 + TRACE_DEFINE_ENUM(RNDIS_MSG_HALT); 17 + TRACE_DEFINE_ENUM(RNDIS_MSG_QUERY); 18 + TRACE_DEFINE_ENUM(RNDIS_MSG_QUERY_C); 19 + TRACE_DEFINE_ENUM(RNDIS_MSG_SET); 20 + TRACE_DEFINE_ENUM(RNDIS_MSG_SET_C); 21 + TRACE_DEFINE_ENUM(RNDIS_MSG_RESET); 22 + TRACE_DEFINE_ENUM(RNDIS_MSG_RESET_C); 23 + TRACE_DEFINE_ENUM(RNDIS_MSG_KEEPALIVE); 24 + TRACE_DEFINE_ENUM(RNDIS_MSG_KEEPALIVE_C); 25 + 26 + #define show_rndis_type(type) \ 27 + __print_symbolic(type, \ 28 + { RNDIS_MSG_PACKET, "PACKET" }, \ 29 + { RNDIS_MSG_INDICATE, "INDICATE", }, \ 30 + { RNDIS_MSG_INIT, "INIT", }, \ 31 + { RNDIS_MSG_INIT_C, "INIT_C", }, \ 32 + { RNDIS_MSG_HALT, "HALT", }, \ 33 + { RNDIS_MSG_QUERY, "QUERY", }, \ 34 + { RNDIS_MSG_QUERY_C, "QUERY_C", }, \ 35 + { RNDIS_MSG_SET, "SET", }, \ 36 + { RNDIS_MSG_SET_C, "SET_C", }, \ 37 + { RNDIS_MSG_RESET, "RESET", }, \ 38 + { RNDIS_MSG_RESET_C, "RESET_C", }, \ 39 + { RNDIS_MSG_KEEPALIVE, "KEEPALIVE", }, \ 40 + { RNDIS_MSG_KEEPALIVE_C, "KEEPALIVE_C", }) 41 + 42 + DECLARE_EVENT_CLASS(rndis_msg_class, 43 + TP_PROTO(const struct net_device *ndev, u16 q, 44 + const struct rndis_message *msg), 45 + TP_ARGS(ndev, q, msg), 46 + TP_STRUCT__entry( 47 + __string( name, ndev->name ) 48 + __field( u16, queue ) 49 + __field( u32, req_id ) 50 + __field( u32, msg_type ) 51 + __field( u32, msg_len ) 52 + ), 53 + TP_fast_assign( 54 + __assign_str(name, ndev->name); 55 + __entry->queue = q; 56 + __entry->req_id = msg->msg.init_req.req_id; 57 + __entry->msg_type = msg->ndis_msg_type; 58 + __entry->msg_len = msg->msg_len; 59 + ), 60 + TP_printk("dev=%s q=%u req=%#x type=%s msg_len=%u", 61 + __get_str(name), __entry->queue, __entry->req_id, 62 + show_rndis_type(__entry->msg_type), __entry->msg_len) 63 + ); 64 + 65 + DEFINE_EVENT(rndis_msg_class, rndis_send, 66 + TP_PROTO(const struct net_device *ndev, u16 q, 67 + const struct rndis_message *msg), 68 + TP_ARGS(ndev, q, msg) 69 + ); 70 + 71 + DEFINE_EVENT(rndis_msg_class, rndis_recv, 72 + TP_PROTO(const struct net_device *ndev, u16 q, 73 + const struct rndis_message *msg), 74 + TP_ARGS(ndev, q, msg) 75 + ); 76 + 77 + TRACE_DEFINE_ENUM(NVSP_MSG_TYPE_INIT); 78 + TRACE_DEFINE_ENUM(NVSP_MSG_TYPE_INIT_COMPLETE); 79 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_NDIS_VER); 80 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_RECV_BUF); 81 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE); 82 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_REVOKE_RECV_BUF); 83 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_SEND_BUF); 84 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE); 85 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_REVOKE_SEND_BUF); 86 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_RNDIS_PKT); 87 + TRACE_DEFINE_ENUM(NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE); 88 + TRACE_DEFINE_ENUM(NVSP_MSG2_TYPE_SEND_NDIS_CONFIG); 89 + 90 + TRACE_DEFINE_ENUM(NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION); 91 + TRACE_DEFINE_ENUM(NVSP_MSG4_TYPE_SWITCH_DATA_PATH); 92 + 93 + TRACE_DEFINE_ENUM(NVSP_MSG5_TYPE_SUBCHANNEL); 94 + TRACE_DEFINE_ENUM(NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE); 95 + 96 + #define show_nvsp_type(type) \ 97 + __print_symbolic(type, \ 98 + { NVSP_MSG_TYPE_INIT, "INIT" }, \ 99 + { NVSP_MSG_TYPE_INIT_COMPLETE, "INIT_COMPLETE" }, \ 100 + { NVSP_MSG1_TYPE_SEND_NDIS_VER, "SEND_NDIS_VER" }, \ 101 + { NVSP_MSG1_TYPE_SEND_RECV_BUF, "SEND_RECV_BUF" }, \ 102 + { NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE, "SEND_RECV_BUF_COMPLETE" }, \ 103 + { NVSP_MSG1_TYPE_REVOKE_RECV_BUF, "REVOKE_RECV_BUF" }, \ 104 + { NVSP_MSG1_TYPE_SEND_SEND_BUF, "SEND_SEND_BUF" }, \ 105 + { NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE, "SEND_SEND_BUF_COMPLETE" }, \ 106 + { NVSP_MSG1_TYPE_REVOKE_SEND_BUF, "REVOKE_SEND_BUF" }, \ 107 + { NVSP_MSG1_TYPE_SEND_RNDIS_PKT, "SEND_RNDIS_PKT" }, \ 108 + { NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE, "SEND_RNDIS_PKT_COMPLETE" },\ 109 + { NVSP_MSG2_TYPE_SEND_NDIS_CONFIG, "SEND_NDIS_CONFIG" }, \ 110 + { NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION, "SEND_VF_ASSOCIATION" }, \ 111 + { NVSP_MSG4_TYPE_SWITCH_DATA_PATH, "SWITCH_DATA_PATH" }, \ 112 + { NVSP_MSG5_TYPE_SUBCHANNEL, "SUBCHANNEL" }, \ 113 + { NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE, "SEND_INDIRECTION_TABLE" }) 114 + 115 + TRACE_EVENT(nvsp_send, 116 + TP_PROTO(const struct net_device *ndev, 117 + const struct nvsp_message *msg), 118 + TP_ARGS(ndev, msg), 119 + TP_STRUCT__entry( 120 + __string( name, ndev->name ) 121 + __field( u32, msg_type ) 122 + ), 123 + TP_fast_assign( 124 + __assign_str(name, ndev->name); 125 + __entry->msg_type = msg->hdr.msg_type; 126 + ), 127 + TP_printk("dev=%s type=%s", 128 + __get_str(name), 129 + show_nvsp_type(__entry->msg_type)) 130 + ); 131 + 132 + TRACE_EVENT(nvsp_send_pkt, 133 + TP_PROTO(const struct net_device *ndev, 134 + const struct vmbus_channel *chan, 135 + const struct nvsp_1_message_send_rndis_packet *rpkt), 136 + TP_ARGS(ndev, chan, rpkt), 137 + TP_STRUCT__entry( 138 + __string( name, ndev->name ) 139 + __field( u16, qid ) 140 + __field( u32, channel_type ) 141 + __field( u32, section_index ) 142 + __field( u32, section_size ) 143 + ), 144 + TP_fast_assign( 145 + __assign_str(name, ndev->name); 146 + __entry->qid = chan->offermsg.offer.sub_channel_index; 147 + __entry->channel_type = rpkt->channel_type; 148 + __entry->section_index = rpkt->send_buf_section_index; 149 + __entry->section_size = rpkt->send_buf_section_size; 150 + ), 151 + TP_printk("dev=%s qid=%u type=%s section=%u size=%d", 152 + __get_str(name), __entry->qid, 153 + __entry->channel_type ? "CONTROL" : "DATA", 154 + __entry->section_index, __entry->section_size) 155 + ); 156 + 157 + TRACE_EVENT(nvsp_recv, 158 + TP_PROTO(const struct net_device *ndev, 159 + const struct vmbus_channel *chan, 160 + const struct nvsp_message *msg), 161 + TP_ARGS(ndev, chan, msg), 162 + TP_STRUCT__entry( 163 + __string( name, ndev->name ) 164 + __field( u16, qid ) 165 + __field( u32, msg_type ) 166 + ), 167 + TP_fast_assign( 168 + __assign_str(name, ndev->name); 169 + __entry->qid = chan->offermsg.offer.sub_channel_index; 170 + __entry->msg_type = msg->hdr.msg_type; 171 + ), 172 + TP_printk("dev=%s qid=%u type=%s", 173 + __get_str(name), __entry->qid, 174 + show_nvsp_type(__entry->msg_type)) 175 + ); 176 + 177 + #endif /* _NETVSC_TRACE_H */ 178 + 179 + /* This part must be outside protection */ 180 + #undef TRACE_INCLUDE_PATH 181 + #define TRACE_INCLUDE_PATH ../../drivers/net/hyperv 182 + #include <trace/define_trace.h>
+5
drivers/net/hyperv/rndis_filter.c
··· 31 31 #include <linux/rtnetlink.h> 32 32 33 33 #include "hyperv_net.h" 34 + #include "netvsc_trace.h" 34 35 35 36 static void rndis_set_multicast(struct work_struct *w); 36 37 ··· 241 240 pb[1].len = req->request_msg.msg_len - 242 241 pb[0].len; 243 242 } 243 + 244 + trace_rndis_send(dev->ndev, 0, &req->request_msg); 244 245 245 246 rcu_read_lock_bh(); 246 247 ret = netvsc_send(dev->ndev, packet, NULL, pb, NULL); ··· 1090 1087 init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE; 1091 1088 init_packet->msg.v5_msg.subchn_req.num_subchannels = 1092 1089 nvdev->num_chn - 1; 1090 + trace_nvsp_send(ndev, init_packet); 1091 + 1093 1092 ret = vmbus_sendpacket(hv_dev->channel, init_packet, 1094 1093 sizeof(struct nvsp_message), 1095 1094 (unsigned long)init_packet,