diff options
-rw-r--r-- | drivers/hv/channel.c | 33 | ||||
-rw-r--r-- | include/linux/hyperv.h | 9 |
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, | |||
636 | EXPORT_SYMBOL(vmbus_sendpacket); | 636 | EXPORT_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 | */ |
642 | int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel, | 645 | int 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 | */ | ||
709 | int 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 | } | ||
699 | EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer); | 720 | EXPORT_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 | ||
877 | extern 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 | |||
877 | extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel, | 886 | extern 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, |