delphij 850d0994e4 hyperv: vmbus: run non-blocking message handlers in vmbus_msg_swintr()
We'll remove the per-channel control_work_queue because it can't properly
do serialization of message handling, e.g., when there are 2 NIC devices,
vmbus_channel_on_offer() -> hv_queue_work_item() has a race condition:
for an SMP VM, vmbus_channel_process_offer() can run concurrently on
different CPUs and if the second NIC's
vmbus_channel_process_offer() -> hv_vmbus_child_device_register() runs
first, the second NIC's name will be hn0 and the first NIC's name will
be hn1!

We can fix the race condition by removing the per-channel control_work_queue
and run all the message handlers in the global
hv_vmbus_g_connection.work_queue -- we'll do this in the next patch.

With the coming next patch, we have to run the non-blocking handlers
directly in the kernel thread vmbus_msg_swintr(), because the special
handling of sub-channel: when a sub-channel (e.g., of the storvsc driver)
is received and being handled in vmbus_channel_on_offer() running on the
global hv_vmbus_g_connection.work_queue, vmbus_channel_process_offer()
invokes channel->sc_creation_callback, i.e., storvsc_handle_sc_creation,
and the callback will invoke hv_vmbus_channel_open() -> hv_vmbus_post_message
and expect a further reply from the host, but the handling of the further
messag can't be done because the current message's handling hasn't finished
yet; as result, hv_vmbus_channel_open() -> sema_timedwait() will time out
and th device can't work.

Also renamed the handler type from hv_pfn_channel_msg_handler to
vmbus_msg_handler: the 'pfn' and 'channel' in the old name make no sense.

Submitted by:	Dexuan Cui <decui microsoft com>
Reviewed by:	royger
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D4596
2015-12-29 08:19:43 +00:00
..
2015-01-23 15:14:30 +00:00
2015-01-30 01:13:07 +00:00
2015-02-24 01:00:46 +00:00
2015-03-08 19:55:46 +00:00
2015-01-23 15:14:30 +00:00
2015-06-30 17:00:45 +00:00
2015-06-30 17:00:45 +00:00
2015-08-30 08:48:31 +00:00
2015-12-25 14:51:36 +00:00
2015-12-24 02:35:59 +00:00
2015-10-22 01:36:16 +00:00
2015-11-05 22:44:36 +00:00
2014-09-28 07:40:26 +00:00
2015-11-12 09:45:35 +00:00
2015-04-29 20:08:03 +00:00
2014-10-10 14:17:42 +00:00
2014-10-11 19:36:59 +00:00
2015-03-23 19:47:52 +00:00
2015-04-22 14:38:58 +00:00
2015-12-11 15:24:29 +00:00
2015-12-25 14:51:36 +00:00
2015-12-11 15:24:29 +00:00
2015-08-28 02:29:31 +00:00
2015-07-28 04:54:05 +00:00
2014-11-18 21:58:57 +00:00
2015-09-07 21:59:11 +00:00
2015-06-30 17:00:45 +00:00
2015-06-30 17:00:45 +00:00
2014-09-19 03:55:19 +00:00
2015-12-11 07:20:33 +00:00
2015-03-23 19:47:52 +00:00
2015-12-11 15:24:29 +00:00
2015-10-08 17:32:17 +00:00
2015-06-30 17:00:45 +00:00
2014-11-21 21:34:19 +00:00
2015-06-30 17:00:45 +00:00
2014-11-20 20:09:18 +00:00