diff options
Diffstat (limited to 'drivers/hv/channel.c')
-rw-r--r-- | drivers/hv/channel.c | 15 |
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); |