aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/hyperv_vmbus.h
diff options
context:
space:
mode:
authorDexuan Cui <decui@microsoft.com>2015-03-27 12:10:08 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-04-03 10:18:01 -0400
commit652594c7dfd9bf6392e3a727bc69d89a2562d953 (patch)
tree6f40c87328a8d8e2880d8a4a6feb3f3fdb1c6caf /drivers/hv/hyperv_vmbus.h
parent01081f5ab9916603555f236b11f76bb00e4e01e9 (diff)
hv: run non-blocking message handlers in the dispatch tasklet
A work item in vmbus_connection.work_queue can sleep, waiting for a new host message (usually it is some kind of "completion" message). Currently the new message will be handled in the same workqueue, but since work items in the workqueue is serialized, we actually have no chance to handle the new message if the current work item is sleeping -- as as result, the current work item will hang forever. K. Y. has posted the below fix to resolve the issue: Drivers: hv: vmbus: Perform device register in the per-channel work element Actually we can simplify the fix by directly running non-blocking message handlers in the dispatch tasklet (inspired by K. Y.). This patch is the fundamental change. The following 2 patches will simplify the message offering and rescind-offering handling a lot. Signed-off-by: Dexuan Cui <decui@microsoft.com> Cc: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv/hyperv_vmbus.h')
-rw-r--r--drivers/hv/hyperv_vmbus.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index c8e27e0fdc99..f40a5a935ab6 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -685,6 +685,23 @@ struct vmbus_msginfo {
685 685
686extern struct vmbus_connection vmbus_connection; 686extern struct vmbus_connection vmbus_connection;
687 687
688enum vmbus_message_handler_type {
689 /* The related handler can sleep. */
690 VMHT_BLOCKING = 0,
691
692 /* The related handler must NOT sleep. */
693 VMHT_NON_BLOCKING = 1,
694};
695
696struct vmbus_channel_message_table_entry {
697 enum vmbus_channel_message_type message_type;
698 enum vmbus_message_handler_type handler_type;
699 void (*message_handler)(struct vmbus_channel_message_header *msg);
700};
701
702extern struct vmbus_channel_message_table_entry
703 channel_message_table[CHANNELMSG_COUNT];
704
688/* General vmbus interface */ 705/* General vmbus interface */
689 706
690struct hv_device *vmbus_device_create(const uuid_le *type, 707struct hv_device *vmbus_device_create(const uuid_le *type,