qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@openvz.org>
Cc: Kevin Wolf <kwolf@redhat.com>, "Denis V. Lunev" <den@openvz.org>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PATCH 18/19] block/parallels: add prealloc-mode and prealloc-size open paramemets
Date: Tue, 30 Dec 2014 13:07:11 +0300	[thread overview]
Message-ID: <1419934032-24216-9-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1419934032-24216-1-git-send-email-den@openvz.org>

This is preparational commit for tweaks in Parallels image expansion.
The idea is that enlarge via truncate by one data block is slow. It
would be much better to use fallocate via bdrv_write_zeroes and
expand by some significant amount at once.

This patch just adds proper parameters into BDRVParallelsState and
performs options parsing in parallels_open.

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/parallels.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/block/parallels.c b/block/parallels.c
index 18b9267..12a9cea 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -30,6 +30,7 @@
 #include "qemu-common.h"
 #include "block/block_int.h"
 #include "qemu/module.h"
+#include "qapi/util.h"
 
 /**************************************************************/
 
@@ -54,6 +55,20 @@ typedef struct ParallelsHeader {
     char padding[12];
 } QEMU_PACKED ParallelsHeader;
 
+
+typedef enum ParallelsPreallocMode {
+    PRL_PREALLOC_MODE_FALLOCATE = 0,
+    PRL_PREALLOC_MODE_TRUNCATE = 1,
+    PRL_PREALLOC_MODE_MAX = 2,
+} ParallelsPreallocMode;
+
+static const char *prealloc_mode_lookup[] = {
+    "falloc",
+    "truncate",
+    NULL,
+};
+
+
 typedef struct BDRVParallelsState {
     CoMutex lock;
 
@@ -67,12 +82,40 @@ typedef struct BDRVParallelsState {
     int bat_cache_off;
     int data_off;
 
+    uint64_t prealloc_size;
+    ParallelsPreallocMode prealloc_mode;
+
     unsigned int tracks;
 
     unsigned int off_multiplier;
 } BDRVParallelsState;
 
 
+#define PARALLELS_OPT_PREALLOC_MODE     "prealloc-mode"
+#define PARALLELS_OPT_PREALLOC_SIZE     "prealloc-size"
+
+static QemuOptsList parallels_runtime_opts = {
+    .name = "parallels",
+    .head = QTAILQ_HEAD_INITIALIZER(parallels_runtime_opts.head),
+    .desc = {
+        {
+            .name = PARALLELS_OPT_PREALLOC_SIZE,
+            .type = QEMU_OPT_SIZE,
+            .help = "Preallocation size on image expansion",
+            .def_value_str = "128MiB",
+        },
+        {
+            .name = PARALLELS_OPT_PREALLOC_MODE,
+            .type = QEMU_OPT_STRING,
+            .help = "Preallocation mode on image expansion "
+                    "(allowed values: falloc, truncate)",
+            .def_value_str = "falloc",
+        },
+        { /* end of list */ },
+    },
+};
+
+
 static uint32_t bat_offset(uint32_t index)
 {
     return sizeof(ParallelsHeader) + sizeof(uint32_t) * index;
@@ -99,6 +142,9 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVParallelsState *s = bs->opaque;
     int i;
     int ret;
+    QemuOpts *opts = NULL;
+    Error *local_err = NULL;
+    char *buf;
 
     ret = bdrv_pread(bs->file, 0, &s->ph, sizeof(s->ph));
     if (ret < 0) {
@@ -149,6 +195,27 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         goto fail;
     }
 
+    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, &local_err);
+    if (local_err != NULL) {
+        goto fail_options;
+    }
+
+    qemu_opts_absorb_qdict(opts, options, &local_err);
+    if (local_err != NULL) {
+        goto fail_options;
+    }
+
+    s->prealloc_size =
+        qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
+    s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
+    buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
+    s->prealloc_mode = qapi_enum_parse(prealloc_mode_lookup, buf,
+            PRL_PREALLOC_MODE_MAX, PRL_PREALLOC_MODE_FALLOCATE, &local_err);
+    g_free(buf);
+    if (local_err != NULL) {
+        goto fail_options;
+    }
+
     for (i = 0; i < s->bat_size; i++)
         le32_to_cpus(&s->bat[i]);
 
@@ -172,6 +239,11 @@ fail_format:
 fail:
     g_free(s->bat);
     return ret;
+
+fail_options:
+    error_propagate(errp, local_err);
+    ret = -EINVAL;
+    goto fail;
 }
 
 static int64_t seek_to_sector(BDRVParallelsState *s, int64_t sector_num)
