From: Hyman Huang(黄勇) <yong.hu...@smartx.com> Commit "9445e1e15 virtio-blk-pci: default num_queues to -smp N" implment sizing the number of virtio-blk-pci request virtqueues to match the number of vCPUs automatically. Which improves IO preformance remarkably.
To enable this feature for the existing VMs, the cloud platform may migrate VMs from the source hypervisor (num_queues is set to 1 by default) to the destination hypervisor (num_queues is set to -smp N) lively. The different num-queues for virtio-blk-pci devices between the source side and the destination side will result in migration failure due to loading vmstate incorrectly on the destination side. To provide a smooth upgrade solution, introduce the auto-num-queues property for the virtio-blk-pci device. This allows upper APPs, e.g., libvirt, to recognize the hypervisor's capability of allocating the virtqueues automatically by probing the virtio-blk-pci.auto-num-queues property. Basing on which, upper APPs can ensure to allocate the same num-queues on the destination side in case of migration failure. Signed-off-by: Hyman Huang(黄勇) <yong.hu...@smartx.com> --- hw/block/virtio-blk.c | 1 + hw/virtio/virtio-blk-pci.c | 9 ++++++++- include/hw/virtio/virtio-blk.h | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 39e7f23fab..9e498ca64a 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1716,6 +1716,7 @@ static Property virtio_blk_properties[] = { #endif DEFINE_PROP_BIT("request-merging", VirtIOBlock, conf.request_merging, 0, true), + DEFINE_PROP_BOOL("auto-num-queues", VirtIOBlock, auto_num_queues, true), DEFINE_PROP_UINT16("num-queues", VirtIOBlock, conf.num_queues, VIRTIO_BLK_AUTO_NUM_QUEUES), DEFINE_PROP_UINT16("queue-size", VirtIOBlock, conf.queue_size, 256), diff --git a/hw/virtio/virtio-blk-pci.c b/hw/virtio/virtio-blk-pci.c index 9743bee965..4b6b4c4933 100644 --- a/hw/virtio/virtio-blk-pci.c +++ b/hw/virtio/virtio-blk-pci.c @@ -54,7 +54,14 @@ static void virtio_blk_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) VirtIOBlkConf *conf = &dev->vdev.conf; if (conf->num_queues == VIRTIO_BLK_AUTO_NUM_QUEUES) { - conf->num_queues = virtio_pci_optimal_num_queues(0); + /* + * Allocate virtqueues automatically only if auto_num_queues + * property set true. + */ + if (dev->vdev.auto_num_queues) + conf->num_queues = virtio_pci_optimal_num_queues(0); + else + conf->num_queues = 1; } if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h index dafec432ce..dab6d7c70c 100644 --- a/include/hw/virtio/virtio-blk.h +++ b/include/hw/virtio/virtio-blk.h @@ -65,6 +65,11 @@ struct VirtIOBlock { uint64_t host_features; size_t config_size; BlockRAMRegistrar blk_ram_registrar; + /* + * Set to true if virtqueues allow to be allocated to + * match the number of virtual CPUs automatically. + */ + bool auto_num_queues; }; typedef struct VirtIOBlockReq { -- 2.38.5