Drivers: hv: ring_buffer: remove code duplication from hv_ringbuffer_peek/read()
hv_ringbuffer_peek() does the same as hv_ringbuffer_read() without advancing the read index. The only functional change this patch brings is moving hv_need_to_signal_on_read() call under the ring_lock but this function is just a couple of comparisons. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
45870a4413
commit
b5f53dde8d
|
@ -380,47 +380,9 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int __hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info,
|
||||||
/* Read without advancing the read index. */
|
void *buffer, u32 buflen, u32 offset,
|
||||||
int hv_ringbuffer_peek(struct hv_ring_buffer_info *Inring_info,
|
bool *signal, bool advance)
|
||||||
void *Buffer, u32 buflen)
|
|
||||||
{
|
|
||||||
u32 bytes_avail_towrite;
|
|
||||||
u32 bytes_avail_toread;
|
|
||||||
u32 next_read_location = 0;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&Inring_info->ring_lock, flags);
|
|
||||||
|
|
||||||
hv_get_ringbuffer_availbytes(Inring_info,
|
|
||||||
&bytes_avail_toread,
|
|
||||||
&bytes_avail_towrite);
|
|
||||||
|
|
||||||
/* Make sure there is something to read */
|
|
||||||
if (bytes_avail_toread < buflen) {
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&Inring_info->ring_lock, flags);
|
|
||||||
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert to byte offset */
|
|
||||||
next_read_location = hv_get_next_read_location(Inring_info);
|
|
||||||
|
|
||||||
next_read_location = hv_copyfrom_ringbuffer(Inring_info,
|
|
||||||
Buffer,
|
|
||||||
buflen,
|
|
||||||
next_read_location);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&Inring_info->ring_lock, flags);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Read and advance the read index. */
|
|
||||||
int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
|
|
||||||
u32 buflen, u32 offset, bool *signal)
|
|
||||||
{
|
{
|
||||||
u32 bytes_avail_towrite;
|
u32 bytes_avail_towrite;
|
||||||
u32 bytes_avail_toread;
|
u32 bytes_avail_toread;
|
||||||
|
@ -452,6 +414,9 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
|
||||||
buflen,
|
buflen,
|
||||||
next_read_location);
|
next_read_location);
|
||||||
|
|
||||||
|
if (!advance)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
next_read_location = hv_copyfrom_ringbuffer(inring_info,
|
next_read_location = hv_copyfrom_ringbuffer(inring_info,
|
||||||
&prev_indices,
|
&prev_indices,
|
||||||
sizeof(u64),
|
sizeof(u64),
|
||||||
|
@ -467,9 +432,26 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer,
|
||||||
/* Update the read index */
|
/* Update the read index */
|
||||||
hv_set_next_read_location(inring_info, next_read_location);
|
hv_set_next_read_location(inring_info, next_read_location);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&inring_info->ring_lock, flags);
|
|
||||||
|
|
||||||
*signal = hv_need_to_signal_on_read(bytes_avail_towrite, inring_info);
|
*signal = hv_need_to_signal_on_read(bytes_avail_towrite, inring_info);
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
|
spin_unlock_irqrestore(&inring_info->ring_lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read from ring buffer without advancing the read index. */
|
||||||
|
int hv_ringbuffer_peek(struct hv_ring_buffer_info *inring_info,
|
||||||
|
void *buffer, u32 buflen)
|
||||||
|
{
|
||||||
|
return __hv_ringbuffer_read(inring_info, buffer, buflen,
|
||||||
|
0, NULL, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read from ring buffer and advance the read index. */
|
||||||
|
int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info,
|
||||||
|
void *buffer, u32 buflen, u32 offset,
|
||||||
|
bool *signal)
|
||||||
|
{
|
||||||
|
return __hv_ringbuffer_read(inring_info, buffer, buflen,
|
||||||
|
offset, signal, true);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue