aboutsummaryrefslogtreecommitdiff
path: root/migration/migration.c
diff options
context:
space:
mode:
authorFabiano Rosas <farosas@suse.de>2024-06-17 15:57:27 -0300
committerFabiano Rosas <farosas@suse.de>2024-06-21 09:47:22 -0300
commit9d70239e56fadaa3571b8a7998a323ced52e8e76 (patch)
treed77a459dc524487c8f2f62cc87406970c130bee6 /migration/migration.c
parentb43b61d5bee522dadf44b472af71aab7235c13d5 (diff)
downloadqemu-9d70239e56fadaa3571b8a7998a323ced52e8e76.zip
qemu-9d70239e56fadaa3571b8a7998a323ced52e8e76.tar.gz
qemu-9d70239e56fadaa3571b8a7998a323ced52e8e76.tar.bz2
migration/multifd: Add direct-io support
When multifd is used along with mapped-ram, we can take benefit of a filesystem that supports the O_DIRECT flag and perform direct I/O in the multifd threads. This brings a significant performance improvement because direct-io writes bypass the page cache which would otherwise be thrashed by the multifd data which is unlikely to be needed again in a short period of time. To be able to use a multifd channel opened with O_DIRECT, we must ensure that a certain aligment is used. Filesystems usually require a block-size alignment for direct I/O. The way to achieve this is by enabling the mapped-ram feature, which already aligns its I/O properly (see MAPPED_RAM_FILE_OFFSET_ALIGNMENT at ram.c). By setting O_DIRECT on the multifd channels, all writes to the same file descriptor need to be aligned as well, even the ones that come from outside multifd, such as the QEMUFile I/O from the main migration code. This makes it impossible to use the same file descriptor for the QEMUFile and for the multifd channels. The various flags and metadata written by the main migration code will always be unaligned by virtue of their small size. To workaround this issue, we'll require a second file descriptor to be used exclusively for direct I/O. The second file descriptor can be obtained by QEMU by re-opening the migration file (already possible), or by being provided by the user or management application (support to be added in future patches). Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Diffstat (limited to 'migration/migration.c')
-rw-r--r--migration/migration.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/migration/migration.c b/migration/migration.c
index e1b2696..e03c80b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -155,6 +155,16 @@ static bool migration_needs_seekable_channel(void)
return migrate_mapped_ram();
}
+static bool migration_needs_extra_fds(void)
+{
+ /*
+ * When doing direct-io, multifd requires two different,
+ * non-duplicated file descriptors so we can use one of them for
+ * unaligned IO.
+ */
+ return migrate_multifd() && migrate_direct_io();
+}
+
static bool transport_supports_seeking(MigrationAddress *addr)
{
if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) {
@@ -164,6 +174,12 @@ static bool transport_supports_seeking(MigrationAddress *addr)
return false;
}
+static bool transport_supports_extra_fds(MigrationAddress *addr)
+{
+ /* file: works because QEMU can open it multiple times */
+ return addr->transport == MIGRATION_ADDRESS_TYPE_FILE;
+}
+
static bool
migration_channels_and_transport_compatible(MigrationAddress *addr,
Error **errp)
@@ -180,6 +196,13 @@ migration_channels_and_transport_compatible(MigrationAddress *addr,
return false;
}
+ if (migration_needs_extra_fds() &&
+ !transport_supports_extra_fds(addr)) {
+ error_setg(errp,
+ "Migration requires a transport that allows for extra fds (e.g. file)");
+ return false;
+ }
+
return true;
}