]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Drivers: hv: vmbus: Suport an API to send packet with additional control
authorK. Y. Srinivasan <kys@microsoft.com>
Sat, 28 Feb 2015 19:39:04 +0000 (11:39 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 Mar 2015 03:31:47 +0000 (19:31 -0800)
Implement an API that gives additional control on the what VMBUS flags will be
set as well as if the host needs to be signalled. This API will be
useful for clients that want to batch up requests to the host.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel.c
include/linux/hyperv.h

index f060d1f7bc991e8f03cecd2c2d703184d3863644..da53180f5eb43203dca3c15b4dc9fff7b7a8b7fe 100644 (file)
@@ -584,23 +584,9 @@ void vmbus_close(struct vmbus_channel *channel)
 }
 EXPORT_SYMBOL_GPL(vmbus_close);
 
-/**
- * vmbus_sendpacket() - Send the specified buffer on the given channel
- * @channel: Pointer to vmbus_channel structure.
- * @buffer: Pointer to the buffer you want to receive the data into.
- * @bufferlen: Maximum size of what the the buffer will hold
- * @requestid: Identifier of the request
- * @type: Type of packet that is being send e.g. negotiate, time
- * packet etc.
- *
- * Sends data in @buffer directly to hyper-v via the vmbus
- * This will send the data unparsed to hyper-v.
- *
- * Mainly used by Hyper-V drivers.
- */
-int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
+int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
                           u32 bufferlen, u64 requestid,
-                          enum vmbus_packet_type type, u32 flags)
+                          enum vmbus_packet_type type, u32 flags, bool kick_q)
 {
        struct vmpacket_descriptor desc;
        u32 packetlen = sizeof(struct vmpacket_descriptor) + bufferlen;
@@ -628,11 +614,34 @@ int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
 
        ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);
 
-       if (ret == 0 && signal)
+       if ((ret == 0) && kick_q && signal)
                vmbus_setevent(channel);
 
        return ret;
 }
+EXPORT_SYMBOL(vmbus_sendpacket_ctl);
+
+/**
+ * vmbus_sendpacket() - Send the specified buffer on the given channel
+ * @channel: Pointer to vmbus_channel structure.
+ * @buffer: Pointer to the buffer you want to receive the data into.
+ * @bufferlen: Maximum size of what the the buffer will hold
+ * @requestid: Identifier of the request
+ * @type: Type of packet that is being send e.g. negotiate, time
+ * packet etc.
+ *
+ * Sends data in @buffer directly to hyper-v via the vmbus
+ * This will send the data unparsed to hyper-v.
+ *
+ * Mainly used by Hyper-V drivers.
+ */
+int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
+                          u32 bufferlen, u64 requestid,
+                          enum vmbus_packet_type type, u32 flags)
+{
+       return vmbus_sendpacket_ctl(channel, buffer, bufferlen, requestid,
+                                   type, flags, true);
+}
 EXPORT_SYMBOL(vmbus_sendpacket);
 
 /*
index 86e1a7a46af3f24514cf80293fade1ff06b1e200..80e444bfc9dcdfca103b650c9dc4856a1d503b44 100644 (file)
@@ -867,6 +867,14 @@ extern int vmbus_sendpacket(struct vmbus_channel *channel,
                                  enum vmbus_packet_type type,
                                  u32 flags);
 
+extern int vmbus_sendpacket_ctl(struct vmbus_channel *channel,
+                                 void *buffer,
+                                 u32 bufferLen,
+                                 u64 requestid,
+                                 enum vmbus_packet_type type,
+                                 u32 flags,
+                                 bool kick_q);
+
 extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
                                            struct hv_page_buffer pagebuffers[],
                                            u32 pagecount,