summaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel.c
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2016-01-28 01:29:45 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-08 00:34:12 -0500
commitfe760e4d64fe5c17c39e86c410d41f6587ee88bc (patch)
treee25710bde0e1e4da9a127a3e6c449c08696c1940 /drivers/hv/channel.c
parent3eba9a77d5fc2cee486a16fff435686f024f61cf (diff)
Drivers: hv: vmbus: Give control over how the ring access is serialized
On the channel send side, many of the VMBUS device drivers explicity serialize access to the outgoing ring buffer. Give more control to the VMBUS device drivers in terms how to serialize accesss to the outgoing ring buffer. The default behavior will be to aquire the ring lock to preserve the current behavior. 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.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index fcab234796ef..56dd261f7142 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -639,6 +639,7 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
639 u64 aligned_data = 0; 639 u64 aligned_data = 0;
640 int ret; 640 int ret;
641 bool signal = false; 641 bool signal = false;
642 bool lock = channel->acquire_ring_lock;
642 int num_vecs = ((bufferlen != 0) ? 3 : 1); 643 int num_vecs = ((bufferlen != 0) ? 3 : 1);
643 644
644 645
@@ -658,7 +659,7 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
658 bufferlist[2].iov_len = (packetlen_aligned - packetlen); 659 bufferlist[2].iov_len = (packetlen_aligned - packetlen);
659 660
660 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, num_vecs, 661 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, num_vecs,
661 &signal); 662 &signal, lock);
662 663
663 /* 664 /*
664 * Signalling the host is conditional on many factors: 665 * Signalling the host is conditional on many factors:
@@ -738,6 +739,7 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
738 struct kvec bufferlist[3]; 739 struct kvec bufferlist[3];
739 u64 aligned_data = 0; 740 u64 aligned_data = 0;
740 bool signal = false; 741 bool signal = false;
742 bool lock = channel->acquire_ring_lock;
741 743
742 if (pagecount > MAX_PAGE_BUFFER_COUNT) 744 if (pagecount > MAX_PAGE_BUFFER_COUNT)
743 return -EINVAL; 745 return -EINVAL;
@@ -774,7 +776,8 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
774 bufferlist[2].iov_base = &aligned_data; 776 bufferlist[2].iov_base = &aligned_data;
775 bufferlist[2].iov_len = (packetlen_aligned - packetlen); 777 bufferlist[2].iov_len = (packetlen_aligned - packetlen);
776 778
777 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 779 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3,
780 &signal, lock);
778 781
779 /* 782 /*
780 * Signalling the host is conditional on many factors: 783 * Signalling the host is conditional on many factors:
@@ -837,6 +840,7 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
837 struct kvec bufferlist[3]; 840 struct kvec bufferlist[3];
838 u64 aligned_data = 0; 841 u64 aligned_data = 0;
839 bool signal = false; 842 bool signal = false;
843 bool lock = channel->acquire_ring_lock;
840 844
841 packetlen = desc_size + bufferlen; 845 packetlen = desc_size + bufferlen;
842 packetlen_aligned = ALIGN(packetlen, sizeof(u64)); 846 packetlen_aligned = ALIGN(packetlen, sizeof(u64));
@@ -856,7 +860,8 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
856 bufferlist[2].iov_base = &aligned_data; 860 bufferlist[2].iov_base = &aligned_data;
857 bufferlist[2].iov_len = (packetlen_aligned - packetlen); 861 bufferlist[2].iov_len = (packetlen_aligned - packetlen);
858 862
859 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 863 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3,
864 &signal, lock);
860 865
861 if (ret == 0 && signal) 866 if (ret == 0 && signal)
862 vmbus_setevent(channel); 867 vmbus_setevent(channel);
@@ -881,6 +886,7 @@ int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
881 struct kvec bufferlist[3]; 886 struct kvec bufferlist[3];
882 u64 aligned_data = 0; 887 u64 aligned_data = 0;
883 bool signal = false; 888 bool signal = false;
889 bool lock = channel->acquire_ring_lock;
884 u32 pfncount = NUM_PAGES_SPANNED(multi_pagebuffer->offset, 890 u32 pfncount = NUM_PAGES_SPANNED(multi_pagebuffer->offset,
885 multi_pagebuffer->len); 891 multi_pagebuffer->len);
886 892
@@ -919,7 +925,8 @@ int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
919 bufferlist[2].iov_base = &aligned_data; 925 bufferlist[2].iov_base = &aligned_data;
920 bufferlist[2].iov_len = (packetlen_aligned - packetlen); 926 bufferlist[2].iov_len = (packetlen_aligned - packetlen);
921 927
922 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 928 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3,
929 &signal, lock);
923 930
924 if (ret == 0 && signal) 931 if (ret == 0 && signal)
925 vmbus_setevent(channel); 932 vmbus_setevent(channel);