hyper-v: Use fast hypercall for HVCALL_SIGNAL_EVENT
authorVitaly Kuznetsov <vkuznets@redhat.com>
Wed, 2 Aug 2017 16:09:16 +0000 (18:09 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 10 Aug 2017 14:50:22 +0000 (16:50 +0200)
We need to pass only 8 bytes of input for HvSignalEvent which makes it a
perfect fit for fast hypercall. hv_input_signal_event_buffer is not needed
any more and hv_input_signal_event is converted to union for convenience.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Jork Loeser <Jork.Loeser@microsoft.com>
Cc: K. Y. Srinivasan <kys@microsoft.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Simon Xiao <sixiao@microsoft.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: devel@linuxdriverproject.org
Link: http://lkml.kernel.org/r/20170802160921.21791-5-vkuznets@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
drivers/hv/channel_mgmt.c
drivers/hv/connection.c
include/linux/hyperv.h

index 4bbb8dea472721505db0e9eb4260e3dadde87126..fd2b6c67f78121c820dacf677f21a2be57103405 100644 (file)
@@ -805,21 +805,12 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
        /*
         * Setup state for signalling the host.
         */
-       newchannel->sig_event = (struct hv_input_signal_event *)
-                               (ALIGN((unsigned long)
-                               &newchannel->sig_buf,
-                               HV_HYPERCALL_PARAM_ALIGN));
-
-       newchannel->sig_event->connectionid.asu32 = 0;
-       newchannel->sig_event->connectionid.u.id = VMBUS_EVENT_CONNECTION_ID;
-       newchannel->sig_event->flag_number = 0;
-       newchannel->sig_event->rsvdz = 0;
+       newchannel->sig_event = VMBUS_EVENT_CONNECTION_ID;
 
        if (vmbus_proto_version != VERSION_WS2008) {
                newchannel->is_dedicated_interrupt =
                                (offer->is_dedicated_interrupt != 0);
-               newchannel->sig_event->connectionid.u.id =
-                               offer->connection_id;
+               newchannel->sig_event = offer->connection_id;
        }
 
        memcpy(&newchannel->offermsg, offer,
index 45e806e3112fa62f423c6c7c91ed39167d39d53e..37ecf514189e9a5d490489720f85cee7984a324f 100644 (file)
@@ -408,6 +408,6 @@ void vmbus_set_event(struct vmbus_channel *channel)
        if (!channel->is_dedicated_interrupt)
                vmbus_send_interrupt(child_relid);
 
-       hv_do_hypercall(HVCALL_SIGNAL_EVENT, channel->sig_event, NULL);
+       hv_do_fast_hypercall8(HVCALL_SIGNAL_EVENT, channel->sig_event);
 }
 EXPORT_SYMBOL_GPL(vmbus_set_event);
index 6608a71e7d791c941f74fe2ad1cf8c2885721098..c472bd43bdd7a666b1f16d57bf1f767901216121 100644 (file)
@@ -677,18 +677,6 @@ union hv_connection_id {
        } u;
 };
 
-/* Definition of the hv_signal_event hypercall input structure. */
-struct hv_input_signal_event {
-       union hv_connection_id connectionid;
-       u16 flag_number;
-       u16 rsvdz;
-};
-
-struct hv_input_signal_event_buffer {
-       u64 align8;
-       struct hv_input_signal_event event;
-};
-
 enum hv_numa_policy {
        HV_BALANCED = 0,
        HV_LOCALIZED,
@@ -770,8 +758,7 @@ struct vmbus_channel {
        } callback_mode;
 
        bool is_dedicated_interrupt;
-       struct hv_input_signal_event_buffer sig_buf;
-       struct hv_input_signal_event *sig_event;
+       u64 sig_event;
 
        /*
         * Starting with win8, this field will be used to specify