Re: [PULL net (try 2)] vhost-net: zercopy mode fixes
From: "Michael S. Tsirkin" Date: Fri, 22 Jul 2011 09:32:38 +0300 > Fixing a corrupted pull request sent earlier. > Sorry about the noise! > > The following includes vhost-net fixes - both in the > experimental zero copy mode. > Please pull for 3.1. Pulled, thanks! ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PULL net (try 2)] vhost-net: zercopy mode fixes
Fixing a corrupted pull request sent earlier. Sorry about the noise! The following includes vhost-net fixes - both in the experimental zero copy mode. Please pull for 3.1. Thanks! The following changes since commit fd99beb9375b44309d5ed9c2b62063e23151610b: Merge branch 'vhost-net-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost (2011-07-19 10:12:44 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost-net-next Michael S. Tsirkin (1): vhost-net: update used ring on backend change Shirley Ma (1): vhost: handle wrap around in # of bufs math drivers/vhost/net.c | 18 ++ 1 files changed, 14 insertions(+), 4 deletions(-) ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PULL net] vhost-net: zercopy mode fixes
From: "Michael S. Tsirkin" Date: Fri, 22 Jul 2011 09:00:46 +0300 > The following includes vhost-net fixes - both in the > experimental zero copy mode. > Please pull for 3.1. > Thanks! > Where is this "the following"? I don't see any GIT url to pull from or anything :-) ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PULL net] vhost-net: zercopy mode fixes
The following includes vhost-net fixes - both in the experimental zero copy mode. Please pull for 3.1. Thanks! ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PATCH repost] Fix panic in virtnet_remove
From: "Michael S. Tsirkin" Date: Wed, 20 Jul 2011 17:31:15 +0300 > On Wed, Jul 20, 2011 at 07:26:02PM +0530, Krishna Kumar wrote: >> Fix a panic in virtnet_remove. unregister_netdev has already >> freed up the netdev (and virtnet_info) due to dev->destructor >> being set, while virtnet_info is still required. Remove >> virtnet_free altogether, and move the freeing of the per-cpu >> statistics from virtnet_free to virtnet_remove. >> >> Tested patch below. >> >> Signed-off-by: Krishna Kumar > > Also note that the crash was apparently introduced by > 3fa2a1df909482cc234524906e4bd30dee3514df in net-next, > so this is a net-next only patch. > > Stephen, was there any special reason to free the memory > in the destructor like you did? > > Acked-by: Michael S. Tsirkin Applied. ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PATCH 2/9] staging: hv: add newline to log messages in netvsc
On Thu, 2011-07-21 at 10:14 -0700, Haiyang Zhang wrote: > Signed-off-by: Haiyang Zhang > Signed-off-by: K. Y. Srinivasan Just noticing some trivial typos... > diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c [] > @@ -246,7 +246,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", initialization [] > @@ -738,7 +738,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", satisfy ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 5/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 c8e2f24..816e382 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -350,19 +350,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 */ @@ -374,11 +361,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 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 4/9] 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 Signed-off-by: K. Y. Srinivasan Cc: stable --- 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 7b9d9ca..c8e2f24 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -216,8 +216,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 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 2/9] staging: hv: add newline to log messages in netvsc
Signed-off-by: Haiyang Zhang Signed-off-by: K. Y. Srinivasan --- drivers/staging/hv/netvsc.c | 58 +++--- drivers/staging/hv/netvsc_drv.c |2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index c3cc880..0eda326 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -139,7 +139,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; } } @@ -154,7 +154,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; @@ -186,7 +186,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; } @@ -195,7 +195,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; } @@ -210,7 +210,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; } @@ -234,7 +234,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; } @@ -246,7 +246,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; @@ -302,7 +302,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; } @@ -401,7 +401,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); } @@ -425,7 +425,7 @@ int netvsc_device_remove(struct hv_device *device) udelay(100); /* 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); @@ -451,7 +451,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
[PATCH 7/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 816e382..a15165e 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -192,7 +192,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 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 6/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 159c490..2b33e13 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -539,8 +539,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); put_net_device(device); return ret; } -- 1.6.3.2 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 9/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 3/9] staging: hv: convert dev_ to netdev_ in netvsc
Signed-off-by: Haiyang Zhang Signed-off-by: K. Y. Srinivasan --- 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 0eda326..159c490 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "hyperv_net.h" @@ -111,6 +112,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 @@ -138,7 +140,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; } @@ -153,7 +155,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; } @@ -182,10 +184,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; } @@ -194,7 +197,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; @@ -209,7 +212,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; } @@ -233,7 +236,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; } @@ -245,7 +248,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); @@ -298,10 +301,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; } @@ -400,7 +404,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, +
[PATCH 8/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 a15165e..818ddf8 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -142,12 +142,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 + @@ -196,7 +196,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 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 1/9] 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 Signed-off-by: K. Y. Srinivasan --- 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 16a80b1..c3cc880 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -29,7 +29,6 @@ #include #include -#include "hyperv.h" #include "hyperv_net.h" diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 474c5f0..1325de4 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -38,7 +38,6 @@ #include #include -#include "hyperv.h" #include "hyperv_net.h" static const char *driver_name = "netvsc"; 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 #include -#include "hyperv.h" #include "hyperv_net.h" -- 1.6.3.2 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 0/9] netvsc bug fixes and cleanups
Fixed a set of bugs in netvsc module, and cleaned up some coding style issues. Haiyang Zhang (9): staging: hv: remove unnecessary includes in netvsc staging: hv: add newline to log messages in netvsc staging: hv: convert dev_ to netdev_ 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 drivers/staging/hv/netvsc.c | 124 - drivers/staging/hv/netvsc_drv.c | 46 +++--- drivers/staging/hv/rndis_filter.c | 28 ++--- 3 files changed, 111 insertions(+), 87 deletions(-) ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization