Commit d5103588 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

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: default avatarWenchao Xia <xiawenc@linux.vnet.ibm.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
parent 9e1cb96d
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -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);
    }

    /*