|
@@ -740,51 +740,49 @@ static void vmbus_on_msg_dpc(unsigned long data)
|
|
|
struct vmbus_channel_message_table_entry *entry;
|
|
|
struct onmessage_work_context *ctx;
|
|
|
|
|
|
- while (1) {
|
|
|
- if (msg->header.message_type == HVMSG_NONE)
|
|
|
- /* no msg */
|
|
|
- break;
|
|
|
+ if (msg->header.message_type == HVMSG_NONE)
|
|
|
+ /* no msg */
|
|
|
+ return;
|
|
|
|
|
|
- hdr = (struct vmbus_channel_message_header *)msg->u.payload;
|
|
|
+ hdr = (struct vmbus_channel_message_header *)msg->u.payload;
|
|
|
|
|
|
- if (hdr->msgtype >= CHANNELMSG_COUNT) {
|
|
|
- WARN_ONCE(1, "unknown msgtype=%d\n", hdr->msgtype);
|
|
|
- goto msg_handled;
|
|
|
- }
|
|
|
+ if (hdr->msgtype >= CHANNELMSG_COUNT) {
|
|
|
+ WARN_ONCE(1, "unknown msgtype=%d\n", hdr->msgtype);
|
|
|
+ goto msg_handled;
|
|
|
+ }
|
|
|
|
|
|
- entry = &channel_message_table[hdr->msgtype];
|
|
|
- if (entry->handler_type == VMHT_BLOCKING) {
|
|
|
- ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
|
|
- if (ctx == NULL)
|
|
|
- continue;
|
|
|
+ entry = &channel_message_table[hdr->msgtype];
|
|
|
+ if (entry->handler_type == VMHT_BLOCKING) {
|
|
|
+ ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
|
|
+ if (ctx == NULL)
|
|
|
+ return;
|
|
|
|
|
|
- INIT_WORK(&ctx->work, vmbus_onmessage_work);
|
|
|
- memcpy(&ctx->msg, msg, sizeof(*msg));
|
|
|
+ INIT_WORK(&ctx->work, vmbus_onmessage_work);
|
|
|
+ memcpy(&ctx->msg, msg, sizeof(*msg));
|
|
|
|
|
|
- queue_work(vmbus_connection.work_queue, &ctx->work);
|
|
|
- } else
|
|
|
- entry->message_handler(hdr);
|
|
|
+ queue_work(vmbus_connection.work_queue, &ctx->work);
|
|
|
+ } else
|
|
|
+ entry->message_handler(hdr);
|
|
|
|
|
|
msg_handled:
|
|
|
- msg->header.message_type = HVMSG_NONE;
|
|
|
+ msg->header.message_type = HVMSG_NONE;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Make sure the write to MessageType (ie set to
|
|
|
+ * HVMSG_NONE) happens before we read the
|
|
|
+ * MessagePending and EOMing. Otherwise, the EOMing
|
|
|
+ * will not deliver any more messages since there is
|
|
|
+ * no empty slot
|
|
|
+ */
|
|
|
+ mb();
|
|
|
|
|
|
+ if (msg->header.message_flags.msg_pending) {
|
|
|
/*
|
|
|
- * Make sure the write to MessageType (ie set to
|
|
|
- * HVMSG_NONE) happens before we read the
|
|
|
- * MessagePending and EOMing. Otherwise, the EOMing
|
|
|
- * will not deliver any more messages since there is
|
|
|
- * no empty slot
|
|
|
+ * This will cause message queue rescan to
|
|
|
+ * possibly deliver another msg from the
|
|
|
+ * hypervisor
|
|
|
*/
|
|
|
- mb();
|
|
|
-
|
|
|
- if (msg->header.message_flags.msg_pending) {
|
|
|
- /*
|
|
|
- * This will cause message queue rescan to
|
|
|
- * possibly deliver another msg from the
|
|
|
- * hypervisor
|
|
|
- */
|
|
|
- wrmsrl(HV_X64_MSR_EOM, 0);
|
|
|
- }
|
|
|
+ wrmsrl(HV_X64_MSR_EOM, 0);
|
|
|
}
|
|
|
}
|
|
|
|