[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 27/30] stream: fix ratelimiting corner case
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 27/30] stream: fix ratelimiting corner case |
Date: |
Thu, 10 May 2012 13:49:31 +0200 |
From: Paolo Bonzini <address@hidden>
This fixes inability to make progress in streaming if the quota is set
to less than the amount of data that an I/O operation has to write.
In this case, limit->dispatched + n will always be above the quota and,
due to the "goto retry" to recheck cancellation and allocation, streaming
will livelock.
This can be reproduced with "block_job_set_speed ide0-hd0 1b". Of course,
with this patch the requested limit will not be obeyed. That could be
done with another patch that caps is_allocated's n argument by the slice
quota.
Signed-off-by: Paolo Bonzini <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/stream.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/block/stream.c b/block/stream.c
index 25f98e4..a2c8f67 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -33,19 +33,19 @@ typedef struct {
static int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
{
- int64_t delay_ns = 0;
int64_t now = qemu_get_clock_ns(rt_clock);
if (limit->next_slice_time < now) {
limit->next_slice_time = now + SLICE_TIME;
limit->dispatched = 0;
}
- if (limit->dispatched + n > limit->slice_quota) {
- delay_ns = limit->next_slice_time - now;
- } else {
+ if (limit->dispatched == 0 || limit->dispatched + n <= limit->slice_quota)
{
limit->dispatched += n;
+ return 0;
+ } else {
+ limit->dispatched = n;
+ return limit->next_slice_time - now;
}
- return delay_ns;
}
static void ratelimit_set_speed(RateLimit *limit, uint64_t speed)
--
1.7.6.5
- [Qemu-devel] [PATCH 08/30] qemu-iotests: strip spaces from qemu-img/qemu-io/qemu command lines, (continued)
- [Qemu-devel] [PATCH 08/30] qemu-iotests: strip spaces from qemu-img/qemu-io/qemu command lines, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 13/30] block: do not reuse the backing file across bdrv_close/bdrv_open, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 20/30] qemu-img: make "info" backing file output correct and easier to use, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 18/30] block: protect path_has_protocol from filenames with colons, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 11/30] block: fix snapshot on QED, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 15/30] block: add block_job_sleep_ns, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 16/30] block: wait for job callback in block_job_cancel_sync, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 23/30] stream: fix sectors not allocated test, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 19/30] block: move field reset from bdrv_open_common to bdrv_close, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 26/30] stream: fix HMP block_job_set_speed, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 27/30] stream: fix ratelimiting corner case,
Kevin Wolf <=
- [Qemu-devel] [PATCH 22/30] qemu-io: fix the alloc command, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 24/30] stream: add testcase for partial streaming, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 25/30] stream: pass new base image format to bdrv_change_backing_file, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 28/30] stream: do not copy unallocated sectors from the base, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 29/30] tests/Makefile: Add missing $(EXESUF), Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 30/30] declare ECANCELED on all machines, Kevin Wolf, 2012/05/10
- [Qemu-devel] [PATCH 21/30] qemu-io: correctly print non-integer values as decimals, Kevin Wolf, 2012/05/10
- Re: [Qemu-devel] [PULL 00/30] Block patches for 1.1, Anthony Liguori, 2012/05/14