From nobody Thu Sep 19 01:23:10 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1718319506; cv=none; d=zohomail.com; s=zohoarc; b=ks25FoWPhWsPPmFcnRDFpB2hK2rhM5fLXt4Hnrp5gxVKYwtuDm4KPHKjqL/hix2ckuCdyZbuLOrOsu8lHW/poutvkCO8R4tQKOJWMVamgJPa3NAXoiLx7ncJqGDRM8zjae0ZmZ23jFPanwdADLz1uKUBSIJU8/wkEEbAgxBQDaQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319506; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=5RbU/Iti/1i8ZgH4NHt6ZBVRPGuGSU38MPnuXrtQ80Q=; b=K8VbKeraoXPG8apX2rvAtBU4oHdfb5DqKCtgm+g2ZKajxdCss6dIGJwYADC1Te4mWTGPXxkr0pI4egqUUJoJ5irtiCiQCU6GTUqSX9Zf05Mr+OcZGYPKjBi6iL6czx6DtK/QNewz1MO3q6qsbM3ES3eB7IdlqBZTHPrmITBPAH0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1718319506283265.2146537389865; Thu, 13 Jun 2024 15:58:26 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3C19312CC; Thu, 13 Jun 2024 18:58:25 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A92C7126B; Thu, 13 Jun 2024 18:54:30 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 78FAD122D; Thu, 13 Jun 2024 18:54:28 -0400 (EDT) Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 64A1F11F8 for ; Thu, 13 Jun 2024 18:52:48 -0400 (EDT) Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-35f2c9e23d3so1785395f8f.0 for ; Thu, 13 Jun 2024 15:52:48 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-7ebdba3d211sm52358839f.17.2024.06.13.15.52.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:46 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1718319167; x=1718923967; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=mjxjcu+Myiwbp3z89yaRyIAHUnQfv5h4mNQ74YAhFsM=; b=PqeAFOEvWqvn8w4kcHVAsGg/Vj1YWRv85X5K2DiRuRi0lXv5tpHu21noEjgKKambRv ukv80r+oVE927av11UNVYQRMdpY2oiXw4g63ouQmfHKfolOZ6fL3MjgiSMVjBoKuJfNx xam306y7InK4fEnmlgIzYxh5Cluv5ToR50YHbglo1iMgM2Az/wOt+fClFg0ybWODVe/O qO7BylVoX52v5rxKlbotVDzxDIwfoTZYIiJbQtCSbi49G4mgSe8wz1I3bnby29sw0cI8 3gtfd88XgHHINiDi1p2agOy4JeO0KVn+IKduaC8BADg7bCzxEJQ52Jv50nXEusuMyCgR JS/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319167; x=1718923967; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mjxjcu+Myiwbp3z89yaRyIAHUnQfv5h4mNQ74YAhFsM=; b=WapcQc+Ic/lTQQ3Se5I0guJC9957TatfVqqeHVd43qQpu5OmHS4/1mroFOGuAMKmax 0M7qutW8bII3DcdDrVMSSiw7M6dqXY7Ckxt4Ug8alrskTOUoLxzxYvVOBNfIXTiyQFoJ bINzV11IMBgCr2TZTlaGytv/8CA9bIB9ROtArwvImJv4JVpZKq186p7oLXbpIP+GO8Ts A0GiB8qWLB0B8BZpzs0eRaycQNzfqM9eHTArrupYkc9FeRGV3QK5PiizpaUfvGVKEo84 D4k7t51Lbg8g/vUaUla3xNsxDVyr+XmTsoXigSr0wpgeX9O0IDkFiGmxwjo3DnrLOWS4 uH3Q== X-Gm-Message-State: AOJu0YyrFw4krtPaZkZqyP9xIJvBrcmg4xBGnt2uJdPXuZ6E8F2EsxZs NFJYxeDPvCOGkJDWJVbO9QkSAeyZ4sUBc4Hf9/iDWC3Q4fBXDxtbYqXS/6iZyXVKQM5J2LWq9hh e X-Google-Smtp-Source: AGHT+IFfR5Y1Oge+5dKgbva50h9CZpiEiOOYfBDUmZrO+cIbpLk+a36JQizIX407/EnvArKN+I3k8Q== X-Received: by 2002:a5d:6545:0:b0:35f:d50:3301 with SMTP id ffacd0b85a97d-360718c9db7mr4253276f8f.3.1718319167148; Thu, 13 Jun 2024 15:52:47 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 8/9] qemu: Support O_DIRECT with mapped-ram on save Date: Thu, 13 Jun 2024 16:43:22 -0600 Message-ID: <20240613225228.10665-9-jfehlig@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240613225228.10665-1-jfehlig@suse.com> References: <20240613225228.10665-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 7KHVHLKT7DIT6P7BMY5BWB3AOU5RUET4 X-Message-ID-Hash: 7KHVHLKT7DIT6P7BMY5BWB3AOU5RUET4 X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1718319508637100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- I'm not happy with this and the subsequent patch, which pass another FD around for QEMU to use for reading/writing unaligned state when BYPASS_CACHE has been specified. One idea is to pass the qemuFdPass object around the various functions, but qemu_fd.h already includes qemu_monitor.h. E.g. passing a qemuFdPass to qemuMonitorMigrateToMappedFile requires including qemu_fd.h in qemu_monitor.h, so a cyclical dependency. I could move qemuFDPass*TransferMonitor* functions to qemu_monitor.[ch] to avoid the include in qemu_fd.h, but would likely require moving the _qemuFDPass struct in qemu_fd.c to qemu_fd.h. Another idea is to move qemuProcessIncomingDefNew in qemu_process.c to qemuMigrationConnectionDefNew() in qemu_migration.c. Also move qemuProcessIncomingDef object in qemu_process.h to qemuMigrationConnectDef (or something like that) in qemu_migration.h. The qemuMigrationConnectDef can encapsulate all the connection info related to the migration. E.g. traditional fd, path associated with fd, uri, listen address, qemuFDPass object containing fds for mapped_ram, etc. This can be used by both save and restore paths. Other suggestions kindly welcomed :-). src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_migration.h | 1 + src/qemu/qemu_monitor.c | 14 +++++++++++--- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_saveimage.c | 25 +++++++++++++++++-------- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index b1d27e07e1..a0435a0572 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7084,6 +7084,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDoma= inObj *vm, int qemuMigrationSrcToMappedFile(virQEMUDriver *driver, virDomainObj *vm, int fd, + int nondirectFD, virDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv =3D vm->privateData; @@ -7121,7 +7122,7 @@ qemuMigrationSrcToMappedFile(virQEMUDriver *driver, v= irDomainObj *vm, if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) goto cleanup; =20 - rc =3D qemuMonitorMigrateToFdSet(vm, 0, fd); + rc =3D qemuMonitorMigrateToFdSet(vm, 0, fd, nondirectFD); qemuDomainObjExitMonitor(vm); if (rc < 0) goto cleanup; diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index 864f3280e5..939205ef13 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -245,6 +245,7 @@ int qemuMigrationSrcToMappedFile(virQEMUDriver *driver, virDomainObj *vm, int fd, + int nondirectFD, virDomainAsyncJob asyncJob) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; =20 diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4c92bd740a..c0936bee6b 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2240,7 +2240,8 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int fd) + int fd, + int nondirectFD) { qemuDomainObjPrivate *priv =3D vm->privateData; qemuMonitor *mon =3D priv->mon; @@ -2249,15 +2250,22 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int setId; g_autofree char *uri =3D NULL; =20 - VIR_DEBUG("fd=3D%d flags=3D0x%x", fd, flags); + VIR_DEBUG("fd=3D%d nondirectFD=3D%d flags=3D0x%x", fd, nondirectFD, fl= ags); =20 QEMU_CHECK_MONITOR(mon); =20 - if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) + if (nondirectFD !=3D -1) + offset =3D lseek(nondirectFD, 0, SEEK_CUR); + else + offset =3D lseek(fd, 0, SEEK_CUR); + + if (offset =3D=3D -1) return -1; =20 fdPassMigrate =3D qemuFDPassNew("migrate", priv); qemuFDPassAddFD(fdPassMigrate, &fd, "-fd"); + if (nondirectFD !=3D -1) + qemuFDPassAddFD(fdPassMigrate, &nondirectFD, "-nondirect-fd"); qemuFDPassTransferMonitor(fdPassMigrate, mon); =20 if (qemuFDPassGetId(fdPassMigrate, &setId) < 0) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c477def138..0fbb2dadc1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -845,7 +845,8 @@ int qemuMonitorMigrateToFd(qemuMonitor *mon, =20 int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int fd); + int fd, + int nondirectFD); =20 int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 1545c00472..2b0281895a 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -431,19 +431,28 @@ qemuSaveImageCreateMapped(virQEMUDriver *driver, virDomainAsyncJob asyncJob) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE nondirectFD =3D -1; =20 - /* mapped-ram does not support directIO */ + /* If BYPASS_CACHE has been specified, fd has been opened with O_DIREC= T. + * In this case, QEMU requires a second FD without O_DIRECT for writing + * unaligned state. We'll use this FD as well to write the header. + * Relative to VM RAM size, this data is a drop in the bucket and fine + * to write without O_DIRECT. + */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("bypass cache unsupported by this system")); - return -1; + if ((nondirectFD =3D qemuDomainOpenFile(cfg, vm->def, path, O_WRON= LY, NULL)) < 0) + return -1; + if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, = nondirectFD) < 0) + return -1; + if (virQEMUSaveDataWrite(data, nondirectFD, path) < 0) + return -1; + } else { + if (virQEMUSaveDataWrite(data, fd, path) < 0) + return -1; } =20 - if (virQEMUSaveDataWrite(data, fd, path) < 0) - return -1; - /* Perform the migration */ - return qemuMigrationSrcToMappedFile(driver, vm, fd, asyncJob); + return qemuMigrationSrcToMappedFile(driver, vm, fd, nondirectFD, async= Job); } =20 =20 --=20 2.44.0