summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2014-01-16 13:29:10 +0100
committerKevin Wolf <kwolf@redhat.com>2014-01-24 17:40:28 +0100
commitd5103588aa39157c8eea3bb5fb6780bbd8be21b7 (patch)
tree543f7cc92a36e0157cf35e474ee4eb74b8f6156e
parent9e1cb96d9a5e434f389a4d7b7ff4dcdd71e8ec0f (diff)
downloadfocaccia-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.c13
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);
     }
 
     /*