From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KNTfw-0004Sf-P3 for qemu-devel@nongnu.org; Mon, 28 Jul 2008 10:26:12 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KNTfs-0004Qj-0M for qemu-devel@nongnu.org; Mon, 28 Jul 2008 10:26:12 -0400 Received: from [199.232.76.173] (port=59789 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KNTfr-0004Qd-Lu for qemu-devel@nongnu.org; Mon, 28 Jul 2008 10:26:07 -0400 Received: from wr-out-0506.google.com ([64.233.184.237]:45539) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KNTfq-00082o-LF for qemu-devel@nongnu.org; Mon, 28 Jul 2008 10:26:07 -0400 Received: by wr-out-0506.google.com with SMTP id c46so4021284wra.18 for ; Mon, 28 Jul 2008 07:25:54 -0700 (PDT) Message-ID: <488DD6D2.8020702@codemonkey.ws> Date: Mon, 28 Jul 2008 09:25:22 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver. References: <1217251078-6591-1-git-send-email-kraxel@redhat.com> <1217251078-6591-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1217251078-6591-6-git-send-email-kraxel@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: xen-devel@lists.xensource.com, Gerd Hoffmann Gerd Hoffmann wrote: > This patch adds a block device backend driver to qemu. It is a pure > userspace implemention using the gntdev interface. It uses "qdisk" as > backend name in xenstore so it doesn't interfere with the other existing > backends (blkback aka "vbd" and tapdisk aka "tap"). > > Signed-off-by: Gerd Hoffmann > --- > Makefile.target | 2 +- > hw/xen-backend.h | 2 + > hw/xen-blkif.h | 103 ++++++++ > hw/xen-disk.c | 681 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > hw/xen-machine.c | 1 + > sysemu.h | 2 +- > vl.c | 4 + > 7 files changed, 793 insertions(+), 2 deletions(-) > create mode 100644 hw/xen-blkif.h > create mode 100644 hw/xen-disk.c > > diff --git a/Makefile.target b/Makefile.target > index 66d41ee..2d599d2 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -517,7 +517,7 @@ endif > > # xen backend driver support > XEN_OBJS := xen-machine.o xen-backend.o > -XEN_OBJS += xen-console.o xen-framebuffer.o > +XEN_OBJS += xen-console.o xen-framebuffer.o xen-disk.o > ifeq ($(CONFIG_XEN), yes) > OBJS += $(XEN_OBJS) > LIBS += $(XEN_LIBS) > diff --git a/hw/xen-backend.h b/hw/xen-backend.h > index 3facf90..941b0a6 100644 > --- a/hw/xen-backend.h > +++ b/hw/xen-backend.h > @@ -10,6 +10,7 @@ > > #include "hw.h" > #include "xen.h" > +#include "sysemu.h" > > /* > * tweaks needed to build with different xen versions > @@ -118,6 +119,7 @@ void xen_be_printf(struct xendev *xendev, int msg_level, const char *fmt, ...) > struct devops xen_console_ops; /* xen_console.c */ > struct devops xen_kbdmouse_ops; /* xen_framebuffer.c */ > struct devops xen_framebuffer_ops; /* xen_framebuffer.c */ > +struct devops xen_blkdev_ops; /* xen_disk.c */ > > void xen_set_display(int domid, DisplayState *ds); > > diff --git a/hw/xen-blkif.h b/hw/xen-blkif.h > new file mode 100644 > index 0000000..254a5fd > --- /dev/null > +++ b/hw/xen-blkif.h > @@ -0,0 +1,103 @@ > +#ifndef __XEN_BLKIF_H__ > +#define __XEN_BLKIF_H__ > + > +#include > +#include > +#include > + > +/* Not a real protocol. Used to generate ring structs which contain > + * the elements common to all protocols only. This way we get a > + * compiler-checkable way to use common struct elements, so we can > + * avoid using switch(protocol) in a number of places. */ > +struct blkif_common_request { > + char dummy; > +}; > +struct blkif_common_response { > + char dummy; > +}; > + > +/* i386 protocol version */ > +#pragma pack(push, 4) > +struct blkif_x86_32_request { > + uint8_t operation; /* BLKIF_OP_??? */ > + uint8_t nr_segments; /* number of segments */ > + blkif_vdev_t handle; /* only for read/write requests */ > + uint64_t id; /* private guest value, echoed in resp */ > + blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ > + struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; > +}; > +struct blkif_x86_32_response { > + uint64_t id; /* copied from request */ > + uint8_t operation; /* copied from request */ > + int16_t status; /* BLKIF_RSP_??? */ > +}; > +typedef struct blkif_x86_32_request blkif_x86_32_request_t; > +typedef struct blkif_x86_32_response blkif_x86_32_response_t; > +#pragma pack(pop) > + > +/* x86_64 protocol version */ > +struct blkif_x86_64_request { > + uint8_t operation; /* BLKIF_OP_??? */ > + uint8_t nr_segments; /* number of segments */ > + blkif_vdev_t handle; /* only for read/write requests */ > + uint64_t __attribute__((__aligned__(8))) id; > + blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ > + struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; > +}; > +struct blkif_x86_64_response { > + uint64_t __attribute__((__aligned__(8))) id; > + uint8_t operation; /* copied from request */ > + int16_t status; /* BLKIF_RSP_??? */ > +}; > +typedef struct blkif_x86_64_request blkif_x86_64_request_t; > +typedef struct blkif_x86_64_response blkif_x86_64_response_t; > + > +DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response); > +DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response); > +DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response); > + > +union blkif_back_rings { > + blkif_back_ring_t native; > + blkif_common_back_ring_t common; > + blkif_x86_32_back_ring_t x86_32; > + blkif_x86_64_back_ring_t x86_64; > +}; > +typedef union blkif_back_rings blkif_back_rings_t; > + > +enum blkif_protocol { > + BLKIF_PROTOCOL_NATIVE = 1, > + BLKIF_PROTOCOL_X86_32 = 2, > + BLKIF_PROTOCOL_X86_64 = 3, > +}; > + > +static void inline blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src) > +{ > + int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST; > + > + dst->operation = src->operation; > + dst->nr_segments = src->nr_segments; > + dst->handle = src->handle; > + dst->id = src->id; > + dst->sector_number = src->sector_number; > + if (n > src->nr_segments) > + n = src->nr_segments; > + for (i = 0; i < n; i++) > + dst->seg[i] = src->seg[i]; > +} > + > +static void inline blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src) > +{ > + int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST; > + > + dst->operation = src->operation; > + dst->nr_segments = src->nr_segments; > + dst->handle = src->handle; > + dst->id = src->id; > + dst->sector_number = src->sector_number; > + if (n > src->nr_segments) > + n = src->nr_segments; > + for (i = 0; i < n; i++) > + dst->seg[i] = src->seg[i]; > +} > + > +#endif /* __XEN_BLKIF_H__ */ > diff --git a/hw/xen-disk.c b/hw/xen-disk.c > new file mode 100644 > index 0000000..6947363 > --- /dev/null > +++ b/hw/xen-disk.c > @@ -0,0 +1,681 @@ > +/* > + * xen paravirt block device backend > + * > + * FIXME: the code is designed to handle multiple outstanding > + * requests (using aio or using threads), which isn't used right > + * now due to limitations of the qemu block driver interface. > + * > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; under version 2 of the License. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > This doesn't seem to be needed? Regards, Anthony Liguori