[PATCH] vhost-user-blk-server: notify client about disk resize

Vladimir Sementsov-Ogievskiy posted 1 patch 1 year, 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20230321201323.3695923-1-vsementsov@yandex-team.ru
Maintainers: Coiby Xu <Coiby.Xu@gmail.com>, Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>
subprojects/libvhost-user/libvhost-user.h |  2 ++
block/export/vhost-user-blk-server.c      | 24 +++++++++++++++++++++++
subprojects/libvhost-user/libvhost-user.c | 10 ++++++++++
3 files changed, 36 insertions(+)
[PATCH] vhost-user-blk-server: notify client about disk resize
Posted by Vladimir Sementsov-Ogievskiy 1 year, 1 month ago
Currently block_resize qmp command is simply ignored by vhost-user-blk
export. So, the block-node is successfully resized, but virtio config
is unchanged and guest doesn't see that disk is resized.

Let's handle the resize by modifying the config and notifying the guest
appropriately.

After this comment, lsblk in linux guest with attached
vhost-user-blk-pci device shows new size immediately after block_resize
QMP command on vhost-user exported block node.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---

Hi all! Seems, we have everything except this tiny patch to support live
disk resize for vhost-user export.

How I test:

./build/storage-daemon/qemu-storage-daemon --blockdev file,filename=a,node-name=f1 --export vhost-user-blk,node-name=f1,addr.type=unix,addr.path=/tmp/sock,writable=on,id=gg --chardev socket,path=qmp.sock,server=on,wait=off,id=char1 --monitor chardev=char1

In another terminal, connect to qmp interface by

nc -U qmp.sock

Launch QEMU:

./build/qemu-system-x86_64 -M q35,accel=kvm,memory-backend=mem -object memory-backend-file,share=on,id=mem,size=1G,mem-path=/dev/shm/qemu-ram -drive file=/home/vsementsov/work/vms/ub -chardev socket,path=/tmp/sock,id=char0 -device vhost-user-blk-pci,chardev=char0

Then, run in the guest lsblk command to check current size of vhost-user
driven disk.

Then in nc terminal:
{'execute': 'qmp_capabilities'}
{'execute': 'block_resize', 'arguments': {'node-name': 'f1', 'size': 628531200}}

Then, check in the guest that lsblk shows new size.


 subprojects/libvhost-user/libvhost-user.h |  2 ++
 block/export/vhost-user-blk-server.c      | 24 +++++++++++++++++++++++
 subprojects/libvhost-user/libvhost-user.c | 10 ++++++++++
 3 files changed, 36 insertions(+)

diff --git a/subprojects/libvhost-user/libvhost-user.h b/subprojects/libvhost-user/libvhost-user.h
index 8c5a2719e3..49208cceaa 100644
--- a/subprojects/libvhost-user/libvhost-user.h
+++ b/subprojects/libvhost-user/libvhost-user.h
@@ -585,6 +585,8 @@ bool vu_queue_empty(VuDev *dev, VuVirtq *vq);
  */
 void vu_queue_notify(VuDev *dev, VuVirtq *vq);
 
+void vu_config_change_msg(VuDev *dev);
+
 /**
  * vu_queue_notify_sync:
  * @dev: a VuDev context
diff --git a/block/export/vhost-user-blk-server.c b/block/export/vhost-user-blk-server.c
index 3409d9e02e..e56b92f2e2 100644
--- a/block/export/vhost-user-blk-server.c
+++ b/block/export/vhost-user-blk-server.c
@@ -10,6 +10,7 @@
  * later.  See the COPYING file in the top-level directory.
  */
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "block/block.h"
 #include "subprojects/libvhost-user/libvhost-user.h" /* only for the type definitions */
 #include "standard-headers/linux/virtio_blk.h"
@@ -251,6 +252,27 @@ static void vu_blk_exp_request_shutdown(BlockExport *exp)
     vhost_user_server_stop(&vexp->vu_server);
 }
 
+static void vu_blk_exp_resize(void *opaque)
+{
+    VuBlkExport *vexp = opaque;
+    BlockDriverState *bs = blk_bs(vexp->handler.blk);
+    int64_t new_size = bdrv_getlength(bs);
+
+    if (new_size < 0) {
+        error_printf("Failed to get length of block node '%s'",
+                     bdrv_get_node_name(bs));
+        return;
+    }
+
+    vexp->blkcfg.capacity = cpu_to_le64(new_size >> VIRTIO_BLK_SECTOR_BITS);
+
+    vu_config_change_msg(&vexp->vu_server.vu_dev);
+}
+
+static const BlockDevOps vu_blk_dev_ops = {
+    .resize_cb = vu_blk_exp_resize,
+};
+
 static int vu_blk_exp_create(BlockExport *exp, BlockExportOptions *opts,
                              Error **errp)
 {
@@ -292,6 +314,8 @@ static int vu_blk_exp_create(BlockExport *exp, BlockExportOptions *opts,
     blk_add_aio_context_notifier(exp->blk, blk_aio_attached, blk_aio_detach,
                                  vexp);
 
+    blk_set_dev_ops(exp->blk, &vu_blk_dev_ops, vexp);
+
     if (!vhost_user_server_start(&vexp->vu_server, vu_opts->addr, exp->ctx,
                                  num_queues, &vu_blk_iface, errp)) {
         blk_remove_aio_context_notifier(exp->blk, blk_aio_attached,
diff --git a/subprojects/libvhost-user/libvhost-user.c b/subprojects/libvhost-user/libvhost-user.c
index 0200b78e8e..0abd898a52 100644
--- a/subprojects/libvhost-user/libvhost-user.c
+++ b/subprojects/libvhost-user/libvhost-user.c
@@ -2455,6 +2455,16 @@ void vu_queue_notify_sync(VuDev *dev, VuVirtq *vq)
     _vu_queue_notify(dev, vq, true);
 }
 
+void vu_config_change_msg(VuDev *dev)
+{
+    VhostUserMsg vmsg = {
+        .request = VHOST_USER_BACKEND_CONFIG_CHANGE_MSG,
+        .flags = VHOST_USER_VERSION,
+    };
+
+    vu_message_write(dev, dev->slave_fd, &vmsg);
+}
+
 static inline void
 vring_used_flags_set_bit(VuVirtq *vq, int mask)
 {
-- 
2.34.1
Re: [PATCH] vhost-user-blk-server: notify client about disk resize
Posted by Vladimir Sementsov-Ogievskiy 1 year ago
On 21.03.23 23:13, Vladimir Sementsov-Ogievskiy wrote:
> Currently block_resize qmp command is simply ignored by vhost-user-blk
> export. So, the block-node is successfully resized, but virtio config
> is unchanged and guest doesn't see that disk is resized.
> 
> Let's handle the resize by modifying the config and notifying the guest
> appropriately.
> 
> After this comment, lsblk in linux guest with attached
> vhost-user-blk-pci device shows new size immediately after block_resize
> QMP command on vhost-user exported block node.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy<vsementsov@yandex-team.ru>

Ping:) Any interest in that? Or, is there some another way to live-resize vhost-user disks?

-- 
Best regards,
Vladimir