|
|
7a3408 |
From 75f3f4ed1356eba49f472206bb9bb0eeae728ba6 Mon Sep 17 00:00:00 2001
|
|
|
7a3408 |
Message-Id: <75f3f4ed1356eba49f472206bb9bb0eeae728ba6@dist-git>
|
|
|
7a3408 |
From: Martin Kletzander <mkletzan@redhat.com>
|
|
|
7a3408 |
Date: Tue, 6 Oct 2015 15:20:33 +0200
|
|
|
7a3408 |
Subject: [PATCH] qemu: Extract -mem-path building into its own function
|
|
|
7a3408 |
|
|
|
7a3408 |
https://bugzilla.redhat.com/show_bug.cgi?id=1266856
|
|
|
7a3408 |
|
|
|
7a3408 |
That function is called qemuBuildMemPathStr() and will be used in
|
|
|
7a3408 |
other places in the future. The change in the test suite is proper due
|
|
|
7a3408 |
to the fact that -mem-prealloc makes only sense with -mem-path (from
|
|
|
7a3408 |
qemu documentation -- html/qemu-doc.html).
|
|
|
7a3408 |
|
|
|
7a3408 |
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
|
|
7a3408 |
(cherry picked from commit ad8ab88c9141afb9b7541c67f3d0966d5a1b31cd)
|
|
|
7a3408 |
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
|
|
7a3408 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
7a3408 |
---
|
|
|
7a3408 |
src/qemu/qemu_command.c | 120 ++++++++++++---------
|
|
|
7a3408 |
.../qemuxml2argv-hugepages-pages6.args | 2 +-
|
|
|
7a3408 |
2 files changed, 73 insertions(+), 49 deletions(-)
|
|
|
7a3408 |
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
|
|
7a3408 |
index 53c9d01..0822ee4 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_command.c
|
|
|
7a3408 |
+++ b/src/qemu/qemu_command.c
|
|
|
7a3408 |
@@ -7705,6 +7705,71 @@ qemuBuildSmpArgStr(const virDomainDef *def,
|
|
|
7a3408 |
}
|
|
|
7a3408 |
|
|
|
7a3408 |
static int
|
|
|
7a3408 |
+qemuBuildMemPathStr(virQEMUDriverConfigPtr cfg,
|
|
|
7a3408 |
+ virDomainDefPtr def,
|
|
|
7a3408 |
+ virQEMUCapsPtr qemuCaps,
|
|
|
7a3408 |
+ virCommandPtr cmd)
|
|
|
7a3408 |
+{
|
|
|
7a3408 |
+ const long system_page_size = virGetSystemPageSizeKB();
|
|
|
7a3408 |
+ char *mem_path = NULL;
|
|
|
7a3408 |
+ size_t i = 0;
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ /*
|
|
|
7a3408 |
+ * No-op if hugepages were not requested.
|
|
|
7a3408 |
+ */
|
|
|
7a3408 |
+ if (!def->mem.nhugepages)
|
|
|
7a3408 |
+ return 0;
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ /* There is one special case: if user specified "huge"
|
|
|
7a3408 |
+ * pages of regular system pages size.
|
|
|
7a3408 |
+ * And there is nothing to do in this case.
|
|
|
7a3408 |
+ */
|
|
|
7a3408 |
+ if (def->mem.hugepages[0].size == system_page_size)
|
|
|
7a3408 |
+ return 0;
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (!cfg->nhugetlbfs) {
|
|
|
7a3408 |
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
+ "%s", _("hugetlbfs filesystem is not mounted "
|
|
|
7a3408 |
+ "or disabled by administrator config"));
|
|
|
7a3408 |
+ return -1;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
|
|
|
7a3408 |
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
+ _("hugepage backing not supported by '%s'"),
|
|
|
7a3408 |
+ def->emulator);
|
|
|
7a3408 |
+ return -1;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (!def->mem.hugepages[0].size) {
|
|
|
7a3408 |
+ if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
|
|
|
7a3408 |
+ cfg->nhugetlbfs)))
|
|
|
7a3408 |
+ return -1;
|
|
|
7a3408 |
+ } else {
|
|
|
7a3408 |
+ for (i = 0; i < cfg->nhugetlbfs; i++) {
|
|
|
7a3408 |
+ if (cfg->hugetlbfs[i].size == def->mem.hugepages[0].size)
|
|
|
7a3408 |
+ break;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (i == cfg->nhugetlbfs) {
|
|
|
7a3408 |
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
+ _("Unable to find any usable hugetlbfs "
|
|
|
7a3408 |
+ "mount for %llu KiB"),
|
|
|
7a3408 |
+ def->mem.hugepages[0].size);
|
|
|
7a3408 |
+ return -1;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[i])))
|
|
|
7a3408 |
+ return -1;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path", mem_path, NULL);
|
|
|
7a3408 |
+ VIR_FREE(mem_path);
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ return 0;
|
|
|
7a3408 |
+}
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+static int
|
|
|
7a3408 |
qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|
|
7a3408 |
virDomainDefPtr def,
|
|
|
7a3408 |
virCommandPtr cmd,
|
|
|
7a3408 |
@@ -9074,54 +9139,13 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|
|
7a3408 |
virCommandAddArgFormat(cmd, "%llu", virDomainDefGetMemoryInitial(def) / 1024);
|
|
|
7a3408 |
}
|
|
|
7a3408 |
|
|
|
7a3408 |
- if (def->mem.nhugepages && !virDomainNumaGetNodeCount(def->numa)) {
|
|
|
7a3408 |
- const long system_page_size = virGetSystemPageSizeKB();
|
|
|
7a3408 |
- char *mem_path = NULL;
|
|
|
7a3408 |
-
|
|
|
7a3408 |
- if (def->mem.hugepages[0].size == system_page_size) {
|
|
|
7a3408 |
- /* There is one special case: if user specified "huge"
|
|
|
7a3408 |
- * pages of regular system pages size. */
|
|
|
7a3408 |
- } else {
|
|
|
7a3408 |
- if (!cfg->nhugetlbfs) {
|
|
|
7a3408 |
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
- "%s", _("hugetlbfs filesystem is not mounted "
|
|
|
7a3408 |
- "or disabled by administrator config"));
|
|
|
7a3408 |
- goto error;
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
|
|
|
7a3408 |
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
- _("hugepage backing not supported by '%s'"),
|
|
|
7a3408 |
- def->emulator);
|
|
|
7a3408 |
- goto error;
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
-
|
|
|
7a3408 |
- if (def->mem.hugepages[0].size) {
|
|
|
7a3408 |
- for (j = 0; j < cfg->nhugetlbfs; j++) {
|
|
|
7a3408 |
- if (cfg->hugetlbfs[j].size == def->mem.hugepages[0].size)
|
|
|
7a3408 |
- break;
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
-
|
|
|
7a3408 |
- if (j == cfg->nhugetlbfs) {
|
|
|
7a3408 |
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
7a3408 |
- _("Unable to find any usable hugetlbfs mount for %llu KiB"),
|
|
|
7a3408 |
- def->mem.hugepages[0].size);
|
|
|
7a3408 |
- goto error;
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
-
|
|
|
7a3408 |
- if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[j])))
|
|
|
7a3408 |
- goto error;
|
|
|
7a3408 |
- } else {
|
|
|
7a3408 |
- if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
|
|
|
7a3408 |
- cfg->nhugetlbfs)))
|
|
|
7a3408 |
- goto error;
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
-
|
|
|
7a3408 |
- virCommandAddArg(cmd, "-mem-prealloc");
|
|
|
7a3408 |
- if (mem_path)
|
|
|
7a3408 |
- virCommandAddArgList(cmd, "-mem-path", mem_path, NULL);
|
|
|
7a3408 |
- VIR_FREE(mem_path);
|
|
|
7a3408 |
- }
|
|
|
7a3408 |
+ /*
|
|
|
7a3408 |
+ * Add '-mem-path' (and '-mem-prealloc') parameter here only if
|
|
|
7a3408 |
+ * there is no numa node specified.
|
|
|
7a3408 |
+ */
|
|
|
7a3408 |
+ if (!virDomainNumaGetNodeCount(def->numa) &&
|
|
|
7a3408 |
+ qemuBuildMemPathStr(cfg, def, qemuCaps, cmd) < 0)
|
|
|
7a3408 |
+ goto error;
|
|
|
7a3408 |
|
|
|
7a3408 |
if (def->mem.locked && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MLOCK)) {
|
|
|
7a3408 |
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
|
7a3408 |
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.args
|
|
|
7a3408 |
index 4eccb86..a3a4e57 100644
|
|
|
7a3408 |
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.args
|
|
|
7a3408 |
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.args
|
|
|
7a3408 |
@@ -1,4 +1,4 @@
|
|
|
7a3408 |
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
|
|
|
7a3408 |
-/usr/bin/qemu -S -M pc -m 1024 -mem-prealloc -smp 2 -nographic \
|
|
|
7a3408 |
+/usr/bin/qemu -S -M pc -m 1024 -smp 2 -nographic \
|
|
|
7a3408 |
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \
|
|
|
7a3408 |
-hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none
|
|
|
7a3408 |
--
|
|
|
7a3408 |
2.6.1
|
|
|
7a3408 |
|