aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel.c
diff options
context:
space:
mode:
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);