diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/relay.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/relay.c b/kernel/relay.c index 04006ef970b8..8d13a7855c08 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -944,6 +944,10 @@ static void relay_file_read_consume(struct rchan_buf *buf, | |||
944 | size_t n_subbufs = buf->chan->n_subbufs; | 944 | size_t n_subbufs = buf->chan->n_subbufs; |
945 | size_t read_subbuf; | 945 | size_t read_subbuf; |
946 | 946 | ||
947 | if (buf->subbufs_produced == buf->subbufs_consumed && | ||
948 | buf->offset == buf->bytes_consumed) | ||
949 | return; | ||
950 | |||
947 | if (buf->bytes_consumed + bytes_consumed > subbuf_size) { | 951 | if (buf->bytes_consumed + bytes_consumed > subbuf_size) { |
948 | relay_subbufs_consumed(buf->chan, buf->cpu, 1); | 952 | relay_subbufs_consumed(buf->chan, buf->cpu, 1); |
949 | buf->bytes_consumed = 0; | 953 | buf->bytes_consumed = 0; |
@@ -975,6 +979,8 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | |||
975 | 979 | ||
976 | relay_file_read_consume(buf, read_pos, 0); | 980 | relay_file_read_consume(buf, read_pos, 0); |
977 | 981 | ||
982 | consumed = buf->subbufs_consumed; | ||
983 | |||
978 | if (unlikely(buf->offset > subbuf_size)) { | 984 | if (unlikely(buf->offset > subbuf_size)) { |
979 | if (produced == consumed) | 985 | if (produced == consumed) |
980 | return 0; | 986 | return 0; |
@@ -993,8 +999,12 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | |||
993 | if (consumed > produced) | 999 | if (consumed > produced) |
994 | produced += n_subbufs * subbuf_size; | 1000 | produced += n_subbufs * subbuf_size; |
995 | 1001 | ||
996 | if (consumed == produced) | 1002 | if (consumed == produced) { |
1003 | if (buf->offset == subbuf_size && | ||
1004 | buf->subbufs_produced > buf->subbufs_consumed) | ||
1005 | return 1; | ||
997 | return 0; | 1006 | return 0; |
1007 | } | ||
998 | 1008 | ||
999 | return 1; | 1009 | return 1; |
1000 | } | 1010 | } |