}
static qemuProcessIncomingDef *
-qemuMigrationDstPrepare(virDomainObj *vm,
+qemuMigrationDstPrepare(virQEMUDriver *driver,
+ virDomainObj *vm,
bool tunnel,
const char *protocol,
const char *listenAddress,
migrateFrom = g_strdup_printf(incFormat, protocol, listenAddress, port);
}
- return qemuProcessIncomingDefNew(vm, listenAddress,
+ return qemuProcessIncomingDefNew(driver, vm, listenAddress,
migrateFrom, fd,
- NULL, NULL);
+ NULL, NULL, NULL);
}
goto error;
stopProcess = true;
- if (!(incoming = qemuMigrationDstPrepare(vm, tunnel, protocol,
+ if (!(incoming = qemuMigrationDstPrepare(driver, vm, tunnel, protocol,
listenAddress, port,
&dataFD[0])))
goto error;
priv->origname = g_strdup(origname);
- if (!(incoming = qemuMigrationDstPrepare(vm, false, protocol,
+ if (!(incoming = qemuMigrationDstPrepare(driver, vm, false, protocol,
listenAddress, port, NULL)))
goto cleanup;
* qemuProcessIncomingDefFree will NOT close it.
*/
qemuProcessIncomingDef *
-qemuProcessIncomingDefNew(virDomainObj *vm,
+qemuProcessIncomingDefNew(virQEMUDriver *driver,
+ virDomainObj *vm,
const char *listenAddress,
const char *migrateFrom,
int *fd,
const char *path,
- virQEMUSaveData *data)
+ virQEMUSaveData *data,
+ qemuMigrationParams *migParams)
{
+ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivate *priv = vm->privateData;
qemuProcessIncomingDef *inc = NULL;
if (data && data->header.format == QEMU_SAVE_FORMAT_SPARSE) {
size_t offset = sizeof(virQEMUSaveHeader) + data->header.data_len;
+ bool directio = false;
inc->fdPassMigrate = qemuFDPassNew("libvirt-incoming-migrate", priv);
- qemuFDPassAddFD(inc->fdPassMigrate, fd, "-fd");
+ /* When using directio with mapped-ram, qemu needs an fd without
+ * O_DIRECT set for reading small bits of unaligned state. */
+ if (qemuMigrationParamsGetBool(migParams, QEMU_MIGRATION_PARAM_DIRECT_IO, &directio) < 0)
+ goto error;
+
+ if (directio) {
+ VIR_AUTOCLOSE bufferedFd = -1;
+
+ if ((bufferedFd = qemuDomainOpenFile(cfg, NULL, path, O_RDONLY, NULL)) < 0)
+ goto error;
+
+ qemuFDPassAddFD(inc->fdPassMigrate, &bufferedFd, "-buffered-fd");
+ qemuFDPassAddFD(inc->fdPassMigrate, fd, "direct-io-fd");
+ } else {
+ qemuFDPassAddFD(inc->fdPassMigrate, fd, "-buffered-fd");
+ }
inc->uri = g_strdup_printf("file:%s,offset=%#lx",
qemuFDPassGetPath(inc->fdPassMigrate), offset);
} else {
/* The fd passed to qemuProcessIncomingDefNew is used to create the migration
* URI, so it must be called after starting the decompression program.
*/
- incoming = qemuProcessIncomingDefNew(vm, NULL, "stdio", fd, path, data);
+ incoming = qemuProcessIncomingDefNew(driver, vm, NULL, "stdio", fd, path, data, migParams);
if (!incoming)
return -1;
const char *path; /* path associated with fd */
};
-qemuProcessIncomingDef *qemuProcessIncomingDefNew(virDomainObj *vm,
+qemuProcessIncomingDef *qemuProcessIncomingDefNew(virQEMUDriver *driver,
+ virDomainObj *vm,
const char *listenAddress,
const char *migrateFrom,
int *fd,
const char *path,
- virQEMUSaveData *data);
+ virQEMUSaveData *data,
+ qemuMigrationParams *migParams);
void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc);