Source
183
183
__u32 version;
184
184
185
185
/* Initialize the vmbus connection */
186
186
vmbus_connection.conn_state = CONNECTING;
187
187
vmbus_connection.work_queue = create_workqueue("hv_vmbus_con");
188
188
if (!vmbus_connection.work_queue) {
189
189
ret = -ENOMEM;
190
190
goto cleanup;
191
191
}
192
192
193
+
vmbus_connection.handle_primary_chan_wq =
194
+
create_workqueue("hv_pri_chan");
195
+
if (!vmbus_connection.handle_primary_chan_wq) {
196
+
ret = -ENOMEM;
197
+
goto cleanup;
198
+
}
199
+
200
+
vmbus_connection.handle_sub_chan_wq =
201
+
create_workqueue("hv_sub_chan");
202
+
if (!vmbus_connection.handle_sub_chan_wq) {
203
+
ret = -ENOMEM;
204
+
goto cleanup;
205
+
}
206
+
193
207
INIT_LIST_HEAD(&vmbus_connection.chn_msg_list);
194
208
spin_lock_init(&vmbus_connection.channelmsg_lock);
195
209
196
210
INIT_LIST_HEAD(&vmbus_connection.chn_list);
197
211
mutex_init(&vmbus_connection.channel_mutex);
198
212
199
213
/*
200
214
* Setup the vmbus event connection for channel interrupt
201
215
* abstraction stuff
202
216
*/
273
287
return ret;
274
288
}
275
289
276
290
void vmbus_disconnect(void)
277
291
{
278
292
/*
279
293
* First send the unload request to the host.
280
294
*/
281
295
vmbus_initiate_unload(false);
282
296
283
-
if (vmbus_connection.work_queue) {
284
-
drain_workqueue(vmbus_connection.work_queue);
297
+
if (vmbus_connection.handle_sub_chan_wq)
298
+
destroy_workqueue(vmbus_connection.handle_sub_chan_wq);
299
+
300
+
if (vmbus_connection.handle_primary_chan_wq)
301
+
destroy_workqueue(vmbus_connection.handle_primary_chan_wq);
302
+
303
+
if (vmbus_connection.work_queue)
285
304
destroy_workqueue(vmbus_connection.work_queue);
286
-
}
287
305
288
306
if (vmbus_connection.int_page) {
289
307
free_pages((unsigned long)vmbus_connection.int_page, 0);
290
308
vmbus_connection.int_page = NULL;
291
309
}
292
310
293
311
free_pages((unsigned long)vmbus_connection.monitor_pages[0], 0);
294
312
free_pages((unsigned long)vmbus_connection.monitor_pages[1], 0);
295
313
vmbus_connection.monitor_pages[0] = NULL;
296
314
vmbus_connection.monitor_pages[1] = NULL;