From: Paolo Bonzini <pbonzini@redhat.com>
To: Jens Freimann <jfrei@linux.vnet.ibm.com>
Cc: Heinz Graalfs <graalfs@linux.vnet.ibm.com>,
Alexander Graf <agraf@suse.de>,
qemu-devel <qemu-devel@nongnu.org>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Cornelia Huck <cornelia.huck@de.ibm.com>,
Stefan Weinhuber <wein@linux.vnet.ibm.com>,
Einar Lueck <elelueck@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 1/2] virtio-block: support auto-sensing of block sizes
Date: Mon, 20 Aug 2012 10:51:56 +0200 [thread overview]
Message-ID: <5031FAAC.4020601@redhat.com> (raw)
In-Reply-To: <1345016649-4792-2-git-send-email-jfrei@linux.vnet.ibm.com>
Il 15/08/2012 09:44, Jens Freimann ha scritto:
> From: Einar Lueck <elelueck@linux.vnet.ibm.com>
>
> Virtio-blk does not impose fixed block sizes for access to
> backing devices. This patch introduces support for auto
> lookup of the block sizes of the backing block device. This
> automatic lookup needs to be enabled explicitly. Users may
> do this by specifying (physical|logical)_block_size=0.
> Machine types may do this for their defaults, too.
> To achieve this, a new function blkconf_blocksizes is
> implemented. If physical or logical block size are zero
> a corresponding ioctl tries to find an appropriate value.
> If this does not work, 512 is used. blkconf_blocksizes
> is therefore only called w/in the virtio-blk context.
> For s390-virtio, this patch configures auto lookup as
> default.
I'm a bit worried about changing the default for s390, the other parts
look good.
Paolo
> Signed-off-by: Einar Lueck <elelueck@linux.vnet.ibm.com>
> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
> ---
> hw/block-common.c | 28 ++++++++++++++++++++++++++++
> hw/block-common.h | 12 +++++++++---
> hw/qdev-properties.c | 4 +++-
> hw/s390-virtio-bus.c | 2 +-
> hw/virtio-blk.c | 1 +
> 5 files changed, 42 insertions(+), 5 deletions(-)
>
> diff --git a/hw/block-common.c b/hw/block-common.c
> index f0196d7..336a891 100644
> --- a/hw/block-common.c
> +++ b/hw/block-common.c
> @@ -10,6 +10,9 @@
> #include "blockdev.h"
> #include "hw/block-common.h"
> #include "qemu-error.h"
> +#ifdef __linux__
> +#include <linux/fs.h>
> +#endif
>
> void blkconf_serial(BlockConf *conf, char **serial)
> {
> @@ -24,6 +27,31 @@ void blkconf_serial(BlockConf *conf, char **serial)
> }
> }
>
> +void blkconf_blocksizes(BlockConf *conf)
> +{
> +#ifdef __linux__
> + int block_size;
> +
> + if (!conf->physical_block_size) {
> + if (bdrv_ioctl(conf->bs, BLKPBSZGET, &block_size) == 0) {
> + conf->physical_block_size = (uint16_t) block_size;
> + } else {
> + conf->physical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> + }
> + }
> + if (!conf->logical_block_size) {
> + if (bdrv_ioctl(conf->bs, BLKSSZGET, &block_size) == 0) {
> + conf->logical_block_size = (uint16_t) block_size;
> + } else {
> + conf->logical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> + }
> + }
> +#else
> + conf->physical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> + conf->logical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> +#endif
> +}
> +
> int blkconf_geometry(BlockConf *conf, int *ptrans,
> unsigned cyls_max, unsigned heads_max, unsigned secs_max)
> {
> diff --git a/hw/block-common.h b/hw/block-common.h
> index bb808f7..d593128 100644
> --- a/hw/block-common.h
> +++ b/hw/block-common.h
> @@ -40,18 +40,23 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
> return exp;
> }
>
> -#define DEFINE_BLOCK_PROPERTIES(_state, _conf) \
> +#define BLOCK_PROPERTY_STD_BLKSIZE 512
> +#define DEFINE_BLOCK_PROPERTIES_EXTENDED(_state, _conf, _blksize) \
> DEFINE_PROP_DRIVE("drive", _state, _conf.bs), \
> DEFINE_PROP_BLOCKSIZE("logical_block_size", _state, \
> - _conf.logical_block_size, 512), \
> + _conf.logical_block_size, _blksize), \
> DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
> - _conf.physical_block_size, 512), \
> + _conf.physical_block_size, _blksize), \
> DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \
> DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \
> DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \
> DEFINE_PROP_UINT32("discard_granularity", _state, \
> _conf.discard_granularity, 0)
>
> +#define DEFINE_BLOCK_PROPERTIES(_state, _conf) \
> + DEFINE_BLOCK_PROPERTIES_EXTENDED(_state, _conf, \
> + BLOCK_PROPERTY_STD_BLKSIZE)
> +
> #define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf) \
> DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0), \
> DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0), \
> @@ -60,6 +65,7 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
> /* Configuration helpers */
>
> void blkconf_serial(BlockConf *conf, char **serial);
> +void blkconf_blocksizes(BlockConf *conf);
> int blkconf_geometry(BlockConf *conf, int *trans,
> unsigned cyls_max, unsigned heads_max, unsigned secs_max);
>
> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
> index 8aca0d4..e99dee4 100644
> --- a/hw/qdev-properties.c
> +++ b/hw/qdev-properties.c
> @@ -904,7 +904,9 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
> error_propagate(errp, local_err);
> return;
> }
> - if (value < min || value > max) {
> +
> + /* value == 0 indicates that block size should be sensed later on */
> + if ((value < min || value > max) && value > 0) {
> error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
> dev->id?:"", name, (int64_t)value, min, max);
> return;
> diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
> index a245684..562964e 100644
> --- a/hw/s390-virtio-bus.c
> +++ b/hw/s390-virtio-bus.c
> @@ -401,7 +401,7 @@ static TypeInfo s390_virtio_net = {
> };
>
> static Property s390_virtio_blk_properties[] = {
> - DEFINE_BLOCK_PROPERTIES(VirtIOS390Device, blk.conf),
> + DEFINE_BLOCK_PROPERTIES_EXTENDED(VirtIOS390Device, blk.conf, 0),
> DEFINE_BLOCK_CHS_PROPERTIES(VirtIOS390Device, blk.conf),
> DEFINE_PROP_STRING("serial", VirtIOS390Device, blk.serial),
> #ifdef __linux__
> diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> index fd8fa90..d2d73dc 100644
> --- a/hw/virtio-blk.c
> +++ b/hw/virtio-blk.c
> @@ -625,6 +625,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk)
> }
>
> blkconf_serial(&blk->conf, &blk->serial);
> + blkconf_blocksizes(&blk->conf);
> if (blkconf_geometry(&blk->conf, NULL, 65535, 255, 255) < 0) {
> return NULL;
> }
>
next prev parent reply other threads:[~2012-08-20 8:52 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-15 7:44 [Qemu-devel] [PATCH 0/2 v2] s390: block size auto-sensing and geometry guessing changes in common code Jens Freimann
2012-08-15 7:44 ` [Qemu-devel] [PATCH 1/2] virtio-block: support auto-sensing of block sizes Jens Freimann
2012-08-20 8:51 ` Paolo Bonzini [this message]
2012-08-15 7:44 ` [Qemu-devel] [PATCH 2/2] hd-geometry.c: Integrate HDIO_GETGEO in guessing Jens Freimann
2012-08-20 8:50 ` Paolo Bonzini
-- strict thread matches above, loose matches on Subject: below --
2012-08-13 10:10 [Qemu-devel] [PATCH 0/2] s390: block size auto-sensing and geometry guessing changes in common code Jens Freimann
2012-08-13 10:10 ` [Qemu-devel] [PATCH 1/2] virtio-block: support auto-sensing of block sizes Jens Freimann
2012-08-13 8:40 [Qemu-devel] [PATCH 0/2] s390: block size auto-sensing and geometry guessing changes in common code Jens Freimann
2012-08-13 8:40 ` [Qemu-devel] [PATCH 1/2] virtio-block: support auto-sensing of block sizes Jens Freimann
2012-08-13 19:50 ` Blue Swirl
2012-08-14 6:40 ` Jens Freimann
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=5031FAAC.4020601@redhat.com \
--to=pbonzini@redhat.com \
--cc=agraf@suse.de \
--cc=borntraeger@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=elelueck@linux.vnet.ibm.com \
--cc=graalfs@linux.vnet.ibm.com \
--cc=jfrei@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=wein@linux.vnet.ibm.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).