-- 
1.9.1

  parent reply	other threads:[~2014-12-30 10:06 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-30  9:28 [Qemu-devel] [PATCH v2 0/19] write/create for Parallels images with reasonable performance Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 01/19] iotests, parallels: quote TEST_IMG in 076 test to be path-safe Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 02/19] block/parallels: rename parallels_header to ParallelsHeader Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 03/19] block/parallels: switch to bdrv_read Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 04/19] block/parallels: read up to cluster end in one go Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 05/19] block/parallels: add get_block_status Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 06/19] block/parallels: provide _co_readv routine for parallels format driver Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 07/19] block/parallels: replace magic constants 4, 64 with proper sizeofs Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 08/19] block/parallels: _co_writev callback for Parallels format Denis V. Lunev
2014-12-30  9:28 ` [Qemu-devel] [PATCH 09/19] iotests, parallels: test for write into Parallels image Denis V. Lunev
2014-12-30 10:07 ` [Qemu-devel] [PATCH 10/19] block/parallels: support parallels image creation Denis V. Lunev
2014-12-30 10:07   ` [Qemu-devel] [PATCH 11/19] iotests, parallels: test for newly created parallels image via qemu-img Denis V. Lunev
2014-12-30 10:07   ` [Qemu-devel] [PATCH 12/19] parallels: change copyright information in the image header Denis V. Lunev
2014-12-30 10:07   ` [Qemu-devel] [PATCH 13/19] block/parallels: store ParallelsHeader to the BDRVParallelsState Denis V. Lunev
2015-01-13 14:13     ` Roman Kagan
2014-12-30 10:07   ` [Qemu-devel] [PATCH 14/19] block/parallels: create catalog_offset helper Denis V. Lunev
2015-01-13 14:14     ` Roman Kagan
2014-12-30 10:07   ` [Qemu-devel] [PATCH 15/19] block/parallels: rename catalog_ names to bat_ Denis V. Lunev
2015-01-13 14:15     ` Roman Kagan
2014-12-30 10:07   ` [Qemu-devel] [PATCH 16/19] block/parallels: no need to flush on each block allocation table update Denis V. Lunev
2015-01-13 14:50     ` Roman Kagan
2015-01-13 15:17       ` Denis V. Lunev
2015-01-13 20:16         ` Denis V. Lunev
2015-01-14 12:01           ` Roman Kagan
2015-01-14 12:30             ` Denis V. Lunev
2014-12-30 10:07   ` [Qemu-devel] [PATCH 17/19] block/parallels: delay writing to BAT till bdrv_co_flush_to_os Denis V. Lunev
2015-01-14 13:03     ` Roman Kagan
2015-01-14 13:08       ` Denis V. Lunev
2015-01-14 13:34         ` Roman Kagan
2015-01-14 14:29           ` Denis V. Lunev
2015-01-14 16:44             ` Denis V. Lunev
2014-12-30 10:07   ` Denis V. Lunev [this message]
2015-01-14 14:26     ` [Qemu-devel] [PATCH 18/19] block/parallels: add prealloc-mode and prealloc-size open paramemets Roman Kagan
2015-01-14 14:31       ` Denis V. Lunev
2015-01-14 17:22         ` Roman Kagan
2014-12-30 10:07   ` [Qemu-devel] [PATCH 19/19] block/parallels: optimize linear image expansion Denis V. Lunev
2015-01-14 17:56     ` Roman Kagan
2015-01-14 17:57       ` Denis V. Lunev

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=1419934032-24216-9-git-send-email-den@openvz.org \
    --to=den@openvz.org \
    --cc=kwolf@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).