Re: [Qemu-devel] [PATCH v3 09/29] block: Introduce bdrv_aligned_preadv()

2014-01-21 Thread Benoît Canet
Le Friday 17 Jan 2014 à 15:14:59 (+0100), Kevin Wolf a écrit :
 This separates the part of bdrv_co_do_readv() that needs to happen
 before the request is modified to match the backend alignment, and a
 part that needs to be executed afterwards and passes the request to the
 BlockDriver.
 
 Signed-off-by: Kevin Wolf kw...@redhat.com
 Reviewed-by: Wenchao Xia xiaw...@linux.vnet.ibm.com
 Reviewed-by: Max Reitz mre...@redhat.com
 ---
  block.c | 61 +++--
  1 file changed, 43 insertions(+), 18 deletions(-)
 
 diff --git a/block.c b/block.c
 index 25ae896..0c2baf5 100644
 --- a/block.c
 +++ b/block.c
 @@ -2705,26 +2705,24 @@ err:
  }
  
  /*
 - * Handle a read request in coroutine context
 + * Forwards an already correctly aligned request to the BlockDriver. This
 + * handles copy on read and zeroing after EOF; any other features must be
 + * implemented by the caller.
   */
 -static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
 -int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
 -BdrvRequestFlags flags)
 +static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs,
 +int64_t offset, unsigned int bytes, QEMUIOVector *qiov, int flags)
unsigned int bytes - Would it worth it to make this int64_t or size_t for the
not so far future where 4GB will be the new 4MB ?

Best regards

Benoît

  {
  BlockDriver *drv = bs-drv;
  BdrvTrackedRequest req;
  int ret;
  
 -if (!drv) {
 -return -ENOMEDIUM;
 -}
 -if (bdrv_check_request(bs, sector_num, nb_sectors)) {
 -return -EIO;
 -}
 +int64_t sector_num = offset  BDRV_SECTOR_BITS;
 +unsigned int nb_sectors = bytes  BDRV_SECTOR_BITS;
  
 -if (bs-copy_on_read) {
 -flags |= BDRV_REQ_COPY_ON_READ;
 -}
 +assert((offset  (BDRV_SECTOR_SIZE - 1)) == 0);
 +assert((bytes  (BDRV_SECTOR_SIZE - 1)) == 0);
 +
 +/* Handle Copy on Read and associated serialisation */
  if (flags  BDRV_REQ_COPY_ON_READ) {
  bs-copy_on_read_in_flight++;
  }
 @@ -2733,11 +2731,6 @@ static int coroutine_fn 
 bdrv_co_do_readv(BlockDriverState *bs,
  wait_for_overlapping_requests(bs, sector_num, nb_sectors);
  }
  
 -/* throttling disk I/O */
 -if (bs-io_limits_enabled) {
 -bdrv_io_limits_intercept(bs, nb_sectors, false);
 -}
 -
  tracked_request_begin(req, bs, sector_num, nb_sectors, false);
  
  if (flags  BDRV_REQ_COPY_ON_READ) {
 @@ -2754,6 +2747,7 @@ static int coroutine_fn 
 bdrv_co_do_readv(BlockDriverState *bs,
  }
  }
  
 +/* Forward the request to the BlockDriver */
  if (!(bs-zero_beyond_eof  bs-growable)) {
  ret = drv-bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
  } else {
 @@ -2794,6 +2788,37 @@ out:
  return ret;
  }
  
 +/*
 + * Handle a read request in coroutine context
 + */
 +static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
 +int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
 +BdrvRequestFlags flags)
 +{
 +BlockDriver *drv = bs-drv;
 +int ret;
 +
 +if (!drv) {
 +return -ENOMEDIUM;
 +}
 +if (bdrv_check_request(bs, sector_num, nb_sectors)) {
 +return -EIO;
 +}
 +
 +if (bs-copy_on_read) {
 +flags |= BDRV_REQ_COPY_ON_READ;
 +}
 +
 +/* throttling disk I/O */
 +if (bs-io_limits_enabled) {
 +bdrv_io_limits_intercept(bs, nb_sectors, false);
 +}
 +
 +ret = bdrv_aligned_preadv(bs, sector_num  BDRV_SECTOR_BITS,
 + nb_sectors  BDRV_SECTOR_BITS, qiov, flags);
 +return ret;
 +}
 +
  int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
  int nb_sectors, QEMUIOVector *qiov)
  {
 -- 
 1.8.1.4
 
 



[Qemu-devel] [PATCH v3 09/29] block: Introduce bdrv_aligned_preadv()

2014-01-17 Thread Kevin Wolf
This separates the part of bdrv_co_do_readv() that needs to happen
before the request is modified to match the backend alignment, and a
part that needs to be executed afterwards and passes the request to the
BlockDriver.

Signed-off-by: Kevin Wolf kw...@redhat.com
Reviewed-by: Wenchao Xia xiaw...@linux.vnet.ibm.com
Reviewed-by: Max Reitz mre...@redhat.com
---
 block.c | 61 +++--
 1 file changed, 43 insertions(+), 18 deletions(-)

diff --git a/block.c b/block.c
index 25ae896..0c2baf5 100644
--- a/block.c
+++ b/block.c
@@ -2705,26 +2705,24 @@ err:
 }
 
 /*
- * Handle a read request in coroutine context
+ * Forwards an already correctly aligned request to the BlockDriver. This
+ * handles copy on read and zeroing after EOF; any other features must be
+ * implemented by the caller.
  */
