diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index e99400f3a..39339b152 100755 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1965,6 +1965,7 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) return 0; } +EXPORT_SYMBOL_GPL(vmbus_device_unregister); /* * vmbus_remove_channel_attr_group - remove the channel's attribute group diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c index a09e062b8..3343cac60 100755 --- a/drivers/uio/uio_hv_generic.c +++ b/drivers/uio/uio_hv_generic.c @@ -119,6 +119,14 @@ static void hv_uio_rescind(struct vmbus_channel *channel) /* Wake up reader */ uio_event_notify(&pdata->info); + + /* + * With rescind callback registered, rescind path will not unregister the device + * from vmbus when the primary channel is rescinded. + * Without it, rescind handling is incomplete and next onoffer msg does not come. + * Unregister the device from vmbus here. + */ + vmbus_device_unregister(channel->device_obj); } /* Sysfs API to allow mmap of the ring buffers