[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/19] block/parallels: add prealloc-mode and preall
From: |
Denis V. Lunev |
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 |
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 <address@hidden>
CC: Kevin Wolf <address@hidden>
CC: Stefan Hajnoczi <address@hidden>
---
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(¶llels_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
- [Qemu-devel] [PATCH 06/19] block/parallels: provide _co_readv routine for parallels format driver, (continued)
- [Qemu-devel] [PATCH 06/19] block/parallels: provide _co_readv routine for parallels format driver, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 09/19] iotests, parallels: test for write into Parallels image, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 10/19] block/parallels: support parallels image creation, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 13/19] block/parallels: store ParallelsHeader to the BDRVParallelsState, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 11/19] iotests, parallels: test for newly created parallels image via qemu-img, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 16/19] block/parallels: no need to flush on each block allocation table update, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 15/19] block/parallels: rename catalog_ names to bat_, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 12/19] parallels: change copyright information in the image header, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 17/19] block/parallels: delay writing to BAT till bdrv_co_flush_to_os, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 14/19] block/parallels: create catalog_offset helper, Denis V. Lunev, 2014/12/30
- [Qemu-devel] [PATCH 18/19] block/parallels: add prealloc-mode and prealloc-size open paramemets,
Denis V. Lunev <=
- [Qemu-devel] [PATCH 19/19] block/parallels: optimize linear image expansion, Denis V. Lunev, 2014/12/30