mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
9e1cb96d9a
commit
d5103588aa
13
block.c
13
block.c
|
@ -192,7 +192,7 @@ void bdrv_io_limits_enable(BlockDriverState *bs)
|
||||||
* @is_write: is the IO a write
|
* @is_write: is the IO a write
|
||||||
*/
|
*/
|
||||||
static void bdrv_io_limits_intercept(BlockDriverState *bs,
|
static void bdrv_io_limits_intercept(BlockDriverState *bs,
|
||||||
int nb_sectors,
|
unsigned int bytes,
|
||||||
bool is_write)
|
bool is_write)
|
||||||
{
|
{
|
||||||
/* does this io must wait */
|
/* 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 */
|
/* the IO will be executed, do the accounting */
|
||||||
throttle_account(&bs->throttle_state,
|
throttle_account(&bs->throttle_state, is_write, bytes);
|
||||||
is_write,
|
|
||||||
nb_sectors * BDRV_SECTOR_SIZE);
|
|
||||||
|
|
||||||
/* if the next request must wait -> do nothing */
|
/* if the next request must wait -> do nothing */
|
||||||
if (throttle_schedule_timer(&bs->throttle_state, is_write)) {
|
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 */
|
/* throttling disk I/O */
|
||||||
if (bs->io_limits_enabled) {
|
if (bs->io_limits_enabled) {
|
||||||
/* TODO Switch to byte granularity */
|
bdrv_io_limits_intercept(bs, bytes, false);
|
||||||
bdrv_io_limits_intercept(bs, bytes >> BDRV_SECTOR_BITS, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Align read if necessary by padding qiov */
|
/* 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 */
|
/* throttling disk I/O */
|
||||||
if (bs->io_limits_enabled) {
|
if (bs->io_limits_enabled) {
|
||||||
/* TODO Switch to byte granularity */
|
bdrv_io_limits_intercept(bs, bytes, true);
|
||||||
bdrv_io_limits_intercept(bs, bytes >> BDRV_SECTOR_BITS, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue