Commit c84f51d7 authored by Christopher Oo's avatar Christopher Oo Committed by Ben Hutchings

Drivers: hv_vmbus: Fix signal to host condition

commit a5cca686 upstream.

Fixes a bug where previously hv_ringbuffer_read would pass in the old
number of bytes available to read instead of the expected old read index
when calculating when to signal to the host that the ringbuffer is empty.
Since the previous write size is already saved, also changes the
hv_need_to_signal_on_read to use the previously read value rather than
recalculating it.
Signed-off-by: default avatarChristopher Oo <t-chriso@microsoft.com>
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 6f8d26fd
...@@ -103,10 +103,9 @@ static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi) ...@@ -103,10 +103,9 @@ static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi)
* there is room for the producer to send the pending packet. * there is room for the producer to send the pending packet.
*/ */
static bool hv_need_to_signal_on_read(u32 old_rd, static bool hv_need_to_signal_on_read(u32 prev_write_sz,
struct hv_ring_buffer_info *rbi) struct hv_ring_buffer_info *rbi)
{ {
u32 prev_write_sz;
u32 cur_write_sz; u32 cur_write_sz;
u32 r_size; u32 r_size;
u32 write_loc = rbi->ring_buffer->write_index; u32 write_loc = rbi->ring_buffer->write_index;
...@@ -123,10 +122,6 @@ static bool hv_need_to_signal_on_read(u32 old_rd, ...@@ -123,10 +122,6 @@ static bool hv_need_to_signal_on_read(u32 old_rd,
cur_write_sz = write_loc >= read_loc ? r_size - (write_loc - read_loc) : cur_write_sz = write_loc >= read_loc ? r_size - (write_loc - read_loc) :
read_loc - write_loc; read_loc - write_loc;
prev_write_sz = write_loc >= old_rd ? r_size - (write_loc - old_rd) :
old_rd - write_loc;
if ((prev_write_sz < pending_sz) && (cur_write_sz >= pending_sz)) if ((prev_write_sz < pending_sz) && (cur_write_sz >= pending_sz))
return true; return true;
...@@ -512,7 +507,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer, ...@@ -512,7 +507,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
u32 next_read_location = 0; u32 next_read_location = 0;
u64 prev_indices = 0; u64 prev_indices = 0;
unsigned long flags; unsigned long flags;
u32 old_read;
if (buflen <= 0) if (buflen <= 0)
return -EINVAL; return -EINVAL;
...@@ -523,8 +517,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer, ...@@ -523,8 +517,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
&bytes_avail_toread, &bytes_avail_toread,
&bytes_avail_towrite); &bytes_avail_towrite);
old_read = bytes_avail_toread;
/* Make sure there is something to read */ /* Make sure there is something to read */
if (bytes_avail_toread < buflen) { if (bytes_avail_toread < buflen) {
spin_unlock_irqrestore(&inring_info->ring_lock, flags); spin_unlock_irqrestore(&inring_info->ring_lock, flags);
...@@ -555,7 +547,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer, ...@@ -555,7 +547,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
spin_unlock_irqrestore(&inring_info->ring_lock, flags); spin_unlock_irqrestore(&inring_info->ring_lock, flags);
*signal = hv_need_to_signal_on_read(old_read, inring_info); *signal = hv_need_to_signal_on_read(bytes_avail_towrite, inring_info);
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment