summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,