diff options
| author | Kevin Wolf <kwolf@redhat.com> | 2014-01-16 13:29:10 +0100 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2014-01-24 17:40:28 +0100 |
| commit | d5103588aa39157c8eea3bb5fb6780bbd8be21b7 (patch) | |
| tree | 543f7cc92a36e0157cf35e474ee4eb74b8f6156e | |
| parent | 9e1cb96d9a5e434f389a4d7b7ff4dcdd71e8ec0f (diff) | |
| download | focaccia-qemu-d5103588aa39157c8eea3bb5fb6780bbd8be21b7.tar.gz focaccia-qemu-d5103588aa39157c8eea3bb5fb6780bbd8be21b7.zip | |
block: Switch bdrv_io_limits_intercept() to byte granularity
Request sizes used to be rounded down to the next sector boundary, allowing to bypass the I/O limit. Now all requests are accounted for with their exact byte size. Reported-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
| -rw-r--r-- | block.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/block.c b/block.c index 932ce58265..cb21a5fa61 100644 --- a/block.c +++ b/block.c @@ -192,7 +192,7 @@ void bdrv_io_limits_enable(BlockDriverState *bs) * @is_write: is the IO a write */ static void bdrv_io_limits_intercept(BlockDriverState *bs, - int nb_sectors, + unsigned int bytes, bool is_write) { /* does this io must wait */ @@ -205,9 +205,8 @@ static void bdrv_io_limits_intercept(BlockDriverState *bs, } /* the IO will be executed, do the accounting */ - throttle_account(&bs->throttle_state, - is_write, - nb_sectors * BDRV_SECTOR_SIZE); + throttle_account(&bs->throttle_state, is_write, bytes); + /* if the next request must wait -> do nothing */ if (throttle_schedule_timer(&bs->throttle_state, is_write)) { @@ -2968,8 +2967,7 @@ static int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs, /* throttling disk I/O */ if (bs->io_limits_enabled) { - /* TODO Switch to byte granularity */ - bdrv_io_limits_intercept(bs, bytes >> BDRV_SECTOR_BITS, false); + bdrv_io_limits_intercept(bs, bytes, false); } /* Align read if necessary by padding qiov */ @@ -3193,8 +3191,7 @@ static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs, /* throttling disk I/O */ if (bs->io_limits_enabled) { - /* TODO Switch to byte granularity */ - bdrv_io_limits_intercept(bs, bytes >> BDRV_SECTOR_BITS, true); + bdrv_io_limits_intercept(bs, bytes, true); } /* |