[pve-devel] [PATCH] fix ballooning with memory hotplug
Alexandre Derumier
aderumier at odiso.com
Mon Mar 9 10:57:26 CET 2015
patch1 && 2 are already in qemu upstream
patch3 fix proxmox patch
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
debian/patches/series | 3 +
debian/patches/virtio-balloon-dimmfix1.patch | 93 ++++++++++++++++++++++++++
debian/patches/virtio-balloon-dimmfix2.patch | 93 ++++++++++++++++++++++++++
debian/patches/virtio-balloon-dimmfix3.patch | 27 ++++++++
4 files changed, 216 insertions(+)
create mode 100644 debian/patches/virtio-balloon-dimmfix1.patch
create mode 100644 debian/patches/virtio-balloon-dimmfix2.patch
create mode 100644 debian/patches/virtio-balloon-dimmfix3.patch
diff --git a/debian/patches/series b/debian/patches/series
index 1381414..24e9d09 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -27,3 +27,6 @@ disable-efi-enable-pxe-roms.patch
backup-vma-allow-empty-backups.patch
glusterfs-daemonize.patch
gluster-backupserver.patch
+virtio-balloon-dimmfix1.patch
+virtio-balloon-dimmfix2.patch
+virtio-balloon-dimmfix3.patch
diff --git a/debian/patches/virtio-balloon-dimmfix1.patch b/debian/patches/virtio-balloon-dimmfix1.patch
new file mode 100644
index 0000000..3f1e1ad
--- /dev/null
+++ b/debian/patches/virtio-balloon-dimmfix1.patch
@@ -0,0 +1,93 @@
+From patchwork Wed Mar 4 19:13:32 2015
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [PULL,
+ 2/5] virtio-balloon: Fix balloon not working correctly when hotplug
+ memory
+From: Luiz Capitulino <lcapitulino at redhat.com>
+X-Patchwork-Id: 446384
+Message-Id: <1425496415-6161-3-git-send-email-lcapitulino at redhat.com>
+To: peter.maydell at linaro.org
+Cc: qemu-devel at nongnu.org
+Date: Wed, 4 Mar 2015 14:13:32 -0500
+
+From: zhanghailiang <zhang.zhanghailiang at huawei.com>
+
+When do memory balloon, it takes the 'ram_size' as the VM's current ram size,
+But 'ram_size' is the startup configured ram size, it does not take into
+account the hotplugged memory.
+
+As a result, the balloon result will be confused.
+Steps to reproduce:
+(1)Start VM: qemu -m size=1024,slots=4,maxmem=8G
+(2)In VM: #free -m : 1024M
+(3)qmp balloon 512M
+(4)In VM: #free -m : 512M
+(5)hotplug pc-dimm 1G
+(6)In VM: #free -m : 1512M
+(7)qmp balloon 256M
+(8)In VM: #free -m :1256M
+We expect the VM's available ram size to be 256M after 'qmp balloon 256M'
+command, but VM's real available ram size is 1256M.
+
+For "qmp balloon" is not performance critical code, we use function
+'get_current_ram_size' to get VM's current ram size.
+
+Signed-off-by: zhanghailiang <zhang.zhanghailiang at huawei.com>
+Signed-off-by: Luiz Capitulino <lcapitulino at redhat.com>
+Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
+---
+ hw/virtio/virtio-balloon.c | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
+index 14390e1..df3333c 100644
+--- a/hw/virtio/virtio-balloon.c
++++ b/hw/virtio/virtio-balloon.c
+@@ -294,10 +294,12 @@ static void virtio_balloon_set_config(VirtIODevice *vdev,
+ VirtIOBalloon *dev = VIRTIO_BALLOON(vdev);
+ struct virtio_balloon_config config;
+ uint32_t oldactual = dev->actual;
++ ram_addr_t vm_ram_size = get_current_ram_size();
++
+ memcpy(&config, config_data, sizeof(struct virtio_balloon_config));
+ dev->actual = le32_to_cpu(config.actual);
+ if (dev->actual != oldactual) {
+- qapi_event_send_balloon_change(ram_size -
++ qapi_event_send_balloon_change(vm_ram_size -
+ ((ram_addr_t) dev->actual << VIRTIO_BALLOON_PFN_SHIFT),
+ &error_abort);
+ }
+@@ -312,9 +314,8 @@ static uint32_t virtio_balloon_get_features(VirtIODevice *vdev, uint32_t f)
+ static void virtio_balloon_stat(void *opaque, BalloonInfo *info)
+ {
+ VirtIOBalloon *dev = opaque;
+- info->actual = ram_size - ((uint64_t) dev->actual <<
+- VIRTIO_BALLOON_PFN_SHIFT);
+-
++ info->actual = get_current_ram_size() - ((uint64_t) dev->actual <<
++ VIRTIO_BALLOON_PFN_SHIFT);
+ info->max_mem = ram_size;
+
+ if (!(balloon_stats_enabled(dev) && balloon_stats_supported(dev) &&
+@@ -349,12 +350,13 @@ static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
+ {
+ VirtIOBalloon *dev = VIRTIO_BALLOON(opaque);
+ VirtIODevice *vdev = VIRTIO_DEVICE(dev);
++ ram_addr_t vm_ram_size = get_current_ram_size();
+
+- if (target > ram_size) {
+- target = ram_size;
++ if (target > vm_ram_size) {
++ target = vm_ram_size;
+ }
+ if (target) {
+- dev->num_pages = (ram_size - target) >> VIRTIO_BALLOON_PFN_SHIFT;
++ dev->num_pages = (vm_ram_size - target) >> VIRTIO_BALLOON_PFN_SHIFT;
+ virtio_notify_config(vdev);
+ }
+ }
+--
+1.7.10.4
+
diff --git a/debian/patches/virtio-balloon-dimmfix2.patch b/debian/patches/virtio-balloon-dimmfix2.patch
new file mode 100644
index 0000000..782d5a4
--- /dev/null
+++ b/debian/patches/virtio-balloon-dimmfix2.patch
@@ -0,0 +1,93 @@
+From patchwork Wed Mar 4 19:13:31 2015
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [PULL, 1/5] pc-dimm: add a function to calculate VM's current RAM size
+From: Luiz Capitulino <lcapitulino at redhat.com>
+X-Patchwork-Id: 446386
+Message-Id: <1425496415-6161-2-git-send-email-lcapitulino at redhat.com>
+To: peter.maydell at linaro.org
+Cc: qemu-devel at nongnu.org
+Date: Wed, 4 Mar 2015 14:13:31 -0500
+
+From: zhanghailiang <zhang.zhanghailiang at huawei.com>
+
+The global parameter 'ram_size' does not take into account
+the hotplugged memory.
+
+In some codes, we use 'ram_size' as current VM's real RAM size,
+which is not correct.
+
+Add function 'get_current_ram_size' to calculate VM's current RAM size,
+it will enumerate present memory devices and also plus ram_size.
+
+Signed-off-by: zhanghailiang <zhang.zhanghailiang at huawei.com>
+Signed-off-by: Luiz Capitulino <lcapitulino at redhat.com>
+---
+ hw/mem/pc-dimm.c | 26 ++++++++++++++++++++++++++
+ include/exec/cpu-common.h | 1 +
+ stubs/qmp_pc_dimm_device_list.c | 5 +++++
+ 3 files changed, 32 insertions(+)
+
+diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
+index f27a087..de81b9c 100644
+--- a/hw/mem/pc-dimm.c
++++ b/hw/mem/pc-dimm.c
+@@ -100,6 +100,32 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
+ return 0;
+ }
+
++ram_addr_t get_current_ram_size(void)
++{
++ MemoryDeviceInfoList *info_list = NULL;
++ MemoryDeviceInfoList **prev = &info_list;
++ MemoryDeviceInfoList *info;
++ ram_addr_t size = ram_size;
++
++ qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
++ for (info = info_list; info; info = info->next) {
++ MemoryDeviceInfo *value = info->value;
++
++ if (value) {
++ switch (value->kind) {
++ case MEMORY_DEVICE_INFO_KIND_DIMM:
++ size += value->dimm->size;
++ break;
++ default:
++ break;
++ }
++ }
++ }
++ qapi_free_MemoryDeviceInfoList(info_list);
++
++ return size;
++}
++
+ static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
+ {
+ unsigned long *bitmap = opaque;
+diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
+index 427b851..fcc3162 100644
+--- a/include/exec/cpu-common.h
++++ b/include/exec/cpu-common.h
+@@ -52,6 +52,7 @@ typedef uintptr_t ram_addr_t;
+ #endif
+
+ extern ram_addr_t ram_size;
++ram_addr_t get_current_ram_size(void);
+
+ /* memory API */
+
+diff --git a/stubs/qmp_pc_dimm_device_list.c b/stubs/qmp_pc_dimm_device_list.c
+index 5cb220c..b584bd8 100644
+--- a/stubs/qmp_pc_dimm_device_list.c
++++ b/stubs/qmp_pc_dimm_device_list.c
+@@ -5,3 +5,8 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
+ {
+ return 0;
+ }
++
++ram_addr_t get_current_ram_size(void)
++{
++ return ram_size;
++}
diff --git a/debian/patches/virtio-balloon-dimmfix3.patch b/debian/patches/virtio-balloon-dimmfix3.patch
new file mode 100644
index 0000000..a8de329
--- /dev/null
+++ b/debian/patches/virtio-balloon-dimmfix3.patch
@@ -0,0 +1,27 @@
+From f818a6aa247b71e8185a3277910ac1cd935432d1 Mon Sep 17 00:00:00 2001
+From: Alexandre Derumier <aderumier at odiso.com>
+Date: Mon, 9 Mar 2015 10:18:01 +0100
+Subject: [PATCH] info max_mem : get_current_ram_size
+
+
+Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
+---
+ hw/virtio/virtio-balloon.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
+index df3333c..7f6da3f 100644
+--- a/hw/virtio/virtio-balloon.c
++++ b/hw/virtio/virtio-balloon.c
+@@ -316,7 +316,7 @@ static void virtio_balloon_stat(void *opaque, BalloonInfo *info)
+ VirtIOBalloon *dev = opaque;
+ info->actual = get_current_ram_size() - ((uint64_t) dev->actual <<
+ VIRTIO_BALLOON_PFN_SHIFT);
+- info->max_mem = ram_size;
++ info->max_mem = get_current_ram_size();
+
+ if (!(balloon_stats_enabled(dev) && balloon_stats_supported(dev) &&
+ dev->stats_last_update)) {
+--
+1.7.10.4
+
--
1.7.10.4
More information about the pve-devel
mailing list