From: Kevin Wolf <kwolf@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org, Blue Swirl <blauwirbel@gmail.com>,
khoa@us.ibm.com, Paolo Bonzini <pbonzini@redhat.com>,
asias@redhat.com
Subject: Re: [Qemu-devel] [PATCH v5 06/11] dataplane: add Linux AIO request queue
Date: Fri, 07 Dec 2012 15:21:22 +0100 [thread overview]
Message-ID: <50C1FB62.3040401@redhat.com> (raw)
In-Reply-To: <1354740430-22452-7-git-send-email-stefanha@redhat.com>
Am 05.12.2012 21:47, schrieb Stefan Hajnoczi:
> The IOQueue has a pool of iocb structs and a function to add new
> read/write requests. Multiple requests can be added before calling the
> submit function to actually tell the host kernel to begin I/O. This
> allows callers to batch requests and submit them in one go.
>
> The actual I/O is performed using Linux AIO.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> hw/dataplane/Makefile.objs | 2 +-
> hw/dataplane/ioq.c | 118 +++++++++++++++++++++++++++++++++++++++++++++
> hw/dataplane/ioq.h | 57 ++++++++++++++++++++++
> 3 files changed, 176 insertions(+), 1 deletion(-)
> create mode 100644 hw/dataplane/ioq.c
> create mode 100644 hw/dataplane/ioq.h
>
> diff --git a/hw/dataplane/Makefile.objs b/hw/dataplane/Makefile.objs
> index e26bd7d..abd408f 100644
> --- a/hw/dataplane/Makefile.objs
> +++ b/hw/dataplane/Makefile.objs
> @@ -1,3 +1,3 @@
> ifeq ($(CONFIG_VIRTIO), y)
> -common-obj-$(CONFIG_VIRTIO_BLK_DATA_PLANE) += hostmem.o vring.o event-poll.o
> +common-obj-$(CONFIG_VIRTIO_BLK_DATA_PLANE) += hostmem.o vring.o event-poll.o ioq.o
> endif
> diff --git a/hw/dataplane/ioq.c b/hw/dataplane/ioq.c
> new file mode 100644
> index 0000000..7adeb5d
> --- /dev/null
> +++ b/hw/dataplane/ioq.c
> @@ -0,0 +1,118 @@
> +/*
> + * Linux AIO request queue
> + *
> + * Copyright 2012 IBM, Corp.
> + * Copyright 2012 Red Hat, Inc. and/or its affiliates
> + *
> + * Authors:
> + * Stefan Hajnoczi <stefanha@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "hw/dataplane/ioq.h"
> +
> +void ioq_init(IOQueue *ioq, int fd, unsigned int max_reqs)
> +{
> + int rc;
> +
> + ioq->fd = fd;
> + ioq->max_reqs = max_reqs;
> +
> + memset(&ioq->io_ctx, 0, sizeof ioq->io_ctx);
> + rc = io_setup(max_reqs, &ioq->io_ctx);
> + if (rc != 0) {
> + fprintf(stderr, "ioq io_setup failed %d\n", rc);
> + exit(1);
> + }
> +
> + rc = event_notifier_init(&ioq->io_notifier, 0);
> + if (rc != 0) {
> + fprintf(stderr, "ioq io event notifier creation failed %d\n", rc);
> + exit(1);
> + }
> +
> + ioq->freelist = g_malloc0(sizeof ioq->freelist[0] * max_reqs);
> + ioq->freelist_idx = 0;
> +
> + ioq->queue = g_malloc0(sizeof ioq->queue[0] * max_reqs);
> + ioq->queue_idx = 0;
> +}
> +
> +void ioq_cleanup(IOQueue *ioq)
> +{
> + g_free(ioq->freelist);
> + g_free(ioq->queue);
> +
> + event_notifier_cleanup(&ioq->io_notifier);
> + io_destroy(ioq->io_ctx);
> +}
> +
> +EventNotifier *ioq_get_notifier(IOQueue *ioq)
> +{
> + return &ioq->io_notifier;
> +}
> +
> +struct iocb *ioq_get_iocb(IOQueue *ioq)
> +{
> + if (unlikely(ioq->freelist_idx == 0)) {
> + fprintf(stderr, "ioq underflow\n");
> + exit(1);
> + }
Can this happen? If no, it should be an assertion. If yes, the error
handling code is wrong, we can't just exit qemu. It's already not nice
to do it in setup functions, but during runtime I think it's not acceptable.
> + struct iocb *iocb = ioq->freelist[--ioq->freelist_idx];
> + ioq->queue[ioq->queue_idx++] = iocb;
> + return iocb;
> +}
> +
> +void ioq_put_iocb(IOQueue *ioq, struct iocb *iocb)
> +{
> + if (unlikely(ioq->freelist_idx == ioq->max_reqs)) {
> + fprintf(stderr, "ioq overflow\n");
> + exit(1);
> + }
Same here.
Kevin
next prev parent reply other threads:[~2012-12-07 14:21 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-05 20:46 [Qemu-devel] [PATCH v5 00/11] virtio: virtio-blk data plane Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 01/11] raw-posix: add raw_get_aio_fd() for virtio-blk-data-plane Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 02/11] configure: add CONFIG_VIRTIO_BLK_DATA_PLANE Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 03/11] dataplane: add host memory mapping code Stefan Hajnoczi
2012-12-09 4:02 ` liu ping fan
2012-12-09 10:36 ` Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 04/11] dataplane: add virtqueue vring code Stefan Hajnoczi
2012-12-06 11:22 ` Michael S. Tsirkin
2012-12-06 12:53 ` Stefan Hajnoczi
2012-12-07 14:07 ` Kevin Wolf
2012-12-07 14:46 ` Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 05/11] dataplane: add event loop Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 06/11] dataplane: add Linux AIO request queue Stefan Hajnoczi
2012-12-07 14:21 ` Kevin Wolf [this message]
2012-12-10 13:05 ` Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 07/11] iov: add iov_discard() to remove data Stefan Hajnoczi
2012-12-06 11:36 ` Michael S. Tsirkin
2012-12-06 14:07 ` Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 08/11] test-iov: add iov_discard() testcase Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 09/11] iov: add qemu_iovec_concat_iov() Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 10/11] dataplane: add virtio-blk data plane code Stefan Hajnoczi
2012-12-06 7:35 ` Paolo Bonzini
2012-12-06 14:03 ` Stefan Hajnoczi
2012-12-07 6:06 ` Stefan Hajnoczi
2012-12-07 10:51 ` Paolo Bonzini
2012-12-06 11:33 ` Michael S. Tsirkin
2012-12-07 5:43 ` Stefan Hajnoczi
2012-12-07 18:04 ` Kevin Wolf
2012-12-10 13:06 ` Stefan Hajnoczi
2012-12-05 20:47 ` [Qemu-devel] [PATCH v5 11/11] virtio-blk: add x-data-plane=on|off performance feature Stefan Hajnoczi
2012-12-06 11:38 ` [Qemu-devel] [PATCH v5 00/11] virtio: virtio-blk data plane Michael S. Tsirkin
2012-12-07 6:12 ` Stefan Hajnoczi
2012-12-07 2:43 ` Liu Yuan
2012-12-07 5:46 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50C1FB62.3040401@redhat.com \
--to=kwolf@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=asias@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=khoa@us.ibm.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).