Commit c3582a2c authored by Haiyang Zhang's avatar Haiyang Zhang Committed by David S. Miller

hyperv: Add support for vNIC hot removal

This patch adds proper handling of the vNIC hot removal event, which includes
a rescind-channel-offer message from the host side that triggers vNIC close and
removal. In this case, the notices to the host during close and removal is not
necessary because the channel is rescinded. This patch blocks these unnecessary
messages, and lets vNIC removal process complete normally.
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6867b17b
...@@ -517,6 +517,8 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr) ...@@ -517,6 +517,8 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
/* Just return here, no channel found */ /* Just return here, no channel found */
return; return;
channel->rescind = true;
/* work is initialized for vmbus_process_rescind_offer() from /* work is initialized for vmbus_process_rescind_offer() from
* vmbus_process_offer() where the channel got created */ * vmbus_process_offer() where the channel got created */
queue_work(channel->controlwq, &channel->work); queue_work(channel->controlwq, &channel->work);
......
...@@ -764,6 +764,9 @@ int netvsc_send(struct hv_device *device, ...@@ -764,6 +764,9 @@ int netvsc_send(struct hv_device *device,
out_channel = device->channel; out_channel = device->channel;
packet->channel = out_channel; packet->channel = out_channel;
if (out_channel->rescind)
return -ENODEV;
if (packet->page_buf_cnt) { if (packet->page_buf_cnt) {
ret = vmbus_sendpacket_pagebuffer(out_channel, ret = vmbus_sendpacket_pagebuffer(out_channel,
packet->page_buf, packet->page_buf,
......
...@@ -958,6 +958,9 @@ static int rndis_filter_close_device(struct rndis_device *dev) ...@@ -958,6 +958,9 @@ static int rndis_filter_close_device(struct rndis_device *dev)
return 0; return 0;
ret = rndis_filter_set_packet_filter(dev, 0); ret = rndis_filter_set_packet_filter(dev, 0);
if (ret == -ENODEV)
ret = 0;
if (ret == 0) if (ret == 0)
dev->state = RNDIS_DEV_INITIALIZED; dev->state = RNDIS_DEV_INITIALIZED;
......
...@@ -650,6 +650,8 @@ struct vmbus_channel { ...@@ -650,6 +650,8 @@ struct vmbus_channel {
u8 monitor_grp; u8 monitor_grp;
u8 monitor_bit; u8 monitor_bit;
bool rescind; /* got rescind msg */
u32 ringbuffer_gpadlhandle; u32 ringbuffer_gpadlhandle;
/* Allocated memory for ring buffer */ /* Allocated memory for ring buffer */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment