9119d9
From 18f90b67fa48a0af423c76ffd414dc0f471e6e3b Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <18f90b67fa48a0af423c76ffd414dc0f471e6e3b@dist-git>
9119d9
From: Martin Kletzander <mkletzan@redhat.com>
9119d9
Date: Wed, 17 Sep 2014 16:17:57 +0200
9119d9
Subject: [PATCH] qemu: add support for shared memory mapping
9119d9
9119d9
https://bugzilla.redhat.com/show_bug.cgi?id=1133144
9119d9
9119d9
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
9119d9
(cherry picked from commit c7abf2c856fab318adef0f89e8387200dd95daa3)
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
---
9119d9
 src/qemu/qemu_command.c                            | 29 ++++++++++++++++++++++
9119d9
 .../qemuxml2argv-hugepages-shared.args             | 16 ++++++++++++
9119d9
 tests/qemuxml2argvtest.c                           |  5 ++++
9119d9
 3 files changed, 50 insertions(+)
9119d9
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.args
9119d9
9119d9
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
9119d9
index 718533b..ce5daae 100644
9119d9
--- a/src/qemu/qemu_command.c
9119d9
+++ b/src/qemu/qemu_command.c
9119d9
@@ -6544,6 +6544,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
9119d9
     for (i = 0; i < def->cpu->ncells; i++) {
9119d9
         int cellmem = VIR_DIV_UP(def->cpu->cells[i].mem, 1024);
9119d9
         def->cpu->cells[i].mem = cellmem * 1024;
9119d9
+        virTristateSwitch memAccess = def->cpu->cells[i].memAccess;
9119d9
 
9119d9
         VIR_FREE(cpumask);
9119d9
         VIR_FREE(nodemask);
9119d9
@@ -6622,7 +6623,28 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
9119d9
                 virBufferAsprintf(&buf,
9119d9
                                   "memory-backend-file,prealloc=yes,mem-path=%s",
9119d9
                                   mem_path);
9119d9
+
9119d9
+                switch (memAccess) {
9119d9
+                case VIR_MEM_ACCESS_SHARED:
9119d9
+                    virBufferAddLit(&buf, ",share=on");
9119d9
+                    break;
9119d9
+
9119d9
+                case VIR_MEM_ACCESS_PRIVATE:
9119d9
+                    virBufferAddLit(&buf, ",share=off");
9119d9
+                    break;
9119d9
+
9119d9
+                case VIR_MEM_ACCESS_DEFAULT:
9119d9
+                case VIR_MEM_ACCESS_LAST:
9119d9
+                    break;
9119d9
+                }
9119d9
+
9119d9
             } else {
9119d9
+                if (memAccess) {
9119d9
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9119d9
+                                   _("Shared memory mapping is supported "
9119d9
+                                     "only with hugepages"));
9119d9
+                    goto cleanup;
9119d9
+                }
9119d9
                 virBufferAddLit(&buf, "memory-backend-ram");
9119d9
             }
9119d9
 
9119d9
@@ -6653,6 +6675,13 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
9119d9
 
9119d9
             virCommandAddArg(cmd, "-object");
9119d9
             virCommandAddArgBuffer(cmd, &buf;;
9119d9
+        } else {
9119d9
+            if (memAccess) {
9119d9
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9119d9
+                               _("Shared memory mapping is not supported "
9119d9
+                                 "with this QEMU"));
9119d9
+                goto cleanup;
9119d9
+            }
9119d9
         }
9119d9
 
9119d9
         virCommandAddArg(cmd, "-numa");
9119d9
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.args
9119d9
new file mode 100644
9119d9
index 0000000..a7c7d92
9119d9
--- /dev/null
9119d9
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.args
9119d9
@@ -0,0 +1,16 @@
9119d9
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
9119d9
+/usr/bin/qemu -S -M pc -m 4096 -smp 4 \
9119d9
+-object memory-backend-file,prealloc=yes,mem-path=/dev/hugepages1G/libvirt/qemu,\
9119d9
+size=1024M,id=ram-node0,host-nodes=0-3,policy=bind \
9119d9
+-numa node,nodeid=0,cpus=0,memdev=ram-node0 \
9119d9
+-object memory-backend-file,prealloc=yes,mem-path=/dev/hugepages2M/libvirt/qemu,\
9119d9
+share=on,size=1024M,id=ram-node1,host-nodes=0-3,policy=bind \
9119d9
+-numa node,nodeid=1,cpus=1,memdev=ram-node1 \
9119d9
+-object memory-backend-file,prealloc=yes,mem-path=/dev/hugepages1G/libvirt/qemu,\
9119d9
+share=off,size=1024M,id=ram-node2,host-nodes=0-3,policy=bind \
9119d9
+-numa node,nodeid=2,cpus=2,memdev=ram-node2 \
9119d9
+-object memory-backend-file,prealloc=yes,mem-path=/dev/hugepages1G/libvirt/qemu,\
9119d9
+size=1024M,id=ram-node3,host-nodes=3,policy=bind \
9119d9
+-numa node,nodeid=3,cpus=3,memdev=ram-node3 \
9119d9
+-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \
9119d9
+-hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none
9119d9
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
9119d9
index 5c28253..515058e 100644
9119d9
--- a/tests/qemuxml2argvtest.c
9119d9
+++ b/tests/qemuxml2argvtest.c
9119d9
@@ -684,6 +684,8 @@ mymain(void)
9119d9
             QEMU_CAPS_OBJECT_MEMORY_FILE);
9119d9
     DO_TEST("hugepages-pages3", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_RAM,
9119d9
             QEMU_CAPS_OBJECT_MEMORY_FILE);
9119d9
+    DO_TEST("hugepages-shared", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_RAM,
9119d9
+            QEMU_CAPS_OBJECT_MEMORY_FILE);
9119d9
     DO_TEST("nosharepages", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MEM_MERGE);
9119d9
     DO_TEST("disk-cdrom", NONE);
9119d9
     DO_TEST("disk-cdrom-network-http", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE,
9119d9
@@ -1207,6 +1209,9 @@ mymain(void)
9119d9
     DO_TEST_PARSE_ERROR("cpu-numa3", NONE);
9119d9
     DO_TEST_FAILURE("cpu-numa-disjoint", NONE);
9119d9
     DO_TEST("cpu-numa-disjoint", QEMU_CAPS_NUMA);
9119d9
+    DO_TEST_FAILURE("cpu-numa-memshared", QEMU_CAPS_SMP_TOPOLOGY,
9119d9
+                    QEMU_CAPS_OBJECT_MEMORY_RAM);
9119d9
+    DO_TEST_FAILURE("cpu-numa-memshared", QEMU_CAPS_SMP_TOPOLOGY);
9119d9
     DO_TEST("cpu-host-model", NONE);
9119d9
     skipLegacyCPUs = true;
9119d9
     DO_TEST("cpu-host-model-fallback", NONE);
9119d9
-- 
9119d9
2.1.0
9119d9