From 1920220b4f92179b9a9364b3840abbdbe9a5a0b8 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Mon, 9 Mar 2015 10:57:26 +0100 Subject: [PATCH] fix ballooning with memory hotplug patch1 && 2 are already in qemu upstream patch3 fix proxmox patch Signed-off-by: Alexandre Derumier Conflicts: debian/changelog --- debian/changelog | 6 +- 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 ++++++ 5 files changed, 220 insertions(+), 2 deletions(-) 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/changelog b/debian/changelog index 8e72e72..d9c6b09 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,10 @@ pve-qemu-kvm (2.2-8) unstable; urgency=medium * fix package dependencies for Debian Jessie - - -- Proxmox Support Team Thu, 26 Feb 2015 12:47:17 +0100 + + * fix ballooning with memory hotplug + + -- Proxmox Support Team Wed, 11 Mar 2015 07:12:43 +0100 pve-qemu-kvm (2.2-7) unstable; urgency=low diff --git a/debian/patches/series b/debian/patches/series index 20a5ac7..48afa3c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -29,5 +29,8 @@ 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 add-qmp-get-link-status.patch fix-mc146818rtc-wrong-subsection-name.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 +X-Patchwork-Id: 446384 +Message-Id: <1425496415-6161-3-git-send-email-lcapitulino@redhat.com> +To: peter.maydell@linaro.org +Cc: qemu-devel@nongnu.org +Date: Wed, 4 Mar 2015 14:13:32 -0500 + +From: zhanghailiang + +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 +Signed-off-by: Luiz Capitulino +Signed-off-by: Alexandre Derumier +--- + 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 +X-Patchwork-Id: 446386 +Message-Id: <1425496415-6161-2-git-send-email-lcapitulino@redhat.com> +To: peter.maydell@linaro.org +Cc: qemu-devel@nongnu.org +Date: Wed, 4 Mar 2015 14:13:31 -0500 + +From: zhanghailiang + +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 +Signed-off-by: Luiz Capitulino +--- + 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 +Date: Mon, 9 Mar 2015 10:18:01 +0100 +Subject: [PATCH] info max_mem : get_current_ram_size + + +Signed-off-by: Alexandre Derumier +--- + 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 + -- 2.39.2