diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2012-07-12 17:55:40 +0200 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2012-07-12 17:55:40 +0200 |
| commit | 9c63cd5a955ce8a3de1776a9e4b6b89c69b2a09e (patch) | |
| tree | 2b628ebdaeb63603d90c92e78bc5dd668856b61d /drivers/net/hyperv/netvsc.c | |
| parent | 8c203360a751ecbf876a8324e02c1dcbcc5dd548 (diff) | |
| parent | 34ae0dadb4e99e8177f9785e069e9cca636ef8c1 (diff) | |
| download | olio-linux-3.10-9c63cd5a955ce8a3de1776a9e4b6b89c69b2a09e.tar.xz olio-linux-3.10-9c63cd5a955ce8a3de1776a9e4b6b89c69b2a09e.zip | |
Merge tag 'imx-defconfig' of git://git.pengutronix.de/git/imx/linux-2.6 into next/defconfig
From Sascha Hauer <s.hauer@pengutronix.de>:
ARM i.MX defconfig updates for v3.6
* tag 'imx-defconfig' of git://git.pengutronix.de/git/imx/linux-2.6:
ARM: imx_v4_v5_defconfig: update features
ARM: imx_v6_v7_defconfig: update features
Includes an update to v3.5-rc5
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/net/hyperv/netvsc.c')
| -rw-r--r-- | drivers/net/hyperv/netvsc.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 8b919471472..0c569831db5 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -42,6 +42,7 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) if (!net_device) return NULL; + init_waitqueue_head(&net_device->wait_drain); net_device->start_remove = false; net_device->destroy = false; net_device->dev = device; @@ -387,12 +388,8 @@ int netvsc_device_remove(struct hv_device *device) spin_unlock_irqrestore(&device->channel->inbound_lock, flags); /* Wait for all send completions */ - while (atomic_read(&net_device->num_outstanding_sends)) { - dev_info(&device->device, - "waiting for %d requests to complete...\n", - atomic_read(&net_device->num_outstanding_sends)); - udelay(100); - } + wait_event(net_device->wait_drain, + atomic_read(&net_device->num_outstanding_sends) == 0); netvsc_disconnect_vsp(net_device); @@ -486,6 +483,9 @@ static void netvsc_send_completion(struct hv_device *device, num_outstanding_sends = atomic_dec_return(&net_device->num_outstanding_sends); + if (net_device->destroy && num_outstanding_sends == 0) + wake_up(&net_device->wait_drain); + if (netif_queue_stopped(ndev) && !net_device->start_remove && (hv_ringbuf_avail_percent(&device->channel->outbound) > RING_AVAIL_PERCENT_HIWATER || |