Re: [PATCH v2 2/3] qemu: Create hugepage path on per domain basis

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 29, 2016 at 10:31:12AM +0100, Michal Privoznik wrote:
If you've ever tried running a huge page backed guest under
different user than root, you probably failed. Problem is even

Should this be: different than the user in qemu.conf?

though we have corresponding APIs in the security drivers,
there's no implementation and thus we don't relabel the huge page
path. But even if we did, so far all of the domains share the
same path:

  /hugepageMount/libvirt/qemu

Our only option there would be to set 0777 mode on the qemu dir
which is totally unsafe. Therefore, we can create dir on
per-domain basis, i.e.:

  /hugepageMount/libvirt/qemu/domainName

and chown domainName dir to the user that domain is configured to
run under.

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
---
src/qemu/qemu_command.c                            |  4 +-
src/qemu/qemu_conf.c                               | 44 +++++++++----
src/qemu/qemu_conf.h                               | 16 +++--
src/qemu/qemu_driver.c                             | 19 ++----
src/qemu/qemu_process.c                            | 74 ++++++++++++++++------
.../qemuxml2argv-hugepages-numa.args               |  6 +-
.../qemuxml2argv-hugepages-pages.args              | 16 ++---
.../qemuxml2argv-hugepages-pages2.args             |  2 +-
.../qemuxml2argv-hugepages-pages3.args             |  2 +-
.../qemuxml2argv-hugepages-pages5.args             |  2 +-
.../qemuxml2argv-hugepages-shared.args             | 14 ++--
tests/qemuxml2argvdata/qemuxml2argv-hugepages.args |  2 +-
.../qemuxml2argv-memory-hotplug-dimm-addr.args     |  4 +-
.../qemuxml2argv-memory-hotplug-dimm.args          |  4 +-
14 files changed, 131 insertions(+), 78 deletions(-)


@@ -3221,6 +3221,55 @@ qemuProcessReconnectCheckMemAliasOrderMismatch(virDomainObjPtr vm)
}


+static int
+qemuProcessBuildDestroydHugepagesPath(virQEMUDriverPtr driver,

Extra 'd' after Destroy.

+                                      virDomainObjPtr vm,

Only vm->def is needed.

+                                      bool build)

This would look nicer split in two functions. And the 'Destroy' one can
be void and best-effort.

+{
+    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+    char *hugepagePath = NULL;
+    size_t i;
+    int ret = -1;
+
+    if (vm->def->mem.nhugepages) {
+        for (i = 0; i < cfg->nhugetlbfs; i++) {
+            VIR_FREE(hugepagePath);
+            hugepagePath = qemuGetDomainHugepagePath(vm->def, &cfg->hugetlbfs[i]);
+
+            if (!hugepagePath)
+                goto cleanup;

In theory, this does not need to be an error for the Destroy path, we
can just continue to the next mount. In practice, this will never fail.

+
+            if (build) {
+                if (virFileMakePathWithMode(hugepagePath, 0700) < 0) {
+                    virReportSystemError(errno,
+                                         _("Unable to create %s"),
+                                         hugepagePath);
+                    goto cleanup;
+                }
+
+                if (virSecurityManagerSetHugepages(driver->securityManager,
+                                                   vm->def, hugepagePath) < 0) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR,
+                                   "%s", _("Unable to set huge path in security driver"));

Pre-existing error message oddness.

+                    VIR_FREE(hugepagePath);

Already done in 'cleanup'.

+                    goto cleanup;
+                }
+            } else {
+                if (rmdir(hugepagePath) < 0)
+                    VIR_WARN("Unable to remove hugepage path: %s (errno=%d)",
+                             hugepagePath, errno);

Can be VIR_ERROR, this will never happen(TM).

+            }
+        }
+    }
+
+    ret = 0;
+ cleanup:
+    VIR_FREE(hugepagePath);
+    virObjectUnref(cfg);
+    return ret;
+}
+
+

ACK

Jan

Attachment: signature.asc
Description: Digital signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]
  Powered by Linux