All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Denis Plotnikov <dplotnikov@virtuozzo.com>
Cc: kwolf@redhat.com, fam@euphon.net, ehabkost@redhat.com,
	qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com,
	pbonzini@redhat.com, den@virtuozzo.com
Subject: Re: [PATCH v4 1/2] virtio: make seg_max virtqueue size dependent
Date: Thu, 19 Dec 2019 07:27:25 -0500	[thread overview]
Message-ID: <20191219072648-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20191216100451.28060-2-dplotnikov@virtuozzo.com>

On Mon, Dec 16, 2019 at 01:04:50PM +0300, Denis Plotnikov wrote:
> Before the patch, seg_max parameter was immutable and hardcoded
> to 126 (128 - 2) without respect to queue size. This has two negative effects:
> 
> 1. when queue size is < 128, we have Virtio 1.1 specfication violation:
>    (2.6.5.3.1 Driver Requirements) seq_max must be <= queue_size.
>    This violation affects the old Linux guests (ver < 4.14). These guests
>    crash on these queue_size setups.
> 
> 2. when queue_size > 128, as was pointed out by Denis Lunev <den@virtuozzo.com>,
>    seg_max restrics guest's block request length which affects guests'
>    performance making them issues more block request than needed.
>    https://lists.gnu.org/archive/html/qemu-devel/2017-12/msg03721.html
> 
> To mitigate this two effects, the patch adds the property adjusting seg_max
> to queue size automaticaly. Since seg_max is a guest visible parameter,
> the property is machine type managable and allows to choose between
> old (seg_max = 126 always) and new (seg_max = queue_size - 2) behaviors.
> 
> Not to change the behavior of the older VMs, prevent setting the default
> seg_max_adjust value for older machine types.
> 
> Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>

Stefan I think you acked this already? Could you ack?

Denis could you rebase on latest master pls so I can apply?

Thanks!