-static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
-int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
-BdrvRequestFlags flags)
+static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs,
+int64_t offset, unsigned int bytes, QEMUIOVector *qiov, int flags)
 {
 BlockDriver *drv = bs-drv;
 BdrvTrackedRequest req;
 int ret;
 
-if (!drv) {
-return -ENOMEDIUM;
-}
-if (bdrv_check_request(bs, sector_num, nb_sectors)) {
-return -EIO;
-}
+int64_t sector_num = offset  BDRV_SECTOR_BITS;
+unsigned int nb_sectors = bytes  BDRV_SECTOR_BITS;
 
-if (bs-copy_on_read) {
-flags |= BDRV_REQ_COPY_ON_READ;
-}
+assert((offset  (BDRV_SECTOR_SIZE - 1)) == 0);
+assert((bytes  (BDRV_SECTOR_SIZE - 1)) == 0);
+
+/* Handle Copy on Read and associated serialisation */
 if (flags  BDRV_REQ_COPY_ON_READ) {
 bs-copy_on_read_in_flight++;
 }
@@ -2733,11 +2731,6 @@ static int coroutine_fn 
bdrv_co_do_readv(BlockDriverState *bs,
 wait_for_overlapping_requests(bs, sector_num, nb_sectors);
 }
 
-/* throttling disk I/O */
-if (bs-io_limits_enabled) {
-bdrv_io_limits_intercept(bs, nb_sectors, false);
-}
-
 tracked_request_begin(req, bs, sector_num, nb_sectors, false);
 
 if (flags  BDRV_REQ_COPY_ON_READ) {
@@ -2754,6 +2747,7 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState 
*bs,
 }
 }
 
+/* Forward the request to the BlockDriver */
 if (!(bs-zero_beyond_eof  bs-growable)) {
 ret = drv-bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
 } else {
@@ -2794,6 +2788,37 @@ out:
 return ret;
 }
 
+/*
+ * Handle a read request in coroutine context
+ */
+static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
+int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
+BdrvRequestFlags flags)
+{
+BlockDriver *drv = bs-drv;
+int ret;
+
+if (!drv) {
+return -ENOMEDIUM;
+}
+if (bdrv_check_request(bs, sector_num, nb_sectors)) {
+return -EIO;
+}
+
+if (bs-copy_on_read) {
+flags |= BDRV_REQ_COPY_ON_READ;
+}
+
+/* throttling disk I/O */
+if (bs-io_limits_enabled) {
+bdrv_io_limits_intercept(bs, nb_sectors, false);
+}
+
+ret = bdrv_aligned_preadv(bs, sector_num  BDRV_SECTOR_BITS,
+ nb_sectors  BDRV_SECTOR_BITS, qiov, flags);
+return ret;
+}
+
 int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
 int nb_sectors, QEMUIOVector *qiov)
 {
-- 
1.8.1.4