hv_netvsc: minor enhancements
Subsystems (3)
cover hv_netvsc: minor enhancements
A couple of small things for net-next
Stephen Hemminger (2):
hv_netvsc: pass netvsc_device to rndis halt
hv_netvsc: add trace points
drivers/net/hyperv/Makefile | 2 +- drivers/net/hyperv/netvsc.c | 26 +++++- drivers/net/hyperv/netvsc_trace.c | 7 ++ drivers/net/hyperv/netvsc_trace.h | 182 ++++++++++++++++++++++++++++++++++++++ drivers/net/hyperv/rndis_filter.c | 12 ++- 5 files changed, 223 insertions(+), 6 deletions(-) create mode 100644 drivers/net/hyperv/netvsc_trace.c create mode 100644 drivers/net/hyperv/netvsc_trace.h
Signature · 1 line
2.16.2
PATCH 1/2 hv_netvsc: pass netvsc_device to rndis halt
The caller has a valid pointer, pass it to rndis_filter_halt_device and avoid any possible RCU races here.
--- drivers/net/hyperv/rndis_filter.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/hyperv/rndis_filter.c +3 -4
@@ -944,12 +944,11 @@ static bool netvsc_device_idle(const struct netvsc_device *nvdev)return true; } -static void rndis_filter_halt_device (struct rndis_device *dev) +static void rndis_filter_halt_device (struct netvsc_device *nvdev, +struct rndis_device *dev) {struct rndis_request *request;struct rndis_halt_request *halt; -struct net_device_context *net_device_ctx =netdev_priv (dev->ndev); -struct netvsc_device *nvdev =rtnl_dereference (net_device_ctx->nvdev);/* Attempt to do a rndis device halt */ request = get_rndis_request(dev, RNDIS_MSG_HALT,
@@ -1348,7 +1347,7 @@ void rndis_filter_device_remove(struct hv_device *dev,cancel_work_sync (&net_dev->subchan_work);/* Halt and release the rndis device */ -rndis_filter_halt_device (rndis_dev); +rndis_filter_halt_device (net_dev, rndis_dev); net_dev->extension =NULL ;
Signature · 1 line
2.16.2
PATCH 2/2 hv_netvsc: add trace points
In reply to Stephen HemmingerThis adds tracepoints to the driver which has proved useful in debugging startup and shutdown race conditions.
---
Note: the standard indentation style of trace files send checkpatch off into a tantrum. Ignore warnings from that.
drivers/net/hyperv/Makefile | 2 +- drivers/net/hyperv/netvsc.c | 26 +++++- drivers/net/hyperv/netvsc_trace.c | 7 ++ drivers/net/hyperv/netvsc_trace.h | 182 ++++++++++++++++++++++++++++++++++++++ drivers/net/hyperv/rndis_filter.c | 5 ++ 5 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 drivers/net/hyperv/netvsc_trace.c create mode 100644 drivers/net/hyperv/netvsc_trace.h
drivers/net/hyperv/Makefile +1 -1
@@ -1,3 +1,3 @@ obj-$(CONFIG_HYPERV_NET) += hv_netvsc.o -hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o +hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o netvsc_trace.o
drivers/net/hyperv/netvsc.c +25 -1
@@ -36,6 +36,7 @@#include <asm/sync_bitops.h> #include "hyperv_net.h" +#include "netvsc_trace.h" /* * Switch the data path from the synthetic interface to the VF
@@ -57,6 +58,8 @@ void netvsc_switch_datapath(struct net_device *ndev, bool vf) init_pkt->msg.v4_msg.active_dp.active_datapath =NVSP_DATAPATH_SYNTHETIC ; +trace_nvsp_send (ndev, init_pkt); + vmbus_sendpacket(dev->channel, init_pkt, sizeof(struct nvsp_message), (unsigned long)init_pkt,
@@ -124,6 +127,8 @@ static void netvsc_revoke_buf(struct hv_device *device, revoke_packet->msg.v1_msg. revoke_recv_buf.id =NETVSC_RECEIVE_BUFFER_ID ; +trace_nvsp_send (ndev, revoke_packet); + ret = vmbus_sendpacket(device->channel, revoke_packet, sizeof(struct nvsp_message),
@@ -164,6 +169,8 @@ static void netvsc_revoke_buf(struct hv_device *device, revoke_packet->msg.v1_msg.revoke_send_buf.id =NETVSC_SEND_BUFFER_ID ; +trace_nvsp_send (ndev, revoke_packet); + ret = vmbus_sendpacket(device->channel, revoke_packet, sizeof(struct nvsp_message),
@@ -305,6 +312,8 @@ static int netvsc_init_buf(struct hv_device *device, init_packet->msg.v1_msg. send_recv_buf.id =NETVSC_RECEIVE_BUFFER_ID ; +trace_nvsp_send (ndev, init_packet); +/* Send the gpadl notification request */ ret = vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message),
@@ -384,6 +393,8 @@ static int netvsc_init_buf(struct hv_device *device, net_device->send_buf_gpadl_handle; init_packet->msg.v1_msg.send_send_buf.id =NETVSC_SEND_BUFFER_ID ; +trace_nvsp_send (ndev, init_packet); +/* Send the gpadl notification request */ ret = vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message),
@@ -452,6 +463,8 @@ static int negotiate_nvsp_ver(struct hv_device *device, init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver; init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver; +trace_nvsp_send (ndev, init_packet); +/* Send the init request */ ret = vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message),
@@ -484,6 +497,8 @@ static int negotiate_nvsp_ver(struct hv_device *device, init_packet->msg.v2_msg.send_ndis_config.capability.teaming =1 ; } +trace_nvsp_send (ndev, init_packet); + ret = vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message), (unsigned long)init_packet,
@@ -496,6 +511,7 @@ static int netvsc_connect_vsp(struct hv_device *device,struct netvsc_device *net_device, const struct netvsc_device_info *device_info) { + struct net_device *ndev = hv_get_drvdata(device); static const u32 ver_list[] = { NVSP_PROTOCOL_VERSION_1, NVSP_PROTOCOL_VERSION_2, NVSP_PROTOCOL_VERSION_4, NVSP_PROTOCOL_VERSION_5
@@ -536,6 +552,8 @@ static int netvsc_connect_vsp(struct hv_device *device, send_ndis_ver.ndis_minor_ver = ndis_version &0xFFFF ; +trace_nvsp_send (ndev, init_packet); +/* Send the init request */ ret = vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message),
@@ -747,7 +765,7 @@ static inline int netvsc_send_pkt( struct sk_buff *skb) {struct nvsp_message nvmsg; -struct nvsp_1_message_send_rndis_packet *const rpkt = +struct nvsp_1_message_send_rndis_packet *rpkt = &nvmsg.msg.v1_msg.send_rndis_pkt;struct netvsc_channel *const nvchan = &net_device->chan_table[packet->q_idx];
@@ -776,6 +794,8 @@ static inline int netvsc_send_pkt(if (out_channel->rescind)return -ENODEV ; +trace_nvsp_send_pkt (ndev, out_channel, rpkt); +if (packet->page_buf_cnt) {if (packet->cp_partial) pb += packet->rmsg_pgcnt;
@@ -1079,6 +1099,8 @@ static int netvsc_receive(struct net_device *ndev, + vmxferpage_packet->ranges[i].byte_offset;u32 buflen = vmxferpage_packet->ranges[i].byte_count; +trace_rndis_recv (ndev, q_idx, data); +/* Pass it to the upper layer */ status =rndis_filter_receive (ndev, net_device, channel, data, buflen);
@@ -1143,6 +1165,8 @@ static int netvsc_process_raw_pkt(struct hv_device *device,struct net_device_context *net_device_ctx =netdev_priv (ndev);struct nvsp_message *nvmsg =hv_pkt_data (desc); +trace_nvsp_recv (ndev, channel, nvmsg); +switch (desc->type) {case VM_PKT_COMP : netvsc_send_completion(net_device, channel, device,
drivers/net/hyperv/netvsc_trace.c new file +7 -0
@@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include <linux/netdevice.h> + +#include "hyperv_net.h" + +#define CREATE_TRACE_POINTS +#include "netvsc_trace.h"
drivers/net/hyperv/netvsc_trace.h new file +182 -0
182 lines not on this page · raw message
drivers/net/hyperv/rndis_filter.c +5 -0
@@ -31,6 +31,7 @@#include <linux/rtnetlink.h> #include "hyperv_net.h" +#include "netvsc_trace.h" static void rndis_set_multicast (struct work_struct *w);
@@ -241,6 +242,8 @@ static int rndis_filter_send_request(struct rndis_device *dev, pb[0 ].len; } +trace_rndis_send (dev->ndev,0 , &req->request_msg); +rcu_read_lock_bh (); ret =netvsc_send (dev->ndev, packet,NULL , pb,NULL );rcu_read_unlock_bh ();
@@ -1087,6 +1090,8 @@ void rndis_set_subchannel(struct work_struct *w) init_packet->msg.v5_msg.subchn_req.op =NVSP_SUBCHANNEL_ALLOCATE ; init_packet->msg.v5_msg.subchn_req.num_subchannels = nvdev->num_chn -1 ; +trace_nvsp_send (ndev, init_packet); + ret = vmbus_sendpacket(hv_dev->channel, init_packet, sizeof(struct nvsp_message), (unsigned long)init_packet,
Signature · 1 line
2.16.2
David Miller
maintainerFrom: Stephen Hemminger <[email protected]>
Date: Fri, 16 Mar 2018 15:44:26 -0700
Quoted 1 line
A couple of small things for net-next
Series applied, thanks Stephen.