qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] nbd/client: Request larger block status by default


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [PATCH] nbd/client: Request larger block status by default
Date: Tue, 21 Sep 2021 20:25:11 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0

21.09.2021 19:17, Eric Blake wrote:
Now that commit 5a1cfd21 has clarified that a driver's block_status
can report larger *pnum than in the original request, we can take
advantage of that in the NBD driver.  Rather that limiting our request
to the server based on the maximum @bytes our caller mentioned, we
instead ask for as much status as possible (the minimum of our 4G
limit or the rest of the export); the server will still only give us
one extent in its answer (because we are using NBD_CMD_FLAG_REQ_ONE),
but now the block layer's caching of data areas can take advantage of
cases where the server gives us a large answer to avoid the need for
future NBD_CMD_BLOCK_STATUS calls.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
  block/nbd.c | 7 ++++++-
  1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/block/nbd.c b/block/nbd.c
index f6ff1c4fb472..7c4ec058b0aa 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -1479,10 +1479,15 @@ static int coroutine_fn nbd_client_co_block_status(
      BDRVNBDState *s = (BDRVNBDState *)bs->opaque;
      Error *local_err = NULL;

+    /*
+     * No need to limit our over-the-wire request to @bytes; rather,
+     * ask the server for as much as it can send in one go, and the
+     * block layer will then cap things.
+     */
      NBDRequest request = {
          .type = NBD_CMD_BLOCK_STATUS,
          .from = offset,
          .len = MIN(QEMU_ALIGN_DOWN(INT_MAX, bs->bl.request_alignment),
-                   MIN(bytes, s->info.size - offset)),
+                   s->info.size - offset),
          .flags = NBD_CMD_FLAG_REQ_ONE,
      };



I remember we already discussed that, but can't find.

The problem is that it's not for free:

In server code in blockstatus_to_extents, we loop though the disk, trying to 
merge extents of the same type.

With full allocated qcow2, we'll have to load all L2 tables and handle them, to merge all 
block status into one big "allocated" extent.

Maybe, we need some additional negotiation flag, to allow BLOCK_STATUS command 
with NBD_CMD_FLAG_REQ_ONE flag to return an extent larger than required when 
that information is available for free?

--
Best regards,
Vladimir



reply via email to

[Prev in Thread] Current Thread [Next in Thread]