From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W4AED-0007w5-Lp for qemu-devel@nongnu.org; Fri, 17 Jan 2014 09:17:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W4AE7-0006WJ-HB for qemu-devel@nongnu.org; Fri, 17 Jan 2014 09:16:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33524) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W4AE7-0006W3-8k for qemu-devel@nongnu.org; Fri, 17 Jan 2014 09:16:51 -0500 From: Kevin Wolf Date: Fri, 17 Jan 2014 15:15:19 +0100 Message-Id: <1389968119-24771-30-git-send-email-kwolf@redhat.com> In-Reply-To: <1389968119-24771-1-git-send-email-kwolf@redhat.com> References: <1389968119-24771-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH v3 29/29] block: Switch bdrv_io_limits_intercept() to byte granularity List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, pl@kamp.de, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, xiawenc@linux.vnet.ibm.com 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 Signed-off-by: Kevin Wolf --- block.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/block.c b/block.c index 12af7fb..d3e3291 100644 --- a/block.c +++ b/block.c @@ -188,7 +188,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 */ @@ -201,9 +201,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)) { @@ -2788,8 +2787,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 */ @@ -3013,8 +3011,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); } /* -- 1.8.1.4