aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel.c
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 /drivers/hv/channel.c
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>
Diffstat (limited to 'drivers/hv/channel.c')
-rw-r--r--drivers/hv/channel.c33
1 files changed, 27 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/*