diff options
Diffstat (limited to 'drivers/hv/ring_buffer.c')
-rw-r--r-- | drivers/hv/ring_buffer.c | 13 |
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. */ |
316 | int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, | 316 | int 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; |