aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel.c
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2012-12-01 09:46:57 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-17 14:41:49 -0500
commitc2b8e5202cf7670f918d0f7439ed2123cd58e1b7 (patch)
tree5dfc99b2b71a348c3942522cb5d3c338684edf1a /drivers/hv/channel.c
parent2a5c43a821b3b26e6af1cdb987b4daeba6f13a6f (diff)
Drivers: hv: Implement flow management on the send side
Implement flow management on the send side. When the sender is blocked, the reader can potentially signal the sender to indicate there is now room to send. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv/channel.c')
-rw-r--r--drivers/hv/channel.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index 9303252b2e19..064257e79f23 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -735,6 +735,7 @@ int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer,
735 u32 packetlen; 735 u32 packetlen;
736 u32 userlen; 736 u32 userlen;
737 int ret; 737 int ret;
738 bool signal = false;
738 739
739 *buffer_actual_len = 0; 740 *buffer_actual_len = 0;
740 *requestid = 0; 741 *requestid = 0;
@@ -761,8 +762,10 @@ int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer,
761 762
762 /* Copy over the packet to the user buffer */ 763 /* Copy over the packet to the user buffer */
763 ret = hv_ringbuffer_read(&channel->inbound, buffer, userlen, 764 ret = hv_ringbuffer_read(&channel->inbound, buffer, userlen,
764 (desc.offset8 << 3)); 765 (desc.offset8 << 3), &signal);
765 766
767 if (signal)
768 vmbus_setevent(channel);
766 769
767 return 0; 770 return 0;
768} 771}
@@ -779,6 +782,7 @@ int vmbus_recvpacket_raw(struct vmbus_channel *channel, void *buffer,
779 u32 packetlen; 782 u32 packetlen;
780 u32 userlen; 783 u32 userlen;
781 int ret; 784 int ret;
785 bool signal = false;
782 786
783 *buffer_actual_len = 0; 787 *buffer_actual_len = 0;
784 *requestid = 0; 788 *requestid = 0;
@@ -805,7 +809,11 @@ int vmbus_recvpacket_raw(struct vmbus_channel *channel, void *buffer,
805 *requestid = desc.trans_id; 809 *requestid = desc.trans_id;
806 810
807 /* Copy over the entire packet to the user buffer */ 811 /* Copy over the entire packet to the user buffer */
808 ret = hv_ringbuffer_read(&channel->inbound, buffer, packetlen, 0); 812 ret = hv_ringbuffer_read(&channel->inbound, buffer, packetlen, 0,
813 &signal);
814
815 if (signal)
816 vmbus_setevent(channel);
809 817
810 return 0; 818 return 0;
811} 819}