Drivers: hv: vmbus: teardown hv_vmbus_con workqueue and vmbus_connection pages on...
[firefly-linux-kernel-4.4.55.git] / drivers / hv / connection.c
index a63a795300b9ebbec393154fdfdce27e38ad3b0c..c4acd1ce7c0c21852a61f37605804b7a74276407 100644 (file)
@@ -216,10 +216,21 @@ int vmbus_connect(void)
 
 cleanup:
        pr_err("Unable to connect to host\n");
+
        vmbus_connection.conn_state = DISCONNECTED;
+       vmbus_disconnect();
+
+       kfree(msginfo);
+
+       return ret;
+}
 
-       if (vmbus_connection.work_queue)
+void vmbus_disconnect(void)
+{
+       if (vmbus_connection.work_queue) {
+               drain_workqueue(vmbus_connection.work_queue);
                destroy_workqueue(vmbus_connection.work_queue);
+       }
 
        if (vmbus_connection.int_page) {
                free_pages((unsigned long)vmbus_connection.int_page, 0);
@@ -230,10 +241,6 @@ cleanup:
        free_pages((unsigned long)vmbus_connection.monitor_pages[1], 0);
        vmbus_connection.monitor_pages[0] = NULL;
        vmbus_connection.monitor_pages[1] = NULL;
-
-       kfree(msginfo);
-
-       return ret;
 }
 
 /*