aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2015-02-28 14:39:03 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-01 22:31:47 -0500
commit87e93d61708fe2c44875d1ecdb174aad070dbd08 (patch)
tree87cd3e9a98daa7c4b470ba11e3af230f1eb2f359
parenta13e8bbe851a96a0e78c2bd599bc34082fa697cd (diff)
Drivers: hv: vmbus: Suport an API to send pagebuffers with additional control
Implement an API for sending pagebuffers that gives more control to the client in terms of setting the vmbus flags as well as deciding when to notify the host. This will be useful for enabling batch processing. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/hv/channel.c33
-rw-r--r--include/linux/hyperv.h9
2 files changed, 36 insertions, 6 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index 9b79aca7e565..f060d1f7bc99 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -636,13 +636,18 @@ int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
636EXPORT_SYMBOL(vmbus_sendpacket); 636EXPORT_SYMBOL(vmbus_sendpacket);
637 637
638/* 638/*
639 * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer 639 * vmbus_sendpacket_pagebuffer_ctl - Send a range of single-page buffer
640 * packets using a GPADL Direct packet type. 640 * packets using a GPADL Direct packet type. This interface allows you
641 * to control notifying the host. This will be useful for sending
642 * batched data. Also the sender can control the send flags
643 * explicitly.
641 */ 644 */
642int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel, 645int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
643 struct hv_page_buffer pagebuffers[], 646 struct hv_page_buffer pagebuffers[],
644 u32 pagecount, void *buffer, u32 bufferlen, 647 u32 pagecount, void *buffer, u32 bufferlen,
645 u64 requestid) 648 u64 requestid,
649 u32 flags,
650 bool kick_q)
646{ 651{
647 int ret; 652 int ret;
648 int i; 653 int i;
@@ -670,7 +675,7 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
670 675
671 /* Setup the descriptor */ 676 /* Setup the descriptor */
672 desc.type = VM_PKT_DATA_USING_GPA_DIRECT; 677 desc.type = VM_PKT_DATA_USING_GPA_DIRECT;
673 desc.flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; 678 desc.flags = flags;
674 desc.dataoffset8 = descsize >> 3; /* in 8-bytes grandularity */ 679 desc.dataoffset8 = descsize >> 3; /* in 8-bytes grandularity */
675 desc.length8 = (u16)(packetlen_aligned >> 3); 680 desc.length8 = (u16)(packetlen_aligned >> 3);
676 desc.transactionid = requestid; 681 desc.transactionid = requestid;
@@ -691,11 +696,27 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
691 696
692 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 697 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);
693 698
694 if (ret == 0 && signal) 699 if ((ret == 0) && kick_q && signal)
695 vmbus_setevent(channel); 700 vmbus_setevent(channel);
696 701
697 return ret; 702 return ret;
698} 703}
704
705/*
706 * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer
707 * packets using a GPADL Direct packet type.
708 */
709int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
710 struct hv_page_buffer pagebuffers[],
711 u32 pagecount, void *buffer, u32 bufferlen,
712 u64 requestid)
713{
714 u32 flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
715 return vmbus_sendpacket_pagebuffer_ctl(channel, pagebuffers, pagecount,
716 buffer, bufferlen, requestid,
717 flags, true);
718
719}
699EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer); 720EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer);
700 721
701/* 722/*
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 1ca582457076..86e1a7a46af3 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -874,6 +874,15 @@ extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
874 u32 bufferlen, 874 u32 bufferlen,
875 u64 requestid); 875 u64 requestid);
876 876
877extern int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
878 struct hv_page_buffer pagebuffers[],
879 u32 pagecount,
880 void *buffer,
881 u32 bufferlen,
882 u64 requestid,
883 u32 flags,
884 bool kick_q);
885
877extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel, 886extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
878 struct hv_multipage_buffer *mpb, 887 struct hv_multipage_buffer *mpb,
879 void *buffer, 888 void *buffer,