[Qemu-devel] [PATCH 1/1 V2] Add vhost-pci-blk driver
This driver uses the kernel-mode acceleration for virtio-blk and allows to get a near bare metal disk performance inside a VM. Signed-off-by: Vitaly Mayatskikh --- configure | 10 + default-configs/virtio.mak| 1 + hw/block/Makefile.objs| 1 + hw/block/vhost-blk.c | 429 ++ hw/virtio/virtio-pci.c| 60 + hw/virtio/virtio-pci.h| 19 ++ include/hw/virtio/vhost-blk.h | 43 7 files changed, 563 insertions(+) create mode 100644 hw/block/vhost-blk.c create mode 100644 include/hw/virtio/vhost-blk.h diff --git a/configure b/configure index 46ae1e8c76..787bc780da 100755 --- a/configure +++ b/configure @@ -371,6 +371,7 @@ vhost_crypto="no" vhost_scsi="no" vhost_vsock="no" vhost_user="" +vhost_blk="" kvm="no" hax="no" hvf="no" @@ -869,6 +870,7 @@ Linux) vhost_crypto="yes" vhost_scsi="yes" vhost_vsock="yes" + vhost_blk="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" supported_os="yes" libudev="yes" @@ -1263,6 +1265,10 @@ for opt do ;; --enable-vhost-vsock) vhost_vsock="yes" ;; + --disable-vhost-blk) vhost_blk="no" + ;; + --enable-vhost-blk) vhost_blk="yes" + ;; --disable-opengl) opengl="no" ;; --enable-opengl) opengl="yes" @@ -6000,6 +6006,7 @@ echo "vhost-crypto support $vhost_crypto" echo "vhost-scsi support $vhost_scsi" echo "vhost-vsock support $vhost_vsock" echo "vhost-user support $vhost_user" +echo "vhost-blk support $vhost_blk" echo "Trace backends$trace_backends" if have_backend "simple"; then echo "Trace output file $trace_file-" @@ -6461,6 +6468,9 @@ fi if test "$vhost_user" = "yes" ; then echo "CONFIG_VHOST_USER=y" >> $config_host_mak fi +if test "$vhost_blk" = "yes" ; then + echo "CONFIG_VHOST_BLK=y" >> $config_host_mak +fi if test "$blobs" = "yes" ; then echo "INSTALL_BLOBS=yes" >> $config_host_mak fi diff --git a/default-configs/virtio.mak b/default-configs/virtio.mak index 1304849018..765c0a2a04 100644 --- a/default-configs/virtio.mak +++ b/default-configs/virtio.mak @@ -1,5 +1,6 @@ CONFIG_VHOST_USER_SCSI=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) CONFIG_VHOST_USER_BLK=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) +CONFIG_VHOST_BLK=$(CONFIG_LINUX) CONFIG_VIRTIO=y CONFIG_VIRTIO_9P=y CONFIG_VIRTIO_BALLOON=y diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index 53ce5751ae..857ce823fc 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -14,3 +14,4 @@ obj-$(CONFIG_SH4) += tc58128.o obj-$(CONFIG_VIRTIO_BLK) += virtio-blk.o obj-$(CONFIG_VIRTIO_BLK) += dataplane/ obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o +obj-$(CONFIG_VHOST_BLK) += vhost-blk.o diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c new file mode 100644 index 00..4ca8040ee7 --- /dev/null +++ b/hw/block/vhost-blk.c @@ -0,0 +1,429 @@ +/* + * vhost-blk host device + * + * Copyright(C) 2018 IBM Corporation + * + * Authors: + * Vitaly Mayatskikh + * + * Largely based on the "vhost-user-blk.c" implemented by: + * Changpeng Liu + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/cutils.h" +#include "qom/object.h" +#include "hw/qdev-core.h" +#include "hw/virtio/vhost.h" +#include "hw/virtio/vhost-blk.h" +#include "hw/virtio/virtio.h" +#include "hw/virtio/virtio-bus.h" +#include "hw/virtio/virtio-access.h" +#include +#include + +static const int feature_bits[] = { +VIRTIO_BLK_F_SIZE_MAX, +VIRTIO_BLK_F_SEG_MAX, +VIRTIO_BLK_F_BLK_SIZE, +VIRTIO_BLK_F_TOPOLOGY, +VIRTIO_BLK_F_MQ, +VIRTIO_BLK_F_RO, +VIRTIO_BLK_F_FLUSH, +VIRTIO_BLK_F_CONFIG_WCE, +VIRTIO_F_VERSION_1, +VIRTIO_RING_F_INDIRECT_DESC, +VIRTIO_RING_F_EVENT_IDX, +VIRTIO_F_NOTIFY_ON_EMPTY, +VHOST_INVALID_FEATURE_BIT +}; + +static void vhost_blk_get_config(VirtIODevice *vdev, uint8_t *config) +{ +VHostBlk *s = VHOST_BLK(vdev); +memcpy(config, >blkcfg, sizeof(struct virtio_blk_config)); +} + +static void vhost_blk_set_config(VirtIODevice *vdev, const uint8_t *config) +{ +VHostBlk *s = VHOST_BLK(vdev); +struct virtio_blk_config *blkcfg = (struct virtio_blk_config *)config; +int ret; + +if (blkcfg->wce == s->blkcfg.wce) { +return;
[Qemu-devel] [PATCH 0/1 V2] Add vhost-pci-blk driver
V2 changes: - checkpatch style fixes - correct size detection of disk image placed on a file system This driver moves virtio-blk host-side processing to kernel (via new vhost_blk kernel driver). It accelerates virtual disk performance close to the bare metal levels, especially for parellel loads. For example, fio numjobs=16 gets 101k randread IOPS using virtio-blk and 1202k IOPS using vhost-blk, close to 1480k of raw disk performance. See the IOPS numbers below. The kernel part if you want to try: - vhost_blk: https://lkml.org/lkml/2018/11/2/648 - vhost num-queues scalability fix: https://lkml.org/lkml/2018/11/2/550 # fio num-jobs # A: bare metal over block # B: bare metal over file # C: virtio-blk over block # D: virtio-blk over file # E: vhost-blk over block # F: vhost-blk over file # # A B CDE F 1 171k 151k 148k 151k 187k 175k 2 328k 302k 249k 241k 334k 296k 3 479k 437k 179k 174k 464k 404k 4 622k 568k 143k 183k 580k 492k 5 755k 697k 136k 128k 693k 579k 6 887k 808k 131k 120k 782k 640k 7 1004k 926k 126k 131k 863k 693k 8 1099k 1015k 117k 115k 931k 712k 9 1194k 1119k 115k 111k 991k 711k 10 1278k 1207k 109k 114k 1046k 695k 11 1345k 1280k 110k 108k 1091k 663k 12 1411k 1356k 104k 106k 1142k 629k 13 1466k 1423k 106k 106k 1170k 607k 14 1517k 1486k 103k 106k 1179k 589k 15 1552k 1543k 102k 102k 1191k 571k 16 1480k 1506k 101k 102k 1202k 566k Vitaly Mayatskikh (1): Add vhost-pci-blk driver configure | 10 + default-configs/virtio.mak| 1 + hw/block/Makefile.objs| 1 + hw/block/vhost-blk.c | 429 ++ hw/virtio/virtio-pci.c| 60 + hw/virtio/virtio-pci.h| 19 ++ include/hw/virtio/vhost-blk.h | 43 7 files changed, 563 insertions(+) create mode 100644 hw/block/vhost-blk.c create mode 100644 include/hw/virtio/vhost-blk.h -- 2.17.1
[Qemu-devel] [PATCH 1/1 resend] Add vhost-pci-blk driver
This driver uses the kernel-mode acceleration for virtio-blk and allows to get a near bare metal disk performance inside a VM. Signed-off-by: Vitaly Mayatskikh --- configure | 10 + default-configs/virtio.mak| 1 + hw/block/Makefile.objs| 1 + hw/block/vhost-blk.c | 411 ++ hw/virtio/virtio-pci.c| 60 + hw/virtio/virtio-pci.h| 19 ++ include/hw/virtio/vhost-blk.h | 43 7 files changed, 545 insertions(+) create mode 100644 hw/block/vhost-blk.c create mode 100644 include/hw/virtio/vhost-blk.h diff --git a/configure b/configure index 46ae1e8c76..787bc780da 100755 --- a/configure +++ b/configure @@ -371,6 +371,7 @@ vhost_crypto="no" vhost_scsi="no" vhost_vsock="no" vhost_user="" +vhost_blk="" kvm="no" hax="no" hvf="no" @@ -869,6 +870,7 @@ Linux) vhost_crypto="yes" vhost_scsi="yes" vhost_vsock="yes" + vhost_blk="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" supported_os="yes" libudev="yes" @@ -1263,6 +1265,10 @@ for opt do ;; --enable-vhost-vsock) vhost_vsock="yes" ;; + --disable-vhost-blk) vhost_blk="no" + ;; + --enable-vhost-blk) vhost_blk="yes" + ;; --disable-opengl) opengl="no" ;; --enable-opengl) opengl="yes" @@ -6000,6 +6006,7 @@ echo "vhost-crypto support $vhost_crypto" echo "vhost-scsi support $vhost_scsi" echo "vhost-vsock support $vhost_vsock" echo "vhost-user support $vhost_user" +echo "vhost-blk support $vhost_blk" echo "Trace backends$trace_backends" if have_backend "simple"; then echo "Trace output file $trace_file-" @@ -6461,6 +6468,9 @@ fi if test "$vhost_user" = "yes" ; then echo "CONFIG_VHOST_USER=y" >> $config_host_mak fi +if test "$vhost_blk" = "yes" ; then + echo "CONFIG_VHOST_BLK=y" >> $config_host_mak +fi if test "$blobs" = "yes" ; then echo "INSTALL_BLOBS=yes" >> $config_host_mak fi diff --git a/default-configs/virtio.mak b/default-configs/virtio.mak index 1304849018..765c0a2a04 100644 --- a/default-configs/virtio.mak +++ b/default-configs/virtio.mak @@ -1,5 +1,6 @@ CONFIG_VHOST_USER_SCSI=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) CONFIG_VHOST_USER_BLK=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) +CONFIG_VHOST_BLK=$(CONFIG_LINUX) CONFIG_VIRTIO=y CONFIG_VIRTIO_9P=y CONFIG_VIRTIO_BALLOON=y diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index 53ce5751ae..857ce823fc 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -14,3 +14,4 @@ obj-$(CONFIG_SH4) += tc58128.o obj-$(CONFIG_VIRTIO_BLK) += virtio-blk.o obj-$(CONFIG_VIRTIO_BLK) += dataplane/ obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o +obj-$(CONFIG_VHOST_BLK) += vhost-blk.o diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c new file mode 100644 index 00..6d30b3c8fa --- /dev/null +++ b/hw/block/vhost-blk.c @@ -0,0 +1,411 @@ +/* + * vhost-blk host device + * + * Copyright(C) 2018 IBM Corporation + * + * Authors: + * Vitaly Mayatskikh + * + * Largely based on the "vhost-user-blk.c" implemented by: + * Changpeng Liu + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/cutils.h" +#include "qom/object.h" +#include "hw/qdev-core.h" +#include "hw/virtio/vhost.h" +#include "hw/virtio/vhost-blk.h" +#include "hw/virtio/virtio.h" +#include "hw/virtio/virtio-bus.h" +#include "hw/virtio/virtio-access.h" +#include +#include + +static const int feature_bits[] = { +VIRTIO_BLK_F_SIZE_MAX, +VIRTIO_BLK_F_SEG_MAX, +VIRTIO_BLK_F_BLK_SIZE, +VIRTIO_BLK_F_TOPOLOGY, +VIRTIO_BLK_F_MQ, +VIRTIO_BLK_F_RO, +VIRTIO_BLK_F_FLUSH, +VIRTIO_BLK_F_CONFIG_WCE, +VIRTIO_F_VERSION_1, +VIRTIO_RING_F_INDIRECT_DESC, +VIRTIO_RING_F_EVENT_IDX, +VIRTIO_F_NOTIFY_ON_EMPTY, +VHOST_INVALID_FEATURE_BIT +}; + +static void vhost_blk_get_config(VirtIODevice *vdev, uint8_t *config) +{ +VHostBlk *s = VHOST_BLK(vdev); +memcpy(config, >blkcfg, sizeof(struct virtio_blk_config)); +} + +static void vhost_blk_set_config(VirtIODevice *vdev, const uint8_t *config) +{ +VHostBlk *s = VHOST_BLK(vdev); +struct virtio_blk_config *blkcfg = (struct virtio_blk_config *)config; +int ret; + +if (blkcfg->wce == s->blkcfg.wce) { +return;
[Qemu-devel] [PATCH 0/1 resend] Add vhost-pci-blk driver
This driver moves virtio-blk host-side processing to kernel (via new vhost_blk kernel driver). It accelerates virtual disk performance close to bare metal levels, especially for parellel loads. For example, fio numjobs=16 gets 101k randread IOPS using virtio-blk and 1202k IOPS using vhost-blk, close to 1480k of raw disk performance. See the IOPS numbers below. The kernel part if you want to try: - vhost_blk: https://lkml.org/lkml/2018/11/2/648 - vhost num-queues scalability fix: https://lkml.org/lkml/2018/11/2/550 # fio num-jobs # A: bare metal over block # B: bare metal over file # C: virtio-blk over block # D: virtio-blk over file # E: vhost-blk over block # F: vhost-blk over file # # A B CDE F 1 171k 151k 148k 151k 187k 175k 2 328k 302k 249k 241k 334k 296k 3 479k 437k 179k 174k 464k 404k 4 622k 568k 143k 183k 580k 492k 5 755k 697k 136k 128k 693k 579k 6 887k 808k 131k 120k 782k 640k 7 1004k 926k 126k 131k 863k 693k 8 1099k 1015k 117k 115k 931k 712k 9 1194k 1119k 115k 111k 991k 711k 10 1278k 1207k 109k 114k 1046k 695k 11 1345k 1280k 110k 108k 1091k 663k 12 1411k 1356k 104k 106k 1142k 629k 13 1466k 1423k 106k 106k 1170k 607k 14 1517k 1486k 103k 106k 1179k 589k 15 1552k 1543k 102k 102k 1191k 571k 16 1480k 1506k 101k 102k 1202k 566k Vitaly Mayatskikh (1): Add vhost-pci-blk driver configure | 10 +++ default-configs/virtio.mak | 1 + hw/block/Makefile.objs | 1 + hw/virtio/virtio-pci.c | 60 ++ hw/virtio/virtio-pci.h | 19 5 files changed, 91 insertions(+) -- 2.17.1
[Qemu-devel] [PATCH 1/1] Add vhost-pci-blk driver
This driver uses the kernel-mode acceleration for virtio-blk and allows to get a near bare metal disk performance inside a VM. Signed-off-by: Vitaly Mayatskikh --- configure | 10 +++ default-configs/virtio.mak | 1 + hw/block/Makefile.objs | 1 + hw/virtio/virtio-pci.c | 60 ++ hw/virtio/virtio-pci.h | 19 5 files changed, 91 insertions(+) diff --git a/configure b/configure index 46ae1e8c76..787bc780da 100755 --- a/configure +++ b/configure @@ -371,6 +371,7 @@ vhost_crypto="no" vhost_scsi="no" vhost_vsock="no" vhost_user="" +vhost_blk="" kvm="no" hax="no" hvf="no" @@ -869,6 +870,7 @@ Linux) vhost_crypto="yes" vhost_scsi="yes" vhost_vsock="yes" + vhost_blk="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" supported_os="yes" libudev="yes" @@ -1263,6 +1265,10 @@ for opt do ;; --enable-vhost-vsock) vhost_vsock="yes" ;; + --disable-vhost-blk) vhost_blk="no" + ;; + --enable-vhost-blk) vhost_blk="yes" + ;; --disable-opengl) opengl="no" ;; --enable-opengl) opengl="yes" @@ -6000,6 +6006,7 @@ echo "vhost-crypto support $vhost_crypto" echo "vhost-scsi support $vhost_scsi" echo "vhost-vsock support $vhost_vsock" echo "vhost-user support $vhost_user" +echo "vhost-blk support $vhost_blk" echo "Trace backends$trace_backends" if have_backend "simple"; then echo "Trace output file $trace_file-" @@ -6461,6 +6468,9 @@ fi if test "$vhost_user" = "yes" ; then echo "CONFIG_VHOST_USER=y" >> $config_host_mak fi +if test "$vhost_blk" = "yes" ; then + echo "CONFIG_VHOST_BLK=y" >> $config_host_mak +fi if test "$blobs" = "yes" ; then echo "INSTALL_BLOBS=yes" >> $config_host_mak fi diff --git a/default-configs/virtio.mak b/default-configs/virtio.mak index 1304849018..765c0a2a04 100644 --- a/default-configs/virtio.mak +++ b/default-configs/virtio.mak @@ -1,5 +1,6 @@ CONFIG_VHOST_USER_SCSI=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) CONFIG_VHOST_USER_BLK=$(call land,$(CONFIG_VHOST_USER),$(CONFIG_LINUX)) +CONFIG_VHOST_BLK=$(CONFIG_LINUX) CONFIG_VIRTIO=y CONFIG_VIRTIO_9P=y CONFIG_VIRTIO_BALLOON=y diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index 53ce5751ae..857ce823fc 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -14,3 +14,4 @@ obj-$(CONFIG_SH4) += tc58128.o obj-$(CONFIG_VIRTIO_BLK) += virtio-blk.o obj-$(CONFIG_VIRTIO_BLK) += dataplane/ obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o +obj-$(CONFIG_VHOST_BLK) += vhost-blk.o diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index a954799267..ec00b54424 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -2060,6 +2060,63 @@ static const TypeInfo vhost_user_blk_pci_info = { }; #endif +#ifdef CONFIG_VHOST_BLK +/* vhost-blk */ + +static Property vhost_blk_pci_properties[] = { +DEFINE_PROP_UINT32("class", VirtIOPCIProxy, class_code, 0), +DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, + DEV_NVECTORS_UNSPECIFIED), +DEFINE_PROP_END_OF_LIST(), +}; + +static void vhost_blk_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) +{ +VHostBlkPCI *dev = VHOST_BLK_PCI(vpci_dev); +DeviceState *vdev = DEVICE(>vdev); + +if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { +vpci_dev->nvectors = dev->vdev.num_queues + 1; +} + +qdev_set_parent_bus(vdev, BUS(_dev->bus)); +object_property_set_bool(OBJECT(vdev), true, "realized", errp); +} + +static void vhost_blk_pci_class_init(ObjectClass *klass, void *data) +{ +DeviceClass *dc = DEVICE_CLASS(klass); +VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); +PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); + +set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); +dc->props = vhost_blk_pci_properties; +k->realize = vhost_blk_pci_realize; +pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; +pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK; +pcidev_k->revision = VIRTIO_PCI_ABI_VERSION; +pcidev_k->class_id = PCI_CLASS_STORAGE_SCSI; +} + +static void vhost_blk_pci_instance_init(Object *obj) +{ +VHostBlkPCI *dev = VHOST_BLK_PCI(obj); + +virtio_instance_init_common(obj, >vdev, sizeof(dev->vdev), +TYPE_VHOST_BLK); +object_property_add_alias(obj, "bootindex", OBJECT(>vdev), + "bootindex", _abort); +} + +static const TypeInfo vhost_blk
[Qemu-devel] [PATCH 0/1] Add vhost-pci-blk driver
This driver moves virtio-blk host-side processing to kernel (via new vhost_blk kernel driver). It accelerates virtual disk performance close to bare metal levels, especially for parellel loads. For example, fio numjobs=16 gets 101k randread IOPS using virtio-blk and 1202k IOPS using vhost-blk, close to 1480k of raw disk performance. See the IOPS numbers below. The kernel part if you want to try: - vhost_blk: https://lkml.org/lkml/2018/11/2/648 - vhost num-queues scalability fix: https://lkml.org/lkml/2018/11/2/550 # fio num-jobs # A: bare metal over block # B: bare metal over file # C: virtio-blk over block # D: virtio-blk over file # E: vhost-blk over block # F: vhost-blk over file # # A B CDE F 1 171k 151k 148k 151k 187k 175k 2 328k 302k 249k 241k 334k 296k 3 479k 437k 179k 174k 464k 404k 4 622k 568k 143k 183k 580k 492k 5 755k 697k 136k 128k 693k 579k 6 887k 808k 131k 120k 782k 640k 7 1004k 926k 126k 131k 863k 693k 8 1099k 1015k 117k 115k 931k 712k 9 1194k 1119k 115k 111k 991k 711k 10 1278k 1207k 109k 114k 1046k 695k 11 1345k 1280k 110k 108k 1091k 663k 12 1411k 1356k 104k 106k 1142k 629k 13 1466k 1423k 106k 106k 1170k 607k 14 1517k 1486k 103k 106k 1179k 589k 15 1552k 1543k 102k 102k 1191k 571k 16 1480k 1506k 101k 102k 1202k 566k Vitaly Mayatskikh (1): Add vhost-pci-blk driver configure | 10 +++ default-configs/virtio.mak | 1 + hw/block/Makefile.objs | 1 + hw/virtio/virtio-pci.c | 60 ++ hw/virtio/virtio-pci.h | 19 5 files changed, 91 insertions(+) -- 2.17.1