Re: [Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device
On 09/08/2017 19:10, Michael S. Tsirkin wrote: > So user specifies properties and > they get sent to backend at init time. Only handle geometry changes > specially. So QEMU would get the configuration, set these properties, and send the result to the backend via SET_CONFIG? vhost-user-blk-pci.cyls=uint32 vhost-user-blk-pci.secs=uint32 vhost-user-blk-pci.heads=uint32 vhost-user-blk-pci.serial=str vhost-user-blk-pci.min_io_size=uint16 vhost-user-blk-pci.opt_io_size=uint32 vhost-user-blk-pci.logical_block_size=uint16 vhost-user-blk-pci.physical_block_size=uint16 If the properties are incompatible (e.g. too small logical block size) SET_CONFIG fails and QEMU would fail to realize the device. This makes sense, I think. Thanks, Paolo
Re: [Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device
> -Original Message- > From: Marc-André Lureau [mailto:marcandre.lur...@redhat.com] > Sent: Wednesday, August 9, 2017 11:39 PM > To: Liu, Changpeng > Cc: qemu-devel@nongnu.org; stefa...@gmail.com; pbonz...@redhat.com; > m...@redhat.com; fel...@nutanix.com; Harris, James R > > Subject: Re: [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk > host > device > > Hi > > - Original Message - > > This commit introduces a new vhost-user device for block, it uses a > > chardev to connect with the backend, same with Qemu virito-blk device, > > Guest OS still uses the virtio-blk frontend driver. > > > > To use it, start Qemu with command line like this: > > > > qemu-system-x86_64 \ > > -chardev socket,id=char0,path=/path/vhost.socket \ > > -device vhost-user-blk-pci,chardev=char0,num_queues=... > > > > Different with exist Qemu virtio-blk host device, it makes more easy > > for users to implement their own I/O processing logic, such as all > > user space I/O stack against hardware block device. It uses the new > > vhost messages(VHOST_USER_GET_CONFIG) to get block virtio config > > information from backend process. > > > > Signed-off-by: Changpeng Liu > > --- > > configure | 11 ++ > > hw/block/Makefile.objs | 3 + > > hw/block/vhost-user-blk.c | 360 > > + > > hw/virtio/virtio-pci.c | 55 ++ > > hw/virtio/virtio-pci.h | 18 ++ > > include/hw/virtio/vhost-user-blk.h | 40 + > > 6 files changed, 487 insertions(+) > > create mode 100644 hw/block/vhost-user-blk.c > > create mode 100644 include/hw/virtio/vhost-user-blk.h > > > > diff --git a/configure b/configure > > index dd73cce..1452c66 100755 > > --- a/configure > > +++ b/configure > > @@ -305,6 +305,7 @@ tcg="yes" > > > > vhost_net="no" > > vhost_scsi="no" > > +vhost_user_blk="no" > > vhost_vsock="no" > > vhost_user="" > > kvm="no" > > @@ -779,6 +780,7 @@ Linux) > >kvm="yes" > >vhost_net="yes" > >vhost_scsi="yes" > > + vhost_user_blk="yes" > >vhost_vsock="yes" > >QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers > >$QEMU_INCLUDES" > >supported_os="yes" > > @@ -1136,6 +1138,10 @@ for opt do > >;; > >--enable-vhost-scsi) vhost_scsi="yes" > >;; > > + --disable-vhost-user-blk) vhost_user_blk="no" > > + ;; > > + --enable-vhost-user-blk) vhost_user_blk="yes" > > + ;; > > I suggest we don't add yet another configure option, but reuse the recently > introduced --enable-vhost-user (that should cover all vhost-user devices for > now, > but may learn to enable specific devices if needed in the future). Yes, I noticed there is a new vhost-user configuration, sounds good to me if other devices such as vhost-net and vhost-scsi also use the same configuration option. > > >--disable-vhost-vsock) vhost_vsock="no" > >;; > >--enable-vhost-vsock) vhost_vsock="yes" > > @@ -1506,6 +1512,7 @@ disabled with --disable-FEATURE, default is enabled if > > available: > >cap-ng libcap-ng support > >attrattr and xattr support > >vhost-net vhost-net acceleration support > > + vhost-user-blk VM virtio-blk acceleration in user space > >spice spice > >rbd rados block device (rbd) > >libiscsiiscsi support > > @@ -5365,6 +5372,7 @@ echo "posix_madvise $posix_madvise" > > echo "libcap-ng support $cap_ng" > > echo "vhost-net support $vhost_net" > > echo "vhost-scsi support $vhost_scsi" > > +echo "vhost-user-blk support $vhost_user_blk" > > echo "vhost-vsock support $vhost_vsock" > > echo "vhost-user support $vhost_user" > > echo "Trace backends$trace_backends" > > @@ -5776,6 +5784,9 @@ fi > > if test "$vhost_scsi" = "yes" ; then > >echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak > > fi > > +if test "$vhost_user_blk" = "yes" ; then > > + echo "CONFIG_VHOST_USER_BLK=y" >> $config_host_mak > > +fi > > if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then > >echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak > > fi > > diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs > > index e0ed980..4c19a58 100644 > > --- a/hw/block/Makefile.objs > > +++ b/hw/block/Makefile.objs > > @@ -13,3 +13,6 @@ obj-$(CONFIG_SH4) += tc58128.o > > > > obj-$(CONFIG_VIRTIO) += virtio-blk.o > > obj-$(CONFIG_VIRTIO) += dataplane/ > > +ifeq ($(CONFIG_VIRTIO),y) > > +obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o > > +endif > > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > > new file mode 100644 > > index 000..8aa9fa9 > > --- /dev/null > > +++ b/hw/block/vhost-user-blk.c > > @@ -0,0 +1,360 @@ > > +/* > > + * vhost-user-blk host device > > + * > > + * Copyright IBM, Corp. 2011 > > + * Copyright(C) 2017 Intel Corporation. > > + * > > + * Authors: > > + * Stefan Hajnoczi > > + * Changpeng Liu > > + * > > + * This work is licensed under the
Re: [Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device
I only had time for a quick look. More review when you repost after release. On Thu, Aug 10, 2017 at 06:12:29PM +0800, Changpeng Liu wrote: > This commit introduces a new vhost-user device for block, it uses a > chardev to connect with the backend, same with Qemu virito-blk device, > Guest OS still uses the virtio-blk frontend driver. > > To use it, start Qemu with command line like this: > > qemu-system-x86_64 \ > -chardev socket,id=char0,path=/path/vhost.socket \ > -device vhost-user-blk-pci,chardev=char0,num_queues=... > > Different with exist Qemu virtio-blk host device, it makes more easy > for users to implement their own I/O processing logic, such as all > user space I/O stack against hardware block device. It uses the new > vhost messages(VHOST_USER_GET_CONFIG) to get block virtio config > information from backend process. I took a quick look. I think I would prefer a more direct approach where qemu is more of a driver. So user specifies properties and they get sent to backend at init time. Only handle geometry changes specially. > > Signed-off-by: Changpeng Liu > --- > configure | 11 ++ > hw/block/Makefile.objs | 3 + > hw/block/vhost-user-blk.c | 360 > + > hw/virtio/virtio-pci.c | 55 ++ > hw/virtio/virtio-pci.h | 18 ++ > include/hw/virtio/vhost-user-blk.h | 40 + > 6 files changed, 487 insertions(+) > create mode 100644 hw/block/vhost-user-blk.c > create mode 100644 include/hw/virtio/vhost-user-blk.h > > diff --git a/configure b/configure > index dd73cce..1452c66 100755 > --- a/configure > +++ b/configure > @@ -305,6 +305,7 @@ tcg="yes" > > vhost_net="no" > vhost_scsi="no" > +vhost_user_blk="no" > vhost_vsock="no" > vhost_user="" > kvm="no" > @@ -779,6 +780,7 @@ Linux) >kvm="yes" >vhost_net="yes" >vhost_scsi="yes" > + vhost_user_blk="yes" >vhost_vsock="yes" >QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers > $QEMU_INCLUDES" >supported_os="yes" > @@ -1136,6 +1138,10 @@ for opt do >;; >--enable-vhost-scsi) vhost_scsi="yes" >;; > + --disable-vhost-user-blk) vhost_user_blk="no" > + ;; > + --enable-vhost-user-blk) vhost_user_blk="yes" > + ;; >--disable-vhost-vsock) vhost_vsock="no" >;; >--enable-vhost-vsock) vhost_vsock="yes" > @@ -1506,6 +1512,7 @@ disabled with --disable-FEATURE, default is enabled if > available: >cap-ng libcap-ng support >attrattr and xattr support >vhost-net vhost-net acceleration support > + vhost-user-blk VM virtio-blk acceleration in user space >spice spice >rbd rados block device (rbd) >libiscsiiscsi support > @@ -5365,6 +5372,7 @@ echo "posix_madvise $posix_madvise" > echo "libcap-ng support $cap_ng" > echo "vhost-net support $vhost_net" > echo "vhost-scsi support $vhost_scsi" > +echo "vhost-user-blk support $vhost_user_blk" > echo "vhost-vsock support $vhost_vsock" > echo "vhost-user support $vhost_user" > echo "Trace backends$trace_backends" > @@ -5776,6 +5784,9 @@ fi > if test "$vhost_scsi" = "yes" ; then >echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak > fi > +if test "$vhost_user_blk" = "yes" ; then > + echo "CONFIG_VHOST_USER_BLK=y" >> $config_host_mak > +fi > if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then >echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak > fi > diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs > index e0ed980..4c19a58 100644 > --- a/hw/block/Makefile.objs > +++ b/hw/block/Makefile.objs > @@ -13,3 +13,6 @@ obj-$(CONFIG_SH4) += tc58128.o > > obj-$(CONFIG_VIRTIO) += virtio-blk.o > obj-$(CONFIG_VIRTIO) += dataplane/ > +ifeq ($(CONFIG_VIRTIO),y) > +obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o > +endif > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > new file mode 100644 > index 000..8aa9fa9 > --- /dev/null > +++ b/hw/block/vhost-user-blk.c > @@ -0,0 +1,360 @@ > +/* > + * vhost-user-blk host device > + * > + * Copyright IBM, Corp. 2011 > + * Copyright(C) 2017 Intel Corporation. > + * > + * Authors: > + * Stefan Hajnoczi > + * 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/typedefs.h" > +#include "qemu/cutils.h" > +#include "qom/object.h" > +#include "hw/qdev-core.h" > +#include "hw/virtio/vhost.h" > +#include "hw/virtio/vhost-user-blk.h" > +#include "hw/virtio/virtio.h" > +#include "hw/virtio/virtio-bus.h" > +#include "hw/virtio/virtio-access.h" > + > +static const int user_feature_bits[] = { > +VIRTIO_BLK_F_SIZE_MAX, > +VIRTIO_BLK_F_SEG_MAX, > +VIRTIO_BLK_F_GEOMETRY, > +VIRTIO_BLK_F_BLK_SIZE, > +VIRTIO_BLK_F_TOPOL
Re: [Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device
Hi - Original Message - > This commit introduces a new vhost-user device for block, it uses a > chardev to connect with the backend, same with Qemu virito-blk device, > Guest OS still uses the virtio-blk frontend driver. > > To use it, start Qemu with command line like this: > > qemu-system-x86_64 \ > -chardev socket,id=char0,path=/path/vhost.socket \ > -device vhost-user-blk-pci,chardev=char0,num_queues=... > > Different with exist Qemu virtio-blk host device, it makes more easy > for users to implement their own I/O processing logic, such as all > user space I/O stack against hardware block device. It uses the new > vhost messages(VHOST_USER_GET_CONFIG) to get block virtio config > information from backend process. > > Signed-off-by: Changpeng Liu > --- > configure | 11 ++ > hw/block/Makefile.objs | 3 + > hw/block/vhost-user-blk.c | 360 > + > hw/virtio/virtio-pci.c | 55 ++ > hw/virtio/virtio-pci.h | 18 ++ > include/hw/virtio/vhost-user-blk.h | 40 + > 6 files changed, 487 insertions(+) > create mode 100644 hw/block/vhost-user-blk.c > create mode 100644 include/hw/virtio/vhost-user-blk.h > > diff --git a/configure b/configure > index dd73cce..1452c66 100755 > --- a/configure > +++ b/configure > @@ -305,6 +305,7 @@ tcg="yes" > > vhost_net="no" > vhost_scsi="no" > +vhost_user_blk="no" > vhost_vsock="no" > vhost_user="" > kvm="no" > @@ -779,6 +780,7 @@ Linux) >kvm="yes" >vhost_net="yes" >vhost_scsi="yes" > + vhost_user_blk="yes" >vhost_vsock="yes" >QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers >$QEMU_INCLUDES" >supported_os="yes" > @@ -1136,6 +1138,10 @@ for opt do >;; >--enable-vhost-scsi) vhost_scsi="yes" >;; > + --disable-vhost-user-blk) vhost_user_blk="no" > + ;; > + --enable-vhost-user-blk) vhost_user_blk="yes" > + ;; I suggest we don't add yet another configure option, but reuse the recently introduced --enable-vhost-user (that should cover all vhost-user devices for now, but may learn to enable specific devices if needed in the future). >--disable-vhost-vsock) vhost_vsock="no" >;; >--enable-vhost-vsock) vhost_vsock="yes" > @@ -1506,6 +1512,7 @@ disabled with --disable-FEATURE, default is enabled if > available: >cap-ng libcap-ng support >attrattr and xattr support >vhost-net vhost-net acceleration support > + vhost-user-blk VM virtio-blk acceleration in user space >spice spice >rbd rados block device (rbd) >libiscsiiscsi support > @@ -5365,6 +5372,7 @@ echo "posix_madvise $posix_madvise" > echo "libcap-ng support $cap_ng" > echo "vhost-net support $vhost_net" > echo "vhost-scsi support $vhost_scsi" > +echo "vhost-user-blk support $vhost_user_blk" > echo "vhost-vsock support $vhost_vsock" > echo "vhost-user support $vhost_user" > echo "Trace backends$trace_backends" > @@ -5776,6 +5784,9 @@ fi > if test "$vhost_scsi" = "yes" ; then >echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak > fi > +if test "$vhost_user_blk" = "yes" ; then > + echo "CONFIG_VHOST_USER_BLK=y" >> $config_host_mak > +fi > if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then >echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak > fi > diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs > index e0ed980..4c19a58 100644 > --- a/hw/block/Makefile.objs > +++ b/hw/block/Makefile.objs > @@ -13,3 +13,6 @@ obj-$(CONFIG_SH4) += tc58128.o > > obj-$(CONFIG_VIRTIO) += virtio-blk.o > obj-$(CONFIG_VIRTIO) += dataplane/ > +ifeq ($(CONFIG_VIRTIO),y) > +obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o > +endif > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > new file mode 100644 > index 000..8aa9fa9 > --- /dev/null > +++ b/hw/block/vhost-user-blk.c > @@ -0,0 +1,360 @@ > +/* > + * vhost-user-blk host device > + * > + * Copyright IBM, Corp. 2011 > + * Copyright(C) 2017 Intel Corporation. > + * > + * Authors: > + * Stefan Hajnoczi > + * 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/typedefs.h" > +#include "qemu/cutils.h" > +#include "qom/object.h" > +#include "hw/qdev-core.h" > +#include "hw/virtio/vhost.h" > +#include "hw/virtio/vhost-user-blk.h" > +#include "hw/virtio/virtio.h" > +#include "hw/virtio/virtio-bus.h" > +#include "hw/virtio/virtio-access.h" > + > +static const int user_feature_bits[] = { > +VIRTIO_BLK_F_SIZE_MAX, > +VIRTIO_BLK_F_SEG_MAX, > +VIRTIO_BLK_F_GEOMETRY, > +VIRTIO_BLK_F_BLK_SIZE, > +VIRTIO_BLK_F_TOPOLOGY, > +VIRTIO_BLK_F_SCSI, > +VIRTIO_BLK_F_MQ, > +VIRTIO_BLK_F_RO, > +VIRT
[Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device
This commit introduces a new vhost-user device for block, it uses a chardev to connect with the backend, same with Qemu virito-blk device, Guest OS still uses the virtio-blk frontend driver. To use it, start Qemu with command line like this: qemu-system-x86_64 \ -chardev socket,id=char0,path=/path/vhost.socket \ -device vhost-user-blk-pci,chardev=char0,num_queues=... Different with exist Qemu virtio-blk host device, it makes more easy for users to implement their own I/O processing logic, such as all user space I/O stack against hardware block device. It uses the new vhost messages(VHOST_USER_GET_CONFIG) to get block virtio config information from backend process. Signed-off-by: Changpeng Liu --- configure | 11 ++ hw/block/Makefile.objs | 3 + hw/block/vhost-user-blk.c | 360 + hw/virtio/virtio-pci.c | 55 ++ hw/virtio/virtio-pci.h | 18 ++ include/hw/virtio/vhost-user-blk.h | 40 + 6 files changed, 487 insertions(+) create mode 100644 hw/block/vhost-user-blk.c create mode 100644 include/hw/virtio/vhost-user-blk.h diff --git a/configure b/configure index dd73cce..1452c66 100755 --- a/configure +++ b/configure @@ -305,6 +305,7 @@ tcg="yes" vhost_net="no" vhost_scsi="no" +vhost_user_blk="no" vhost_vsock="no" vhost_user="" kvm="no" @@ -779,6 +780,7 @@ Linux) kvm="yes" vhost_net="yes" vhost_scsi="yes" + vhost_user_blk="yes" vhost_vsock="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" supported_os="yes" @@ -1136,6 +1138,10 @@ for opt do ;; --enable-vhost-scsi) vhost_scsi="yes" ;; + --disable-vhost-user-blk) vhost_user_blk="no" + ;; + --enable-vhost-user-blk) vhost_user_blk="yes" + ;; --disable-vhost-vsock) vhost_vsock="no" ;; --enable-vhost-vsock) vhost_vsock="yes" @@ -1506,6 +1512,7 @@ disabled with --disable-FEATURE, default is enabled if available: cap-ng libcap-ng support attrattr and xattr support vhost-net vhost-net acceleration support + vhost-user-blk VM virtio-blk acceleration in user space spice spice rbd rados block device (rbd) libiscsiiscsi support @@ -5365,6 +5372,7 @@ echo "posix_madvise $posix_madvise" echo "libcap-ng support $cap_ng" echo "vhost-net support $vhost_net" echo "vhost-scsi support $vhost_scsi" +echo "vhost-user-blk support $vhost_user_blk" echo "vhost-vsock support $vhost_vsock" echo "vhost-user support $vhost_user" echo "Trace backends$trace_backends" @@ -5776,6 +5784,9 @@ fi if test "$vhost_scsi" = "yes" ; then echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak fi +if test "$vhost_user_blk" = "yes" ; then + echo "CONFIG_VHOST_USER_BLK=y" >> $config_host_mak +fi if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak fi diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index e0ed980..4c19a58 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -13,3 +13,6 @@ obj-$(CONFIG_SH4) += tc58128.o obj-$(CONFIG_VIRTIO) += virtio-blk.o obj-$(CONFIG_VIRTIO) += dataplane/ +ifeq ($(CONFIG_VIRTIO),y) +obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk.o +endif diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c new file mode 100644 index 000..8aa9fa9 --- /dev/null +++ b/hw/block/vhost-user-blk.c @@ -0,0 +1,360 @@ +/* + * vhost-user-blk host device + * + * Copyright IBM, Corp. 2011 + * Copyright(C) 2017 Intel Corporation. + * + * Authors: + * Stefan Hajnoczi + * 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/typedefs.h" +#include "qemu/cutils.h" +#include "qom/object.h" +#include "hw/qdev-core.h" +#include "hw/virtio/vhost.h" +#include "hw/virtio/vhost-user-blk.h" +#include "hw/virtio/virtio.h" +#include "hw/virtio/virtio-bus.h" +#include "hw/virtio/virtio-access.h" + +static const int user_feature_bits[] = { +VIRTIO_BLK_F_SIZE_MAX, +VIRTIO_BLK_F_SEG_MAX, +VIRTIO_BLK_F_GEOMETRY, +VIRTIO_BLK_F_BLK_SIZE, +VIRTIO_BLK_F_TOPOLOGY, +VIRTIO_BLK_F_SCSI, +VIRTIO_BLK_F_MQ, +VIRTIO_BLK_F_RO, +VIRTIO_BLK_F_FLUSH, +VIRTIO_BLK_F_BARRIER, +VIRTIO_BLK_F_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_user_blk_update_config(VirtIODevice *vdev, uint8_t *config) +{ +VHostUserBlk *s = VHOST_USER_BLK(vdev); + +memcpy(config, &s->blkcfg, sizeof(struct virtio_blk_config)); +} + +static void vhost_user_blk_set_config(VirtIODevice *vdev, const uint8_t *config) +{ +VHostUserBlk *s = VHOST_USER_BLK(vdev