lkml.org 
[lkml]   [2016]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/5] Drivers: hv: vmbus: Introduce functions for estimating room in the ring buffer
    Date
    Introduce separate functions for estimating how much can be read from
    and written to the ring buffer.

    Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
    ---
    drivers/hv/ring_buffer.c | 24 ++++--------------------
    include/linux/hyperv.h | 27 +++++++++++++++++++++++++++
    2 files changed, 31 insertions(+), 20 deletions(-)

    diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
    index 085003a..902375b 100644
    --- a/drivers/hv/ring_buffer.c
    +++ b/drivers/hv/ring_buffer.c
    @@ -38,8 +38,6 @@ void hv_begin_read(struct hv_ring_buffer_info *rbi)

    u32 hv_end_read(struct hv_ring_buffer_info *rbi)
    {
    - u32 read;
    - u32 write;

    rbi->ring_buffer->interrupt_mask = 0;
    mb();
    @@ -49,9 +47,7 @@ u32 hv_end_read(struct hv_ring_buffer_info *rbi)
    * If it is not, we raced and we need to process new
    * incoming messages.
    */
    - hv_get_ringbuffer_availbytes(rbi, &read, &write);
    -
    - return read;
    + return hv_get_bytes_to_read(rbi);
    }

    /*
    @@ -106,18 +102,13 @@ static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi)
    static bool hv_need_to_signal_on_read(struct hv_ring_buffer_info *rbi)
    {
    u32 cur_write_sz;
    - u32 r_size;
    - u32 write_loc = rbi->ring_buffer->write_index;
    - u32 read_loc = rbi->ring_buffer->read_index;
    u32 pending_sz = rbi->ring_buffer->pending_send_sz;

    /* If the other end is not blocked on write don't bother. */
    if (pending_sz == 0)
    return false;

    - r_size = rbi->ring_datasize;
    - cur_write_sz = write_loc >= read_loc ? r_size - (write_loc - read_loc) :
    - read_loc - write_loc;
    + cur_write_sz = hv_get_bytes_to_write(rbi);

    if (cur_write_sz >= pending_sz)
    return true;
    @@ -317,7 +308,6 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
    {
    int i = 0;
    u32 bytes_avail_towrite;
    - u32 bytes_avail_toread;
    u32 totalbytes_towrite = 0;

    u32 next_write_location;
    @@ -333,9 +323,7 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info,
    if (lock)
    spin_lock_irqsave(&outring_info->ring_lock, flags);

    - hv_get_ringbuffer_availbytes(outring_info,
    - &bytes_avail_toread,
    - &bytes_avail_towrite);
    + bytes_avail_towrite = hv_get_bytes_to_write(outring_info);

    /*
    * If there is only room for the packet, assume it is full.
    @@ -386,7 +374,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info,
    void *buffer, u32 buflen, u32 *buffer_actual_len,
    u64 *requestid, bool *signal, bool raw)
    {
    - u32 bytes_avail_towrite;
    u32 bytes_avail_toread;
    u32 next_read_location = 0;
    u64 prev_indices = 0;
    @@ -402,10 +389,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info,
    *buffer_actual_len = 0;
    *requestid = 0;

    - hv_get_ringbuffer_availbytes(inring_info,
    - &bytes_avail_toread,
    - &bytes_avail_towrite);
    -
    + bytes_avail_toread = hv_get_bytes_to_read(inring_info);
    /* Make sure there is something to read */
    if (bytes_avail_toread < sizeof(desc)) {
    /*
    diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
    index ecd81c3..a6b053c 100644
    --- a/include/linux/hyperv.h
    +++ b/include/linux/hyperv.h
    @@ -151,6 +151,33 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,
    *read = dsize - *write;
    }

    +static inline u32 hv_get_bytes_to_read(struct hv_ring_buffer_info *rbi)
    +{
    + u32 read_loc, write_loc, dsize, read;
    +
    + dsize = rbi->ring_datasize;
    + read_loc = rbi->ring_buffer->read_index;
    + write_loc = READ_ONCE(rbi->ring_buffer->write_index);
    +
    + read = write_loc >= read_loc ? (write_loc - read_loc) :
    + (dsize - read_loc) + write_loc;
    +
    + return read;
    +}
    +
    +static inline u32 hv_get_bytes_to_write(struct hv_ring_buffer_info *rbi)
    +{
    + u32 read_loc, write_loc, dsize, write;
    +
    + dsize = rbi->ring_datasize;
    + read_loc = READ_ONCE(rbi->ring_buffer->read_index);
    + write_loc = rbi->ring_buffer->write_index;
    +
    + write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
    + read_loc - write_loc;
    + return write;
    +}
    +
    /*
    * VMBUS version is 32 bit entity broken up into
    * two 16 bit quantities: major_number. minor_number.
    --
    1.7.4.1
    \
     
     \ /
      Last update: 2016-03-19 01:21    [W:3.108 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site