[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3] file-posix: add drop-cache=on|off option
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH v3] file-posix: add drop-cache=on|off option |
Date: |
Thu, 7 Mar 2019 16:49:41 +0000 |
Commit dd577a26ff03b6829721b1ffbbf9e7c411b72378 ("block/file-posix:
implement bdrv_co_invalidate_cache() on Linux") introduced page cache
invalidation so that cache.direct=off live migration is safe on Linux.
The invalidation takes a significant amount of time when the file is
large and present in the page cache. Normally this is not the case for
cross-host live migration but it can happen when migrating between QEMU
processes on the same host.
On same-host migration we don't need to invalidate pages for correctness
anyway, so an option to skip page cache invalidation is useful. I
investigated optimizing invalidation and detecting same-host migration,
but both are hard to achieve so a user-visible option will suffice.
As a bonus this option means that the cache invalidation feature will
now be detectable by libvirt via QMP schema introspection.
Suggested-by: Neil Skrypuch <address@hidden>
Tested-by: Neil Skrypuch <address@hidden>
Reviewed-by: Stefano Garzarella <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
v3:
* This option is now conditional on CONFIG_LINUX and *can* be used for
libvirt feature detection after all [eblake/armbru]
v2:
* Remove outdated comment about libvirt feature detection [danpb]
---
qapi/block-core.json | 6 ++++++
block/file-posix.c | 16 ++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 2b8afbb924..13cf01e308 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2807,6 +2807,10 @@
# @locking: whether to enable file locking. If set to 'auto', only enable
# when Open File Descriptor (OFD) locking API is available
# (default: auto, since 2.10)
+# @drop-cache: invalidate page cache during live migration. This prevents
+# stale data on the migration destination with cache.direct=off.
+# Currently only supported on Linux hosts.
+# (default: on, since: 4.0)
# @x-check-cache-dropped: whether to check that page cache was dropped on live
# migration. May cause noticeable delays if the image
# file is large, do not use in production.
@@ -2819,6 +2823,8 @@
'*pr-manager': 'str',
'*locking': 'OnOffAuto',
'*aio': 'BlockdevAioOptions',
+ '*drop-cache': {'type': 'bool',
+ 'if': 'defined(CONFIG_LINUX)'},
'*x-check-cache-dropped': 'bool' } }
##
diff --git a/block/file-posix.c b/block/file-posix.c
index ba6ab62a38..936dea8096 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -154,6 +154,7 @@ typedef struct BDRVRawState {
bool page_cache_inconsistent:1;
bool has_fallocate;
bool needs_alignment;
+ bool drop_cache;
bool check_cache_dropped;
PRManager *pr_mgr;
@@ -162,6 +163,7 @@ typedef struct BDRVRawState {
typedef struct BDRVRawReopenState {
int fd;
int open_flags;
+ bool drop_cache;
bool check_cache_dropped;
} BDRVRawReopenState;
@@ -422,6 +424,13 @@ static QemuOptsList raw_runtime_opts = {
.type = QEMU_OPT_STRING,
.help = "id of persistent reservation manager object (default:
none)",
},
+#if defined(__linux__)
+ {
+ .name = "drop-cache",
+ .type = QEMU_OPT_BOOL,
+ .help = "invalidate page cache during live migration (default:
on)",
+ },
+#endif
{
.name = "x-check-cache-dropped",
.type = QEMU_OPT_BOOL,
@@ -511,6 +520,7 @@ static int raw_open_common(BlockDriverState *bs, QDict
*options,
}
}
+ s->drop_cache = qemu_opt_get_bool(opts, "drop-cache", true);
s->check_cache_dropped = qemu_opt_get_bool(opts, "x-check-cache-dropped",
false);
@@ -869,6 +879,7 @@ static int raw_reopen_prepare(BDRVReopenState *state,
goto out;
}
+ rs->drop_cache = qemu_opt_get_bool_del(opts, "drop-cache", true);
rs->check_cache_dropped =
qemu_opt_get_bool_del(opts, "x-check-cache-dropped", false);
@@ -946,6 +957,7 @@ static void raw_reopen_commit(BDRVReopenState *state)
BDRVRawState *s = state->bs->opaque;
Error *local_err = NULL;
+ s->drop_cache = rs->drop_cache;
s->check_cache_dropped = rs->check_cache_dropped;
s->open_flags = rs->open_flags;
@@ -2531,6 +2543,10 @@ static void coroutine_fn
raw_co_invalidate_cache(BlockDriverState *bs,
return;
}
+ if (!s->drop_cache) {
+ return;
+ }
+
if (s->open_flags & O_DIRECT) {
return; /* No host kernel page cache */
}
--
2.20.1
- [Qemu-devel] [PATCH v3] file-posix: add drop-cache=on|off option,
Stefan Hajnoczi <=