aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/ring_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hv/ring_buffer.c')
-rw-r--r--drivers/hv/ring_buffer.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
index 1145f3b8e4e0..5613e2b5cff7 100644
--- a/drivers/hv/ring_buffer.c
+++ b/drivers/hv/ring_buffer.c
@@ -314,7 +314,7 @@ void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info)
314 314
315/* Write to the ring buffer. */ 315/* Write to the ring buffer. */
316int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, 316int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
317 struct kvec *kv_list, u32 kv_count, bool *signal) 317 struct kvec *kv_list, u32 kv_count, bool *signal, bool lock)
318{ 318{
319 int i = 0; 319 int i = 0;
320 u32 bytes_avail_towrite; 320 u32 bytes_avail_towrite;
@@ -324,14 +324,15 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
324 u32 next_write_location; 324 u32 next_write_location;
325 u32 old_write; 325 u32 old_write;
326 u64 prev_indices = 0; 326 u64 prev_indices = 0;
327 unsigned long flags; 327 unsigned long flags = 0;
328 328
329 for (i = 0; i < kv_count; i++) 329 for (i = 0; i < kv_count; i++)
330 totalbytes_towrite += kv_list[i].iov_len; 330 totalbytes_towrite += kv_list[i].iov_len;
331 331
332 totalbytes_towrite += sizeof(u64); 332 totalbytes_towrite += sizeof(u64);
333 333
334 spin_lock_irqsave(&outring_info->ring_lock, flags); 334 if (lock)
335 spin_lock_irqsave(&outring_info->ring_lock, flags);
335 336
336 hv_get_ringbuffer_availbytes(outring_info, 337 hv_get_ringbuffer_availbytes(outring_info,
337 &bytes_avail_toread, 338 &bytes_avail_toread,
@@ -343,7 +344,8 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
343 * is empty since the read index == write index. 344 * is empty since the read index == write index.
344 */ 345 */
345 if (bytes_avail_towrite <= totalbytes_towrite) { 346 if (bytes_avail_towrite <= totalbytes_towrite) {
346 spin_unlock_irqrestore(&outring_info->ring_lock, flags); 347 if (lock)
348 spin_unlock_irqrestore(&outring_info->ring_lock, flags);
347 return -EAGAIN; 349 return -EAGAIN;
348 } 350 }
349 351
@@ -374,7 +376,8 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
374 hv_set_next_write_location(outring_info, next_write_location); 376 hv_set_next_write_location(outring_info, next_write_location);
375 377
376 378
377 spin_unlock_irqrestore(&outring_info->ring_lock, flags); 379 if (lock)
380 spin_unlock_irqrestore(&outring_info->ring_lock, flags);
378 381
379 *signal = hv_need_to_signal(old_write, outring_info); 382 *signal = hv_need_to_signal(old_write, outring_info);
380 return 0; 383 return 0;