diff options
Diffstat (limited to 'kernel/relay.c')
-rw-r--r-- | kernel/relay.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/relay.c b/kernel/relay.c index 9d79b7854fa6..e92db8c06acf 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -750,7 +750,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length) | |||
750 | * from the scheduler (trying to re-grab | 750 | * from the scheduler (trying to re-grab |
751 | * rq->lock), so defer it. | 751 | * rq->lock), so defer it. |
752 | */ | 752 | */ |
753 | __mod_timer(&buf->timer, jiffies + 1); | 753 | mod_timer(&buf->timer, jiffies + 1); |
754 | } | 754 | } |
755 | 755 | ||
756 | old = buf->data; | 756 | old = buf->data; |
@@ -797,13 +797,15 @@ void relay_subbufs_consumed(struct rchan *chan, | |||
797 | if (!chan) | 797 | if (!chan) |
798 | return; | 798 | return; |
799 | 799 | ||
800 | if (cpu >= NR_CPUS || !chan->buf[cpu]) | 800 | if (cpu >= NR_CPUS || !chan->buf[cpu] || |
801 | subbufs_consumed > chan->n_subbufs) | ||
801 | return; | 802 | return; |
802 | 803 | ||
803 | buf = chan->buf[cpu]; | 804 | buf = chan->buf[cpu]; |
804 | buf->subbufs_consumed += subbufs_consumed; | 805 | if (subbufs_consumed > buf->subbufs_produced - buf->subbufs_consumed) |
805 | if (buf->subbufs_consumed > buf->subbufs_produced) | ||
806 | buf->subbufs_consumed = buf->subbufs_produced; | 806 | buf->subbufs_consumed = buf->subbufs_produced; |
807 | else | ||
808 | buf->subbufs_consumed += subbufs_consumed; | ||
807 | } | 809 | } |
808 | EXPORT_SYMBOL_GPL(relay_subbufs_consumed); | 810 | EXPORT_SYMBOL_GPL(relay_subbufs_consumed); |
809 | 811 | ||