Re: [Qemu-devel] [PATCH v9 4/4] contrib/vhost-user-blk: introduce a vhost-user-blk sample application
Hi On Thu, Jan 4, 2018 at 2:24 AM, Changpeng Liuwrote: > This commit introduces a vhost-user-blk backend device, it uses UNIX > domain socket to communicate with QEMU. The vhost-user-blk sample > application should be used with QEMU vhost-user-blk-pci device. > > To use it, complie with: > make vhost-user-blk > > and start like this: > vhost-user-blk -b /dev/sdb -s /path/vhost.socket > > Signed-off-by: Changpeng Liu > --- > .gitignore | 1 + > Makefile| 3 + > Makefile.objs | 1 + > contrib/vhost-user-blk/Makefile.objs| 1 + > contrib/vhost-user-blk/vhost-user-blk.c | 545 > > 5 files changed, 551 insertions(+) > create mode 100644 contrib/vhost-user-blk/Makefile.objs > create mode 100644 contrib/vhost-user-blk/vhost-user-blk.c > > diff --git a/.gitignore b/.gitignore > index 433f64f..704b222 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -54,6 +54,7 @@ > /module_block.h > /scsi/qemu-pr-helper > /vhost-user-scsi > +/vhost-user-blk > /fsdev/virtfs-proxy-helper > *.tmp > *.[1-9] > diff --git a/Makefile b/Makefile > index d86ecd2..f021fc8 100644 > --- a/Makefile > +++ b/Makefile > @@ -331,6 +331,7 @@ dummy := $(call unnest-vars,, \ > ivshmem-server-obj-y \ > libvhost-user-obj-y \ > vhost-user-scsi-obj-y \ > +vhost-user-blk-obj-y \ > qga-vss-dll-obj-y \ > block-obj-y \ > block-obj-m \ > @@ -562,6 +563,8 @@ ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) > $(COMMON_LDADDS) > endif > vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) libvhost-user.a > $(call LINK, $^) > +vhost-user-blk$(EXESUF): $(vhost-user-blk-obj-y) libvhost-user.a > + $(call LINK, $^) > > module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak > $(call quiet-command,$(PYTHON) $< $@ \ > diff --git a/Makefile.objs b/Makefile.objs > index 285c6f3..ae9aef7 100644 > --- a/Makefile.objs > +++ b/Makefile.objs > @@ -115,6 +115,7 @@ libvhost-user-obj-y = contrib/libvhost-user/ > vhost-user-scsi.o-cflags := $(LIBISCSI_CFLAGS) > vhost-user-scsi.o-libs := $(LIBISCSI_LIBS) > vhost-user-scsi-obj-y = contrib/vhost-user-scsi/ > +vhost-user-blk-obj-y = contrib/vhost-user-blk/ > > ## > trace-events-subdirs = > diff --git a/contrib/vhost-user-blk/Makefile.objs > b/contrib/vhost-user-blk/Makefile.objs > new file mode 100644 > index 000..72e2cdc > --- /dev/null > +++ b/contrib/vhost-user-blk/Makefile.objs > @@ -0,0 +1 @@ > +vhost-user-blk-obj-y = vhost-user-blk.o > diff --git a/contrib/vhost-user-blk/vhost-user-blk.c > b/contrib/vhost-user-blk/vhost-user-blk.c > new file mode 100644 > index 000..0b889fb > --- /dev/null > +++ b/contrib/vhost-user-blk/vhost-user-blk.c > @@ -0,0 +1,545 @@ > +/* > + * vhost-user-blk sample application > + * > + * Copyright (c) 2017 Intel Corporation. All rights reserved. > + * > + * Author: > + * Changpeng Liu > + * > + * This work is based on the "vhost-user-scsi" sample and "virtio-blk" driver > + * implementation by: > + * Felipe Franciosi > + * Anthony Liguori > + * > + * This work is licensed under the terms of the GNU GPL, version 2 only. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "standard-headers/linux/virtio_blk.h" > +#include "contrib/libvhost-user/libvhost-user-glib.h" > +#include "contrib/libvhost-user/libvhost-user.h" > + > +#include > + > +struct virtio_blk_inhdr { > +unsigned char status; > +}; > + > +/* vhost user block device */ > +typedef struct VubDev { > +VugDev parent; > +int blk_fd; > +struct virtio_blk_config blkcfg; > +char *blk_name; > +GMainLoop *loop; > +} VubDev; > + > +typedef struct VubReq { > +VuVirtqElement *elem; > +int64_t sector_num; > +size_t size; > +struct virtio_blk_inhdr *in; > +struct virtio_blk_outhdr *out; > +VubDev *vdev_blk; > +struct VuVirtq *vq; > +} VubReq; > + > +/* refer util/iov.c */ > +static size_t vub_iov_size(const struct iovec *iov, > + const unsigned int iov_cnt) > +{ > +size_t len; > +unsigned int i; > + > +len = 0; > +for (i = 0; i < iov_cnt; i++) { > +len += iov[i].iov_len; > +} > +return len; > +} > + > +static void vub_panic_cb(VuDev *vu_dev, const char *buf) > +{ > +VugDev *gdev; > +VubDev *vdev_blk; > + > +assert(vu_dev); > + > +gdev = container_of(vu_dev, VugDev, parent); > +vdev_blk = container_of(gdev, VubDev, parent); > +if (buf) { > +g_warning("vu_panic: %s", buf); > +} > + > +g_main_loop_quit(vdev_blk->loop); > +} > + > +static void
[Qemu-devel] [PATCH v9 4/4] contrib/vhost-user-blk: introduce a vhost-user-blk sample application
This commit introduces a vhost-user-blk backend device, it uses UNIX domain socket to communicate with QEMU. The vhost-user-blk sample application should be used with QEMU vhost-user-blk-pci device. To use it, complie with: make vhost-user-blk and start like this: vhost-user-blk -b /dev/sdb -s /path/vhost.socket Signed-off-by: Changpeng Liu--- .gitignore | 1 + Makefile| 3 + Makefile.objs | 1 + contrib/vhost-user-blk/Makefile.objs| 1 + contrib/vhost-user-blk/vhost-user-blk.c | 545 5 files changed, 551 insertions(+) create mode 100644 contrib/vhost-user-blk/Makefile.objs create mode 100644 contrib/vhost-user-blk/vhost-user-blk.c diff --git a/.gitignore b/.gitignore index 433f64f..704b222 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,7 @@ /module_block.h /scsi/qemu-pr-helper /vhost-user-scsi +/vhost-user-blk /fsdev/virtfs-proxy-helper *.tmp *.[1-9] diff --git a/Makefile b/Makefile index d86ecd2..f021fc8 100644 --- a/Makefile +++ b/Makefile @@ -331,6 +331,7 @@ dummy := $(call unnest-vars,, \ ivshmem-server-obj-y \ libvhost-user-obj-y \ vhost-user-scsi-obj-y \ +vhost-user-blk-obj-y \ qga-vss-dll-obj-y \ block-obj-y \ block-obj-m \ @@ -562,6 +563,8 @@ ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS) endif vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) libvhost-user.a $(call LINK, $^) +vhost-user-blk$(EXESUF): $(vhost-user-blk-obj-y) libvhost-user.a + $(call LINK, $^) module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak $(call quiet-command,$(PYTHON) $< $@ \ diff --git a/Makefile.objs b/Makefile.objs index 285c6f3..ae9aef7 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -115,6 +115,7 @@ libvhost-user-obj-y = contrib/libvhost-user/ vhost-user-scsi.o-cflags := $(LIBISCSI_CFLAGS) vhost-user-scsi.o-libs := $(LIBISCSI_LIBS) vhost-user-scsi-obj-y = contrib/vhost-user-scsi/ +vhost-user-blk-obj-y = contrib/vhost-user-blk/ ## trace-events-subdirs = diff --git a/contrib/vhost-user-blk/Makefile.objs b/contrib/vhost-user-blk/Makefile.objs new file mode 100644 index 000..72e2cdc --- /dev/null +++ b/contrib/vhost-user-blk/Makefile.objs @@ -0,0 +1 @@ +vhost-user-blk-obj-y = vhost-user-blk.o diff --git a/contrib/vhost-user-blk/vhost-user-blk.c b/contrib/vhost-user-blk/vhost-user-blk.c new file mode 100644 index 000..0b889fb --- /dev/null +++ b/contrib/vhost-user-blk/vhost-user-blk.c @@ -0,0 +1,545 @@ +/* + * vhost-user-blk sample application + * + * Copyright (c) 2017 Intel Corporation. All rights reserved. + * + * Author: + * Changpeng Liu + * + * This work is based on the "vhost-user-scsi" sample and "virtio-blk" driver + * implementation by: + * Felipe Franciosi + * Anthony Liguori + * + * This work is licensed under the terms of the GNU GPL, version 2 only. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "standard-headers/linux/virtio_blk.h" +#include "contrib/libvhost-user/libvhost-user-glib.h" +#include "contrib/libvhost-user/libvhost-user.h" + +#include + +struct virtio_blk_inhdr { +unsigned char status; +}; + +/* vhost user block device */ +typedef struct VubDev { +VugDev parent; +int blk_fd; +struct virtio_blk_config blkcfg; +char *blk_name; +GMainLoop *loop; +} VubDev; + +typedef struct VubReq { +VuVirtqElement *elem; +int64_t sector_num; +size_t size; +struct virtio_blk_inhdr *in; +struct virtio_blk_outhdr *out; +VubDev *vdev_blk; +struct VuVirtq *vq; +} VubReq; + +/* refer util/iov.c */ +static size_t vub_iov_size(const struct iovec *iov, + const unsigned int iov_cnt) +{ +size_t len; +unsigned int i; + +len = 0; +for (i = 0; i < iov_cnt; i++) { +len += iov[i].iov_len; +} +return len; +} + +static void vub_panic_cb(VuDev *vu_dev, const char *buf) +{ +VugDev *gdev; +VubDev *vdev_blk; + +assert(vu_dev); + +gdev = container_of(vu_dev, VugDev, parent); +vdev_blk = container_of(gdev, VubDev, parent); +if (buf) { +g_warning("vu_panic: %s", buf); +} + +g_main_loop_quit(vdev_blk->loop); +} + +static void vub_req_complete(VubReq *req) +{ +VugDev *gdev = >vdev_blk->parent; +VuDev *vu_dev = >parent; + +/* IO size with 1 extra status byte */ +vu_queue_push(vu_dev, req->vq, req->elem, + req->size + 1); +vu_queue_notify(vu_dev, req->vq); + +if (req->elem) { +free(req->elem); +} + +g_free(req); +} + +static int vub_open(const char *file_name, bool wce) +{