lkml.org 
[lkml]   [2008]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 07/60] relay: fix "full buffer with exactly full last subbuffer" accounting problem
    2.6.26-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Tom Zanussi <tzanussi@gmail.com>

    commit 32194450330be327f3b25bf6b66298bd122599e9 upstream

    In relay's current read implementation, if the buffer is completely full
    but hasn't triggered the buffer-full condition (i.e. the last write
    didn't cross the subbuffer boundary) and the last subbuffer is exactly
    full, the subbuffer accounting code erroneously finds nothing available.
    This patch fixes the problem.

    Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
    Cc: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
    Cc: Pekka Enberg <penberg@cs.helsinki.fi>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    Cc: Mathieu Desnoyers <compudj@krystal.dyndns.org>
    Cc: Andrea Righi <righi.andrea@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/relay.c | 12 +++++++++++-
    1 file changed, 11 insertions(+), 1 deletion(-)

    --- a/kernel/relay.c
    +++ b/kernel/relay.c
    @@ -832,6 +832,10 @@ static void relay_file_read_consume(stru
    size_t n_subbufs = buf->chan->n_subbufs;
    size_t read_subbuf;

    + if (buf->subbufs_produced == buf->subbufs_consumed &&
    + buf->offset == buf->bytes_consumed)
    + return;
    +
    if (buf->bytes_consumed + bytes_consumed > subbuf_size) {
    relay_subbufs_consumed(buf->chan, buf->cpu, 1);
    buf->bytes_consumed = 0;
    @@ -863,6 +867,8 @@ static int relay_file_read_avail(struct

    relay_file_read_consume(buf, read_pos, 0);

    + consumed = buf->subbufs_consumed;
    +
    if (unlikely(buf->offset > subbuf_size)) {
    if (produced == consumed)
    return 0;
    @@ -881,8 +887,12 @@ static int relay_file_read_avail(struct
    if (consumed > produced)
    produced += n_subbufs * subbuf_size;

    - if (consumed == produced)
    + if (consumed == produced) {
    + if (buf->offset == subbuf_size &&
    + buf->subbufs_produced > buf->subbufs_consumed)
    + return 1;
    return 0;
    + }

    return 1;
    }
    --


    \
     
     \ /
      Last update: 2008-08-18 20:53    [W:4.166 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site