mirror of
https://github.com/adulau/aha.git
synced 2024-12-26 18:56:14 +00:00
relay: fix "full buffer with exactly full last subbuffer" accounting problem
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> Cc: <stable@kernel.org> [2.6.25.x, 2.6.26.x] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
60cadec9da
commit
3219445033
1 changed files with 11 additions and 1 deletions
|
@ -944,6 +944,10 @@ static void relay_file_read_consume(struct rchan_buf *buf,
|
|||
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;
|
||||
|
@ -975,6 +979,8 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos)
|
|||
|
||||
relay_file_read_consume(buf, read_pos, 0);
|
||||
|
||||
consumed = buf->subbufs_consumed;
|
||||
|
||||
if (unlikely(buf->offset > subbuf_size)) {
|
||||
if (produced == consumed)
|
||||
return 0;
|
||||
|
@ -993,8 +999,12 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos)
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue