Fixed a set of bugs in netvsc module, and cleaned up some coding style issues. Haiyang Zhang (10): staging: hv: remove unnecessary includes in netvsc staging: hv: add newline to log messages in netvsc staging: hv: convert dev_<loglevel> to netdev_<loglevel> in netvsc staging: hv: fix a kernel warning in netvsc_linkstatus_callback() staging: hv: re-order the code in netvsc_probe() staging: hv: fix counting of #outstanding-sends in failed sends staging: hv: fix counting of available buffer slots when send fails staging: hv: fix the return status of netvsc_start_xmit() staging: hv: fix the page buffer when rndis data go across page boundary staging: hv: fix some typos in netvsc.c drivers/staging/hv/netvsc.c | 124 ++++++++++++++++++++----------------- drivers/staging/hv/netvsc_drv.c | 44 +++++++------ drivers/staging/hv/rndis_filter.c | 28 ++++++--- 3 files changed, 110 insertions(+), 86 deletions(-)
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 01/10] staging: hv: remove unnecessary includes in netvsc
hyperv.h is included by hyperv_net.h already, so no need to include it again in these C files. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc.c | 1 - drivers/staging/hv/netvsc_drv.c | 1 - drivers/staging/hv/rndis_filter.c | 1 - 3 files changed, 0 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 30d3139..9a9228c 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -28,7 +28,6 @@ #include <linux/io.h> #include <linux/slab.h> -#include "hyperv.h" #include "hyperv_net.h" diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 90a3198..30a0cb2 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -38,7 +38,6 @@ #include <net/sock.h> #include <net/pkt_sched.h> -#include "hyperv.h" #include "hyperv_net.h" struct net_device_context { diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index 6db48b9..8416bf2 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -27,7 +27,6 @@ #include <linux/if_ether.h> #include <linux/netdevice.h> -#include "hyperv.h" #include "hyperv_net.h" -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 02/10] staging: hv: add newline to log messages in netvsc
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc.c | 58 +++++++++++++++++++++--------------------- 1 files changed, 29 insertions(+), 29 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 9a9228c..ef764e6 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -108,7 +108,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) */ if (ret != 0) { dev_err(&net_device->dev->device, "unable to send " - "revoke receive buffer to netvsp"); + "revoke receive buffer to netvsp\n"); return ret; } } @@ -123,7 +123,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) */ if (ret != 0) { dev_err(&net_device->dev->device, - "unable to teardown receive buffer's gpadl"); + "unable to teardown receive buffer's gpadl\n"); return ret; } net_device->recv_buf_gpadl_handle = 0; @@ -155,7 +155,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) net_device = get_outbound_net_device(device); if (!net_device) { dev_err(&device->device, "unable to get net device..." - "device being destroyed?"); + "device being destroyed?\n"); return -ENODEV; } @@ -164,7 +164,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) get_order(net_device->recv_buf_size)); if (!net_device->recv_buf) { dev_err(&device->device, "unable to allocate receive " - "buffer of size %d", net_device->recv_buf_size); + "buffer of size %d\n", net_device->recv_buf_size); ret = -ENOMEM; goto cleanup; } @@ -179,7 +179,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) &net_device->recv_buf_gpadl_handle); if (ret != 0) { dev_err(&device->device, - "unable to establish receive buffer's gpadl"); + "unable to establish receive buffer's gpadl\n"); goto cleanup; } @@ -203,7 +203,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); if (ret != 0) { dev_err(&device->device, - "unable to send receive buffer's gpadl to netvsp"); + "unable to send receive buffer's gpadl to netvsp\n"); goto cleanup; } @@ -215,7 +215,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) if (init_packet->msg.v1_msg. send_recv_buf_complete.status != NVSP_STAT_SUCCESS) { dev_err(&device->device, "Unable to complete receive buffer " - "initialzation with NetVsp - status %d", + "initialzation with NetVsp - status %d\n", init_packet->msg.v1_msg. send_recv_buf_complete.status); ret = -EINVAL; @@ -270,7 +270,7 @@ static int netvsc_connect_vsp(struct hv_device *device) net_device = get_outbound_net_device(device); if (!net_device) { dev_err(&device->device, "unable to get net device..." - "device being destroyed?"); + "device being destroyed?\n"); return -ENODEV; } @@ -361,7 +361,7 @@ int netvsc_device_remove(struct hv_device *device) /* Wait for all send completions */ while (atomic_read(&net_device->num_outstanding_sends)) { dev_err(&device->device, - "waiting for %d requests to complete...", + "waiting for %d requests to complete...\n", atomic_read(&net_device->num_outstanding_sends)); udelay(100); } @@ -381,7 +381,7 @@ int netvsc_device_remove(struct hv_device *device) spin_unlock_irqrestore(&device->channel->inbound_lock, flags); /* At this point, no one should be accessing netDevice except in here */ - dev_notice(&device->device, "net device safe to remove"); + dev_notice(&device->device, "net device safe to remove\n"); /* Now, we can close the channel safely */ vmbus_close(device->channel); @@ -407,7 +407,7 @@ static void netvsc_send_completion(struct hv_device *device, net_device = get_inbound_net_device(device); if (!net_device) { dev_err(&device->device, "unable to get net device..." - "device being destroyed?"); + "device being destroyed?\n"); return; } @@ -436,7 +436,7 @@ static void netvsc_send_completion(struct hv_device *device, atomic_dec(&net_device->num_outstanding_sends); } else { dev_err(&device->device, "Unknown send completion packet type- " - "%d received!!", nvsp_packet->hdr.msg_type); + "%d received!!\n", nvsp_packet->hdr.msg_type); } } @@ -452,7 +452,7 @@ int netvsc_send(struct hv_device *device, net_device = get_outbound_net_device(device); if (!net_device) { dev_err(&device->device, "net device (%p) shutting down..." - "ignoring outbound packets", net_device); + "ignoring outbound packets\n", net_device); return -ENODEV; } @@ -487,7 +487,7 @@ int netvsc_send(struct hv_device *device, } if (ret != 0) - dev_err(&device->device, "Unable to send packet %p ret %d", + dev_err(&device->device, "Unable to send packet %p ret %d\n", packet, ret); atomic_inc(&net_device->num_outstanding_sends); @@ -520,19 +520,19 @@ retry_send_cmplt: /* no more room...wait a bit and attempt to retry 3 times */ retries++; dev_err(&device->device, "unable to send receive completion pkt" - " (tid %llx)...retrying %d", transaction_id, retries); + " (tid %llx)...retrying %d\n", transaction_id, retries); if (retries < 4) { udelay(100); goto retry_send_cmplt; } else { dev_err(&device->device, "unable to send receive " - "completion pkt (tid %llx)...give up retrying", + "completion pkt (tid %llx)...give up retrying\n", transaction_id); } } else { dev_err(&device->device, "unable to send receive " - "completion pkt - %llx", transaction_id); + "completion pkt - %llx\n", transaction_id); } } @@ -554,7 +554,7 @@ static void netvsc_receive_completion(void *context) net_device = get_inbound_net_device(device); if (!net_device) { dev_err(&device->device, "unable to get net device..." - "device being destroyed?"); + "device being destroyed?\n"); return; } @@ -605,7 +605,7 @@ static void netvsc_receive(struct hv_device *device, net_device = get_inbound_net_device(device); if (!net_device) { dev_err(&device->device, "unable to get net device..." - "device being destroyed?"); + "device being destroyed?\n"); return; } @@ -614,7 +614,7 @@ static void netvsc_receive(struct hv_device *device, * packet */ if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) { - dev_err(&device->device, "Unknown packet type received - %d", + dev_err(&device->device, "Unknown packet type received - %d\n", packet->type); return; } @@ -626,7 +626,7 @@ static void netvsc_receive(struct hv_device *device, if (nvsp_packet->hdr.msg_type ! NVSP_MSG1_TYPE_SEND_RNDIS_PKT) { dev_err(&device->device, "Unknown nvsp packet type received-" - " %d", nvsp_packet->hdr.msg_type); + " %d\n", nvsp_packet->hdr.msg_type); return; } @@ -634,7 +634,7 @@ static void netvsc_receive(struct hv_device *device, if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) { dev_err(&device->device, "Invalid xfer page set id - " - "expecting %x got %x", NETVSC_RECEIVE_BUFFER_ID, + "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID, vmxferpage_packet->xfer_pageset_id); return; } @@ -660,7 +660,7 @@ static void netvsc_receive(struct hv_device *device, */ if (count < 2) { dev_err(&device->device, "Got only %d netvsc pkt...needed " - "%d pkts. Dropping this xfer page packet completely!", + "%d pkts. Dropping this xfer page packet completely!\n", count, vmxferpage_packet->range_cnt + 1); /* Return it to the freelist */ @@ -687,7 +687,7 @@ static void netvsc_receive(struct hv_device *device, if (xferpage_packet->count != vmxferpage_packet->range_cnt) { dev_err(&device->device, "Needed %d netvsc pkts to satisy " - "this xfer page...got %d", + "this xfer page...got %d\n", vmxferpage_packet->range_cnt, xferpage_packet->count); } @@ -785,7 +785,7 @@ static void netvsc_channel_cb(void *context) net_device = get_inbound_net_device(device); if (!net_device) { dev_err(&device->device, "net device (%p) shutting down..." - "ignoring inbound packets", net_device); + "ignoring inbound packets\n", net_device); goto out; } @@ -836,7 +836,7 @@ static void netvsc_channel_cb(void *context) /* Try again next time around */ dev_err(&device->device, "unable to allocate buffer of size " - "(%d)!!", bytes_recvd); + "(%d)!!\n", bytes_recvd); break; } @@ -892,18 +892,18 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) netvsc_channel_cb, device); if (ret != 0) { - dev_err(&device->device, "unable to open channel: %d", ret); + dev_err(&device->device, "unable to open channel: %d\n", ret); goto cleanup; } /* Channel is opened */ - pr_info("hv_netvsc channel opened successfully"); + pr_info("hv_netvsc channel opened successfully\n"); /* Connect with the NetVsp */ ret = netvsc_connect_vsp(device); if (ret != 0) { dev_err(&device->device, - "unable to connect to NetVSP - %d", ret); + "unable to connect to NetVSP - %d\n", ret); goto close; } -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 03/10] staging: hv: convert dev_<loglevel> to netdev_<loglevel> in netvsc
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc.c | 68 +++++++++++++++++++++---------------- drivers/staging/hv/rndis_filter.c | 17 +++++---- 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index ef764e6..82b129b 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -27,6 +27,7 @@ #include <linux/delay.h> #include <linux/io.h> #include <linux/slab.h> +#include <linux/netdevice.h> #include "hyperv_net.h" @@ -80,6 +81,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) { struct nvsp_message *revoke_packet; int ret = 0; + struct net_device *ndev = dev_get_drvdata(&net_device->dev->device); /* * If we got a section count, it means we received a @@ -107,7 +109,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) * have a leak rather than continue and a bugchk */ if (ret != 0) { - dev_err(&net_device->dev->device, "unable to send " + netdev_err(ndev, "unable to send " "revoke receive buffer to netvsp\n"); return ret; } @@ -122,7 +124,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) * rather than continue and a bugchk */ if (ret != 0) { - dev_err(&net_device->dev->device, + netdev_err(ndev, "unable to teardown receive buffer's gpadl\n"); return ret; } @@ -151,10 +153,11 @@ static int netvsc_init_recv_buf(struct hv_device *device) int t; struct netvsc_device *net_device; struct nvsp_message *init_packet; + struct net_device *ndev = dev_get_drvdata(&device->device); net_device = get_outbound_net_device(device); if (!net_device) { - dev_err(&device->device, "unable to get net device..." + netdev_err(ndev, "unable to get net device..." "device being destroyed?\n"); return -ENODEV; } @@ -163,7 +166,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, get_order(net_device->recv_buf_size)); if (!net_device->recv_buf) { - dev_err(&device->device, "unable to allocate receive " + netdev_err(ndev, "unable to allocate receive " "buffer of size %d\n", net_device->recv_buf_size); ret = -ENOMEM; goto cleanup; @@ -178,7 +181,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) net_device->recv_buf_size, &net_device->recv_buf_gpadl_handle); if (ret != 0) { - dev_err(&device->device, + netdev_err(ndev, "unable to establish receive buffer's gpadl\n"); goto cleanup; } @@ -202,7 +205,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) VM_PKT_DATA_INBAND, VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); if (ret != 0) { - dev_err(&device->device, + netdev_err(ndev, "unable to send receive buffer's gpadl to netvsp\n"); goto cleanup; } @@ -214,7 +217,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) /* Check the response */ if (init_packet->msg.v1_msg. send_recv_buf_complete.status != NVSP_STAT_SUCCESS) { - dev_err(&device->device, "Unable to complete receive buffer " + netdev_err(ndev, "Unable to complete receive buffer " "initialzation with NetVsp - status %d\n", init_packet->msg.v1_msg. send_recv_buf_complete.status); @@ -266,10 +269,11 @@ static int netvsc_connect_vsp(struct hv_device *device) struct netvsc_device *net_device; struct nvsp_message *init_packet; int ndis_version; + struct net_device *ndev = dev_get_drvdata(&device->device); net_device = get_outbound_net_device(device); if (!net_device) { - dev_err(&device->device, "unable to get net device..." + netdev_err(ndev, "unable to get net device..." "device being destroyed?\n"); return -ENODEV; } @@ -360,7 +364,7 @@ int netvsc_device_remove(struct hv_device *device) /* Wait for all send completions */ while (atomic_read(&net_device->num_outstanding_sends)) { - dev_err(&device->device, + dev_info(&device->device, "waiting for %d requests to complete...\n", atomic_read(&net_device->num_outstanding_sends)); udelay(100); @@ -403,10 +407,11 @@ static void netvsc_send_completion(struct hv_device *device, struct netvsc_device *net_device; struct nvsp_message *nvsp_packet; struct hv_netvsc_packet *nvsc_packet; + struct net_device *ndev = dev_get_drvdata(&device->device); net_device = get_inbound_net_device(device); if (!net_device) { - dev_err(&device->device, "unable to get net device..." + netdev_err(ndev, "unable to get net device..." "device being destroyed?\n"); return; } @@ -435,7 +440,7 @@ static void netvsc_send_completion(struct hv_device *device, atomic_dec(&net_device->num_outstanding_sends); } else { - dev_err(&device->device, "Unknown send completion packet type- " + netdev_err(ndev, "Unknown send completion packet type- " "%d received!!\n", nvsp_packet->hdr.msg_type); } @@ -446,12 +451,12 @@ int netvsc_send(struct hv_device *device, { struct netvsc_device *net_device; int ret = 0; - struct nvsp_message sendMessage; + struct net_device *ndev = dev_get_drvdata(&device->device); net_device = get_outbound_net_device(device); if (!net_device) { - dev_err(&device->device, "net device (%p) shutting down..." + netdev_err(ndev, "net device (%p) shutting down..." "ignoring outbound packets\n", net_device); return -ENODEV; } @@ -487,7 +492,7 @@ int netvsc_send(struct hv_device *device, } if (ret != 0) - dev_err(&device->device, "Unable to send packet %p ret %d\n", + netdev_err(ndev, "Unable to send packet %p ret %d\n", packet, ret); atomic_inc(&net_device->num_outstanding_sends); @@ -500,6 +505,7 @@ static void netvsc_send_recv_completion(struct hv_device *device, struct nvsp_message recvcompMessage; int retries = 0; int ret; + struct net_device *ndev = dev_get_drvdata(&device->device); recvcompMessage.hdr.msg_type NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE; @@ -519,19 +525,19 @@ retry_send_cmplt: } else if (ret == -EAGAIN) { /* no more room...wait a bit and attempt to retry 3 times */ retries++; - dev_err(&device->device, "unable to send receive completion pkt" + netdev_err(ndev, "unable to send receive completion pkt" " (tid %llx)...retrying %d\n", transaction_id, retries); if (retries < 4) { udelay(100); goto retry_send_cmplt; } else { - dev_err(&device->device, "unable to send receive " + netdev_err(ndev, "unable to send receive " "completion pkt (tid %llx)...give up retrying\n", transaction_id); } } else { - dev_err(&device->device, "unable to send receive " + netdev_err(ndev, "unable to send receive " "completion pkt - %llx\n", transaction_id); } } @@ -545,6 +551,7 @@ static void netvsc_receive_completion(void *context) u64 transaction_id = 0; bool fsend_receive_comp = false; unsigned long flags; + struct net_device *ndev = dev_get_drvdata(&device->device); /* * Even though it seems logical to do a GetOutboundNetDevice() here to @@ -553,7 +560,7 @@ static void netvsc_receive_completion(void *context) */ net_device = get_inbound_net_device(device); if (!net_device) { - dev_err(&device->device, "unable to get net device..." + netdev_err(ndev, "unable to get net device..." "device being destroyed?\n"); return; } @@ -599,12 +606,13 @@ static void netvsc_receive(struct hv_device *device, int i, j; int count = 0, bytes_remain = 0; unsigned long flags; + struct net_device *ndev = dev_get_drvdata(&device->device); LIST_HEAD(listHead); net_device = get_inbound_net_device(device); if (!net_device) { - dev_err(&device->device, "unable to get net device..." + netdev_err(ndev, "unable to get net device..." "device being destroyed?\n"); return; } @@ -614,7 +622,7 @@ static void netvsc_receive(struct hv_device *device, * packet */ if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) { - dev_err(&device->device, "Unknown packet type received - %d\n", + netdev_err(ndev, "Unknown packet type received - %d\n", packet->type); return; } @@ -625,7 +633,7 @@ static void netvsc_receive(struct hv_device *device, /* Make sure this is a valid nvsp packet */ if (nvsp_packet->hdr.msg_type ! NVSP_MSG1_TYPE_SEND_RNDIS_PKT) { - dev_err(&device->device, "Unknown nvsp packet type received-" + netdev_err(ndev, "Unknown nvsp packet type received-" " %d\n", nvsp_packet->hdr.msg_type); return; } @@ -633,7 +641,7 @@ static void netvsc_receive(struct hv_device *device, vmxferpage_packet = (struct vmtransfer_page_packet_header *)packet; if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) { - dev_err(&device->device, "Invalid xfer page set id - " + netdev_err(ndev, "Invalid xfer page set id - " "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID, vmxferpage_packet->xfer_pageset_id); return; @@ -659,7 +667,7 @@ static void netvsc_receive(struct hv_device *device, * some of the xfer page packet ranges... */ if (count < 2) { - dev_err(&device->device, "Got only %d netvsc pkt...needed " + netdev_err(ndev, "Got only %d netvsc pkt...needed " "%d pkts. Dropping this xfer page packet completely!\n", count, vmxferpage_packet->range_cnt + 1); @@ -686,7 +694,7 @@ static void netvsc_receive(struct hv_device *device, xferpage_packet->count = count - 1; if (xferpage_packet->count != vmxferpage_packet->range_cnt) { - dev_err(&device->device, "Needed %d netvsc pkts to satisy " + netdev_err(ndev, "Needed %d netvsc pkts to satisy " "this xfer page...got %d\n", vmxferpage_packet->range_cnt, xferpage_packet->count); } @@ -775,6 +783,7 @@ static void netvsc_channel_cb(void *context) struct vmpacket_descriptor *desc; unsigned char *buffer; int bufferlen = NETVSC_PACKET_SIZE; + struct net_device *ndev = dev_get_drvdata(&device->device); packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char), GFP_ATOMIC); @@ -784,7 +793,7 @@ static void netvsc_channel_cb(void *context) net_device = get_inbound_net_device(device); if (!net_device) { - dev_err(&device->device, "net device (%p) shutting down..." + netdev_err(ndev, "net device (%p) shutting down..." "ignoring inbound packets\n", net_device); goto out; } @@ -805,7 +814,7 @@ static void netvsc_channel_cb(void *context) break; default: - dev_err(&device->device, + netdev_err(ndev, "unhandled packet type %d, " "tid %llx len %d\n", desc->type, request_id, @@ -834,7 +843,7 @@ static void netvsc_channel_cb(void *context) buffer = kmalloc(bytes_recvd, GFP_ATOMIC); if (buffer == NULL) { /* Try again next time around */ - dev_err(&device->device, + netdev_err(ndev, "unable to allocate buffer of size " "(%d)!!\n", bytes_recvd); break; @@ -861,6 +870,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) ((struct netvsc_device_info *)additional_info)->ring_size; struct netvsc_device *net_device; struct hv_netvsc_packet *packet, *pos; + struct net_device *ndev = dev_get_drvdata(&device->device); net_device = alloc_net_device(device); if (!net_device) { @@ -892,7 +902,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) netvsc_channel_cb, device); if (ret != 0) { - dev_err(&device->device, "unable to open channel: %d\n", ret); + netdev_err(ndev, "unable to open channel: %d\n", ret); goto cleanup; } @@ -902,7 +912,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) /* Connect with the NetVsp */ ret = netvsc_connect_vsp(device); if (ret != 0) { - dev_err(&device->device, + netdev_err(ndev, "unable to connect to NetVSP - %d\n", ret); goto close; } diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index 8416bf2..20e673d 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -249,6 +249,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev, struct rndis_request *request = NULL; bool found = false; unsigned long flags; + struct net_device *ndev = dev_get_drvdata(&dev->net_dev->dev->device); spin_lock_irqsave(&dev->request_lock, flags); list_for_each_entry(request, &dev->req_list, list_ent) { @@ -269,7 +270,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev, memcpy(&request->response_msg, resp, resp->msg_len); } else { - dev_err(&dev->net_dev->dev->device, + netdev_err(ndev, "rndis response buffer overflow " "detected (size %u max %zu)\n", resp->msg_len, @@ -289,7 +290,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev, complete(&request->wait_event); } else { - dev_err(&dev->net_dev->dev->device, + netdev_err(ndev, "no rndis request found for this response " "(id 0x%x res type 0x%x)\n", resp->msg.init_complete.req_id, @@ -349,20 +350,21 @@ int rndis_filter_receive(struct hv_device *dev, struct rndis_device *rndis_dev; struct rndis_message rndis_msg; struct rndis_message *rndis_hdr; + struct net_device *ndev = dev_get_drvdata(&dev->device); if (!net_dev) return -EINVAL; /* Make sure the rndis device state is initialized */ if (!net_dev->extension) { - dev_err(&dev->device, "got rndis message but no rndis device - " + netdev_err(ndev, "got rndis message but no rndis device - " "dropping this message!\n"); return -ENODEV; } rndis_dev = (struct rndis_device *)net_dev->extension; if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) { - dev_err(&dev->device, "got rndis message but rndis device " + netdev_err(ndev, "got rndis message but rndis device " "uninitialized...dropping this message!\n"); return -ENODEV; } @@ -376,7 +378,7 @@ int rndis_filter_receive(struct hv_device *dev, /* Make sure we got a valid rndis message */ if ((rndis_hdr->ndis_msg_type != REMOTE_NDIS_PACKET_MSG) && (rndis_hdr->msg_len > sizeof(struct rndis_message))) { - dev_err(&dev->device, "incoming rndis message buffer overflow " + netdev_err(ndev, "incoming rndis message buffer overflow " "detected (got %u, max %zu)..marking it an error!\n", rndis_hdr->msg_len, sizeof(struct rndis_message)); @@ -409,7 +411,7 @@ int rndis_filter_receive(struct hv_device *dev, rndis_filter_receive_indicate_status(rndis_dev, &rndis_msg); break; default: - dev_err(&dev->device, + netdev_err(ndev, "unhandled rndis message (type %u len %u)\n", rndis_msg.ndis_msg_type, rndis_msg.msg_len); @@ -505,6 +507,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, struct rndis_set_complete *set_complete; u32 status; int ret, t; + struct net_device *ndev = dev_get_drvdata(&dev->net_dev->dev->device); request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG, RNDIS_MESSAGE_SIZE(struct rndis_set_request) + @@ -530,7 +533,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, t = wait_for_completion_timeout(&request->wait_event, 5*HZ); if (t == 0) { - dev_err(&dev->net_dev->dev->device, + netdev_err(ndev, "timeout before we got a set response...\n"); /* * We can't deallocate the request since we may still receive a -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 04/10] staging: hv: fix a kernel warning in netvsc_linkstatus_callback()
netif_notify_peers() caused a kernel warning in netvsc_linkstatus_callback(), because netvsc_linkstatus_callback() is within IRQ context. So we move the first call to netif_notify_peers() into queued work as well, but with zero delay. In addition to "staging-next", this should also be back-ported to stable kernels 2.6.32 and later. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Cc: stable <stable at kernel.org> --- drivers/staging/hv/netvsc_drv.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 30a0cb2..e6513be 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -214,8 +214,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, if (status == 1) { netif_carrier_on(net); netif_wake_queue(net); - netif_notify_peers(net); ndev_ctx = netdev_priv(net); + schedule_delayed_work(&ndev_ctx->dwork, 0); schedule_delayed_work(&ndev_ctx->dwork, msecs_to_jiffies(20)); } else { netif_carrier_off(net); -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 05/10] staging: hv: re-order the code in netvsc_probe()
Re-order the code in netvsc_probe() to prevent a guest crash caused by packets possibly received from NetVSP before call to register_netdev(). Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index e6513be..b49a08f 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -348,19 +348,6 @@ static int netvsc_probe(struct hv_device *dev) dev_set_drvdata(&dev->device, net); INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp); - /* Notify the netvsc driver of the new device */ - device_info.ring_size = ring_size; - ret = rndis_filter_device_add(dev, &device_info); - if (ret != 0) { - free_netdev(net); - dev_set_drvdata(&dev->device, NULL); - return ret; - } - - netif_carrier_on(net); - - memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); - net->netdev_ops = &device_ops; /* TODO: Add GSO and Checksum offload */ @@ -372,11 +359,26 @@ static int netvsc_probe(struct hv_device *dev) ret = register_netdev(net); if (ret != 0) { - /* Remove the device and release the resource */ - rndis_filter_device_remove(dev); + pr_err("Unable to register netdev.\n"); free_netdev(net); + goto out; } + /* Notify the netvsc driver of the new device */ + device_info.ring_size = ring_size; + ret = rndis_filter_device_add(dev, &device_info); + if (ret != 0) { + netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); + unregister_netdev(net); + free_netdev(net); + dev_set_drvdata(&dev->device, NULL); + return ret; + } + memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); + + netif_carrier_on(net); + +out: return ret; } -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 06/10] staging: hv: fix counting of #outstanding-sends in failed sends
If the packet failed to be sent, we shouldn't count it as the number of outstanding sends. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 82b129b..efbc8a0 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -494,8 +494,9 @@ int netvsc_send(struct hv_device *device, if (ret != 0) netdev_err(ndev, "Unable to send packet %p ret %d\n", packet, ret); + else + atomic_inc(&net_device->num_outstanding_sends); - atomic_inc(&net_device->num_outstanding_sends); return ret; } -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 07/10] staging: hv: fix counting of available buffer slots when send fails
Because the number of available buffer slots doesn't decrease for failed sends, we should not call netvsc_xmit_completion(), which increase the count of available slots. In this failed case, just free the memory is enough. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index b49a08f..81e3c49 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -190,7 +190,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) } else { /* we are shutting down or bus overloaded, just drop packet */ net->stats.tx_dropped++; - netvsc_xmit_completion(packet); + kfree(packet); + dev_kfree_skb_any(skb); } return NETDEV_TX_OK; -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 08/10] staging: hv: fix the return status of netvsc_start_xmit()
Fix the return status, so the upper layer will retry if transmission fails. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 81e3c49..30b9c80 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -140,12 +140,12 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) (num_pages * sizeof(struct hv_page_buffer)) + sizeof(struct rndis_filter_packet), GFP_ATOMIC); if (!packet) { - /* out of memory, silently drop packet */ + /* out of memory, drop packet */ netdev_err(net, "unable to allocate hv_netvsc_packet\n"); dev_kfree_skb(skb); net->stats.tx_dropped++; - return NETDEV_TX_OK; + return NETDEV_TX_BUSY; } packet->extension = (void *)(unsigned long)packet + @@ -194,7 +194,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) dev_kfree_skb_any(skb); } - return NETDEV_TX_OK; + return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK; } /* -- 1.6.3.2
Haiyang Zhang
2011-Sep-01 19:19 UTC
[PATCH 09/10] staging: hv: fix the page buffer when rndis data go across page boundary
In rndis_filter_receive_data(), we need to drop the 0th page and move the rest of pages forward if the rndis data go across page boundary, otherwise the page offset will overflow. Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/rndis_filter.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index 20e673d..b325345 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -323,6 +323,7 @@ static void rndis_filter_receive_data(struct rndis_device *dev, { struct rndis_packet *rndis_pkt; u32 data_offset; + int i; rndis_pkt = &msg->msg.pkt; @@ -338,6 +339,15 @@ static void rndis_filter_receive_data(struct rndis_device *dev, pkt->page_buf[0].offset += data_offset; pkt->page_buf[0].len -= data_offset; + /* Drop the 0th page, if rndis data go beyond page boundary */ + if (pkt->page_buf[0].offset >= PAGE_SIZE) { + pkt->page_buf[1].offset = pkt->page_buf[0].offset - PAGE_SIZE; + pkt->page_buf[1].len -= pkt->page_buf[1].offset; + pkt->page_buf_cnt--; + for (i = 0; i < pkt->page_buf_cnt; i++) + pkt->page_buf[i] = pkt->page_buf[i+1]; + } + pkt->is_data_pkt = true; netvsc_recv_callback(dev->net_dev->dev, pkt); -- 1.6.3.2
Reported-by: Joe Perches <joe at perches.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> --- drivers/staging/hv/netvsc.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index efbc8a0..115629f 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -218,7 +218,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) if (init_packet->msg.v1_msg. send_recv_buf_complete.status != NVSP_STAT_SUCCESS) { netdev_err(ndev, "Unable to complete receive buffer " - "initialzation with NetVsp - status %d\n", + "initialization with NetVsp - status %d\n", init_packet->msg.v1_msg. send_recv_buf_complete.status); ret = -EINVAL; @@ -695,7 +695,7 @@ static void netvsc_receive(struct hv_device *device, xferpage_packet->count = count - 1; if (xferpage_packet->count != vmxferpage_packet->range_cnt) { - netdev_err(ndev, "Needed %d netvsc pkts to satisy " + netdev_err(ndev, "Needed %d netvsc pkts to satisfy " "this xfer page...got %d\n", vmxferpage_packet->range_cnt, xferpage_packet->count); } -- 1.6.3.2