> ---
>  hw/block/virtio-blk.c           |  9 ++++++++-
>  hw/core/machine.c               |  3 +++
>  hw/scsi/vhost-scsi.c            |  2 ++
>  hw/scsi/virtio-scsi.c           | 10 +++++++++-
>  include/hw/virtio/virtio-blk.h  |  1 +
>  include/hw/virtio/virtio-scsi.h |  1 +
>  6 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
> index d62e6377c2..0f6f8113b7 100644
> --- a/hw/block/virtio-blk.c
> +++ b/hw/block/virtio-blk.c
> @@ -908,7 +908,8 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
>      blk_get_geometry(s->blk, &capacity);
>      memset(&blkcfg, 0, sizeof(blkcfg));
>      virtio_stq_p(vdev, &blkcfg.capacity, capacity);
> -    virtio_stl_p(vdev, &blkcfg.seg_max, 128 - 2);
> +    virtio_stl_p(vdev, &blkcfg.seg_max,
> +                 s->conf.seg_max_adjust ? s->conf.queue_size - 2 : 128 - 2);
>      virtio_stw_p(vdev, &blkcfg.geometry.cylinders, conf->cyls);
>      virtio_stl_p(vdev, &blkcfg.blk_size, blk_size);
>      virtio_stw_p(vdev, &blkcfg.min_io_size, conf->min_io_size / blk_size);
> @@ -1133,6 +1134,11 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
>          error_setg(errp, "num-queues property must be larger than 0");
>          return;
>      }
> +    if (conf->queue_size <= 2) {
> +        error_setg(errp, "invalid queue-size property (%" PRIu16 "), "
> +                   "must be > 2", conf->queue_size);
> +        return;
> +    }
>      if (!is_power_of_2(conf->queue_size) ||
>          conf->queue_size > VIRTQUEUE_MAX_SIZE) {
>          error_setg(errp, "invalid queue-size property (%" PRIu16 "), "
> @@ -1262,6 +1268,7 @@ static Property virtio_blk_properties[] = {
>                      true),
>      DEFINE_PROP_UINT16("num-queues", VirtIOBlock, conf.num_queues, 1),
>      DEFINE_PROP_UINT16("queue-size", VirtIOBlock, conf.queue_size, 128),
> +    DEFINE_PROP_BOOL("seg-max-adjust", VirtIOBlock, conf.seg_max_adjust, true),
>      DEFINE_PROP_LINK("iothread", VirtIOBlock, conf.iothread, TYPE_IOTHREAD,
>                       IOThread *),
>      DEFINE_PROP_BIT64("discard", VirtIOBlock, host_features,
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 023548b4f3..bfa320387e 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -29,6 +29,9 @@
>  
>  GlobalProperty hw_compat_4_2[] = {
>      { "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
> +    { "virtio-blk-device", "seg-max-adjust", "off"},
> +    { "virtio-scsi-device", "seg_max_adjust", "off"},
> +    { "vhost-blk-device", "seg_max_adjust", "off"},
>  };
>  const size_t hw_compat_4_2_len = G_N_ELEMENTS(hw_compat_4_2);
>  
> diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
> index c693fc748a..26f710d3ec 100644
> --- a/hw/scsi/vhost-scsi.c
> +++ b/hw/scsi/vhost-scsi.c
> @@ -275,6 +275,8 @@ static Property vhost_scsi_properties[] = {
>      DEFINE_PROP_UINT32("num_queues", VirtIOSCSICommon, conf.num_queues, 1),
>      DEFINE_PROP_UINT32("virtqueue_size", VirtIOSCSICommon, conf.virtqueue_size,
>                         128),
> +    DEFINE_PROP_BOOL("seg_max_adjust", VirtIOSCSICommon, conf.seg_max_adjust,
> +                      true),
>      DEFINE_PROP_UINT32("max_sectors", VirtIOSCSICommon, conf.max_sectors,
>                         0xFFFF),
>      DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSICommon, conf.cmd_per_lun, 128),
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index e8b2b64d09..405cb6c953 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -654,7 +654,8 @@ static void virtio_scsi_get_config(VirtIODevice *vdev,
>      VirtIOSCSICommon *s = VIRTIO_SCSI_COMMON(vdev);
>  
>      virtio_stl_p(vdev, &scsiconf->num_queues, s->conf.num_queues);
> -    virtio_stl_p(vdev, &scsiconf->seg_max, 128 - 2);
> +    virtio_stl_p(vdev, &scsiconf->seg_max,
> +                 s->conf.seg_max_adjust ? s->conf.virtqueue_size - 2 : 128 - 2);
>      virtio_stl_p(vdev, &scsiconf->max_sectors, s->conf.max_sectors);
>      virtio_stl_p(vdev, &scsiconf->cmd_per_lun, s->conf.cmd_per_lun);
>      virtio_stl_p(vdev, &scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
> @@ -893,6 +894,11 @@ void virtio_scsi_common_realize(DeviceState *dev,
>          virtio_cleanup(vdev);
>          return;
>      }
> +    if (s->conf.virtqueue_size <= 2) {
> +        error_setg(errp, "invalid virtqueue_size property (= %" PRIu16 "), "
> +                   "must be > 2", s->conf.virtqueue_size);
> +        return;
> +    }
>      s->cmd_vqs = g_new0(VirtQueue *, s->conf.num_queues);
>      s->sense_size = VIRTIO_SCSI_SENSE_DEFAULT_SIZE;
>      s->cdb_size = VIRTIO_SCSI_CDB_DEFAULT_SIZE;
> @@ -949,6 +955,8 @@ static Property virtio_scsi_properties[] = {
>      DEFINE_PROP_UINT32("num_queues", VirtIOSCSI, parent_obj.conf.num_queues, 1),
>      DEFINE_PROP_UINT32("virtqueue_size", VirtIOSCSI,
>                                           parent_obj.conf.virtqueue_size, 128),
> +    DEFINE_PROP_BOOL("seg_max_adjust", VirtIOSCSI,
> +                      parent_obj.conf.seg_max_adjust, true),
>      DEFINE_PROP_UINT32("max_sectors", VirtIOSCSI, parent_obj.conf.max_sectors,
>                                                    0xFFFF),
>      DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSI, parent_obj.conf.cmd_per_lun,
> diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h
> index 9c19f5b634..1e62f869b2 100644
> --- a/include/hw/virtio/virtio-blk.h
> +++ b/include/hw/virtio/virtio-blk.h
> @@ -38,6 +38,7 @@ struct VirtIOBlkConf
>      uint32_t request_merging;
>      uint16_t num_queues;
>      uint16_t queue_size;
> +    bool seg_max_adjust;
>      uint32_t max_discard_sectors;
>      uint32_t max_write_zeroes_sectors;
>      bool x_enable_wce_if_config_wce;
> diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
> index 122f7c4b6f..24e768909d 100644
> --- a/include/hw/virtio/virtio-scsi.h
> +++ b/include/hw/virtio/virtio-scsi.h
> @@ -48,6 +48,7 @@ typedef struct virtio_scsi_config VirtIOSCSIConfig;
>  struct VirtIOSCSIConf {
>      uint32_t num_queues;
>      uint32_t virtqueue_size;
> +    bool seg_max_adjust;
>      uint32_t max_sectors;
>      uint32_t cmd_per_lun;
>  #ifdef CONFIG_VHOST_SCSI
> -- 
> 2.17.0



  reply	other threads:[~2019-12-19 13:06 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-16 10:04 [PATCH v4 0/2] virtio: make seg_max virtqueue size dependent Denis Plotnikov
2019-12-16 10:04 ` [PATCH v4 1/2] " Denis Plotnikov
2019-12-19 12:27   ` Michael S. Tsirkin [this message]
2019-12-16 10:04 ` [PATCH v4 2/2] tests: add virtio-scsi and virtio-blk seg_max_adjust test Denis Plotnikov
2019-12-16 11:04 ` [PATCH v4 0/2] virtio: make seg_max virtqueue size dependent Michael S. Tsirkin
2019-12-19 16:23   ` Stefan Hajnoczi
2019-12-19 16:23 ` 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=20191219072648-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=den@virtuozzo.com \
    --cc=dplotnikov@virtuozzo.com \
    --cc=ehabkost@redhat.com \
    --cc=fam@euphon.net \
    --cc=kwolf@redhat.com \
    --cc=mreitz@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.