All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Fam Zheng <famz@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	benoit.canet@irqsave.net, qemu-devel@nongnu.org,
	armbru@redhat.com, Stefan Hajnoczi <stefanha@redhat.com>,
	pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v6 1/3] block: Introduce "null" drivers
Date: Wed, 10 Sep 2014 15:27:23 +0200	[thread overview]
Message-ID: <20140910132722.GB12470@irqsave.net> (raw)
In-Reply-To: <1410318528-24433-2-git-send-email-famz@redhat.com>

The Wednesday 10 Sep 2014 à 11:08:46 (+0800), Fam Zheng wrote :
> This is an analogue to Linux null_blk. It can be used for testing or
> benchmarking block device emulation and general block layer
> functionalities such as coroutines and throttling, where disk IO is not
> necessary or wanted.
> 
> Use null-aio:// for AIO version, and null-co:// for coroutine version.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block/Makefile.objs  |   1 +
>  block/null.c         | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  qapi/block-core.json |  19 +++++-
>  3 files changed, 196 insertions(+), 2 deletions(-)
>  create mode 100644 block/null.c
> 
> diff --git a/block/Makefile.objs b/block/Makefile.objs
> index f45f939..36a844f 100644
> --- a/block/Makefile.objs
> +++ b/block/Makefile.objs
> @@ -9,6 +9,7 @@ block-obj-y += snapshot.o qapi.o
>  block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o
>  block-obj-$(CONFIG_POSIX) += raw-posix.o
>  block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
> +block-obj-y += null.o
>  
>  block-obj-y += nbd.o nbd-client.o sheepdog.o
>  block-obj-$(CONFIG_LIBISCSI) += iscsi.o
> diff --git a/block/null.c b/block/null.c
> new file mode 100644
> index 0000000..0037c1f
> --- /dev/null
> +++ b/block/null.c
> @@ -0,0 +1,178 @@
> +/*
> + * Null block driver
> + *
> + * Authors:
> + *  Fam Zheng <famz@redhat.com>
> + *
> + * Copyright (C) 2014 Red Hat, Inc.
> + *
> + * 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 "block/block_int.h"
> +
> +typedef struct {
> +    int64_t length;
> +} BDRVNullState;
> +
> +static QemuOptsList runtime_opts = {
> +    .name = "null",
> +    .head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
> +    .desc = {
> +        {
> +            .name = "filename",
> +            .type = QEMU_OPT_STRING,
> +            .help = "",
> +        },
> +        {
> +            .name = BLOCK_OPT_SIZE,
> +            .type = QEMU_OPT_SIZE,

> +            .help = "size of the null block",
Are we taking about a single block of the device or about the device as a whole ?

Below assigning BLOCK_OPT_SIZE to s->length let think the .help should be
+            .help = "size of the null block device",

> +        },
> +        { /* end of list */ }
> +    },
> +};
> +
> +static int null_file_open(BlockDriverState *bs, QDict *options, int flags,
> +                          Error **errp)
> +{
> +    QemuOpts *opts;
> +    BDRVNullState *s = bs->opaque;
> +
> +    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
> +    qemu_opts_absorb_qdict(opts, options, &error_abort);
> +    s->length =
> +        qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 1 << 30);
> +    qemu_opts_del(opts);
> +    return 0;
> +}
> +
> +static void null_close(BlockDriverState *bs)
> +{
> +}
> +
> +static int64_t null_getlength(BlockDriverState *bs)
> +{
> +    BDRVNullState *s = bs->opaque;
> +    return s->length;
> +}
> +
> +static coroutine_fn int null_co_readv(BlockDriverState *bs,
> +                                      int64_t sector_num, int nb_sectors,
> +                                      QEMUIOVector *qiov)
> +{
> +    return 0;
> +}
> +
> +static coroutine_fn int null_co_writev(BlockDriverState *bs,
> +                                       int64_t sector_num, int nb_sectors,
> +                                       QEMUIOVector *qiov)
> +{
> +    return 0;
> +}
> +
> +static coroutine_fn int null_co_flush(BlockDriverState *bs)
> +{
> +    return 0;
> +}
> +
> +typedef struct {
> +    BlockDriverAIOCB common;
> +    QEMUBH *bh;
> +} NullAIOCB;
> +
> +static void null_aio_cancel(BlockDriverAIOCB *blockacb);
> +
> +static const AIOCBInfo null_aiocb_info = {
> +    .aiocb_size = sizeof(NullAIOCB),
> +    .cancel     = null_aio_cancel,
> +};
> +
> +static void null_bh_cb(void *opaque)
> +{
> +    NullAIOCB *acb = opaque;
> +    acb->common.cb(acb->common.opaque, 0);
> +    qemu_bh_delete(acb->bh);
> +    qemu_aio_release(acb);
> +}
> +
> +static inline BlockDriverAIOCB *null_aio_common(BlockDriverState *bs,
> +                                                BlockDriverCompletionFunc *cb,
> +                                                void *opaque)
> +{
> +    NullAIOCB *acb;
> +
> +    acb = qemu_aio_get(&null_aiocb_info, bs, cb, opaque);
> +    acb->bh = aio_bh_new(bdrv_get_aio_context(bs), null_bh_cb, acb);
> +    qemu_bh_schedule(acb->bh);
> +    return &acb->common;
> +}
> +
> +static BlockDriverAIOCB *null_aio_readv(BlockDriverState *bs,
> +                                        int64_t sector_num, QEMUIOVector *qiov,
> +                                        int nb_sectors,
> +                                        BlockDriverCompletionFunc *cb,
> +                                        void *opaque)
> +{
> +    return null_aio_common(bs, cb, opaque);
> +}
> +
> +static BlockDriverAIOCB *null_aio_writev(BlockDriverState *bs,
> +                                         int64_t sector_num, QEMUIOVector *qiov,
> +                                         int nb_sectors,
> +                                         BlockDriverCompletionFunc *cb,
> +                                         void *opaque)
> +{
> +    return null_aio_common(bs, cb, opaque);
> +}
> +
> +static BlockDriverAIOCB *null_aio_flush(BlockDriverState *bs,
> +                                        BlockDriverCompletionFunc *cb,
> +                                        void *opaque)
> +{
> +    return null_aio_common(bs, cb, opaque);
> +}
> +
> +static void null_aio_cancel(BlockDriverAIOCB *blockacb)
> +{
> +    NullAIOCB *acb = container_of(blockacb, NullAIOCB, common);
> +    qemu_bh_delete(acb->bh);
> +    qemu_aio_release(acb);
> +}
> +
> +static BlockDriver bdrv_null_co = {
> +    .format_name            = "null-co",
> +    .protocol_name          = "null-co",
> +    .instance_size          = sizeof(BDRVNullState),
> +
> +    .bdrv_file_open         = null_file_open,
> +    .bdrv_close             = null_close,
> +    .bdrv_getlength         = null_getlength,
> +
> +    .bdrv_co_readv          = null_co_readv,
> +    .bdrv_co_writev         = null_co_writev,
> +    .bdrv_co_flush_to_disk  = null_co_flush,
> +};
> +
> +static BlockDriver bdrv_null_aio = {
> +    .format_name            = "null-aio",
> +    .protocol_name          = "null-aio",
> +    .instance_size          = sizeof(BDRVNullState),
> +
> +    .bdrv_file_open         = null_file_open,
> +    .bdrv_close             = null_close,
> +    .bdrv_getlength         = null_getlength,
> +
> +    .bdrv_aio_readv         = null_aio_readv,
> +    .bdrv_aio_writev        = null_aio_writev,
> +    .bdrv_aio_flush         = null_aio_flush,
> +};
> +
> +static void bdrv_null_init(void)
> +{
> +    bdrv_register(&bdrv_null_co);
> +    bdrv_register(&bdrv_null_aio);
> +}
> +
> +block_init(bdrv_null_init);
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index a685d02..bf0cb23 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -1150,7 +1150,8 @@
>    'data': [ 'archipelago', 'file', 'host_device', 'host_cdrom', 'host_floppy',
>              'http', 'https', 'ftp', 'ftps', 'tftp', 'vvfat', 'blkdebug',
>              'blkverify', 'bochs', 'cloop', 'cow', 'dmg', 'parallels', 'qcow',
> -            'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum' ] }
> +            'qcow2', 'qed', 'raw', 'vdi', 'vhdx', 'vmdk', 'vpc', 'quorum',
> +            'null-aio', 'null-co' ] }
>  
>  ##
>  # @BlockdevOptionsBase
> @@ -1203,6 +1204,18 @@
>    'data': { 'filename': 'str' } }
>  
>  ##
> +# @BlockdevOptionsNull
> +#
> +# Driver specific block device options for the null backend.
> +#
> +# @size:    #optional size of the device in bytes.
> +#
> +# Since: 2.2
> +##
> +{ 'type': 'BlockdevOptionsNull',
> +  'data': { '*size': 'int' } }
> +
> +##
>  # @BlockdevOptionsVVFAT
>  #
>  # Driver specific block device options for the vvfat protocol.
> @@ -1502,7 +1515,9 @@
>        'vhdx':       'BlockdevOptionsGenericFormat',
>        'vmdk':       'BlockdevOptionsGenericCOWFormat',
>        'vpc':        'BlockdevOptionsGenericFormat',
> -      'quorum':     'BlockdevOptionsQuorum'
> +      'quorum':     'BlockdevOptionsQuorum',
> +      'null-aio':   'BlockdevOptionsNull',
> +      'null-co':    'BlockdevOptionsNull'
>    } }
>  
>  ##
> -- 
> 1.9.3
> 

  reply	other threads:[~2014-09-10 13:28 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-10  3:08 [Qemu-devel] [PATCH v6 0/3] block: Introduce "null" drivers Fam Zheng
2014-09-10  3:08 ` [Qemu-devel] [PATCH v6 1/3] " Fam Zheng
2014-09-10 13:27   ` Benoît Canet [this message]
2014-09-11  5:48     ` Fam Zheng
2014-09-10  3:08 ` [Qemu-devel] [PATCH v6 2/3] qapi: Sort BlockdevDriver enum data list Fam Zheng
2014-09-10 13:29   ` Benoît Canet
2014-09-10  3:08 ` [Qemu-devel] [PATCH v6 3/3] qapi: Sort items in BlockdevOptions definition Fam Zheng
2014-09-10 13:32   ` Benoît Canet
2014-09-11  5:47     ` Fam Zheng

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=20140910132722.GB12470@irqsave.net \
    --to=benoit.canet@irqsave.net \
    --cc=armbru@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.