qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: zhanghailiang <zhang.zhanghailiang@huawei.com>
Cc: peter.maydell@linaro.org, mst@redhat.com, qemu-devel@nongnu.org,
	luonengjun@huawei.com, peter.huangpeng@huawei.com,
	lcapitulino@redhat.com
Subject: Re: [Qemu-devel] [PATCH] virtio-balloon: Fix ballooning not working correctly when hotplug memory
Date: Fri, 19 Sep 2014 15:09:48 +0200	[thread overview]
Message-ID: <20140919150948.7ae4a8a1@nial.usersys.redhat.com> (raw)
In-Reply-To: <1410784178-9012-1-git-send-email-zhang.zhanghailiang@huawei.com>

On Mon, 15 Sep 2014 20:29:38 +0800
zhanghailiang <zhang.zhanghailiang@huawei.com> wrote:

> When do memory balloon, it references the ram_size as the real ram size of VM,
> But here ram_size is not include the hotplugged memory, and the 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
> 
> Here we add a new global variable 'vm_ram_size', it will stat
"qmp balloon" is not performance critical code and instead of a global
variable, size could be calculated each time by enumerating present memory devices.


> the VM's real ram size which include configured ram and hotplugged ram.
> virtio-balloon will reference this parameter.
I know it's not supported yet but what will happen with balloonig
if dimm device is removed without telling about it to balloon first?

I'm not sure if balloon and native memory hotplug should be integrated.
Native memory hotplug was intended as a replacement for ballooning
without its drawbacks albeit guest OS memory unplug support is in
its infancy stage yet.

> 
> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> ---
>  hw/i386/pc.c               |  1 +
>  hw/virtio/virtio-balloon.c | 10 +++++-----
>  include/exec/cpu-common.h  |  1 +
>  vl.c                       |  3 +++
>  4 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index b6c9b61..817810b 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1606,6 +1606,7 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
>      memory_region_add_subregion(&pcms->hotplug_memory,
>                                  addr - pcms->hotplug_memory_base, mr);
>      vmstate_register_ram(mr, dev);
> +    vm_ram_size += memory_region_size(mr);
>  
>      hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
>      hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index 2c30b3d..205e1fe 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -292,7 +292,7 @@ static void virtio_balloon_set_config(VirtIODevice *vdev,
>      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);
>      }
> @@ -307,7 +307,7 @@ 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 <<
> +    info->actual = vm_ram_size - ((uint64_t) dev->actual <<
>                                 VIRTIO_BALLOON_PFN_SHIFT);
>  }
>  
> @@ -316,11 +316,11 @@ static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
>      VirtIOBalloon *dev = VIRTIO_BALLOON(opaque);
>      VirtIODevice *vdev = VIRTIO_DEVICE(dev);
>  
> -    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);
>      }
>  }
> diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
> index e3ec4c8..f55db6a 100644
> --- a/include/exec/cpu-common.h
> +++ b/include/exec/cpu-common.h
> @@ -46,6 +46,7 @@ typedef uintptr_t ram_addr_t;
>  #endif
>  
>  extern ram_addr_t ram_size;
> +extern ram_addr_t vm_ram_size;
>  
>  /* memory API */
>  
> diff --git a/vl.c b/vl.c
> index 9c9acf5..5d20d0c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -132,6 +132,7 @@ DisplayType display_type = DT_DEFAULT;
>  static int display_remote;
>  const char* keyboard_layout = NULL;
>  ram_addr_t ram_size;
> +ram_addr_t vm_ram_size; /* ram_size + hotplugged ram size */
>  const char *mem_path = NULL;
>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>  int nb_nics;
> @@ -3015,6 +3016,7 @@ int main(int argc, char **argv, char **envp)
>      machine_class = find_default_machine();
>      cpu_model = NULL;
>      ram_size = default_ram_size;
> +    vm_ram_size = ram_size;
>      snapshot = 0;
>      cyls = heads = secs = 0;
>      translation = BIOS_ATA_TRANSLATION_AUTO;
> @@ -3388,6 +3390,7 @@ int main(int argc, char **argv, char **envp)
>                              "'%s' option\n", slots_str ? "maxmem" : "slots");
>                      exit(EXIT_FAILURE);
>                  }
> +                vm_ram_size = ram_size;
>                  break;
>              }
>  #ifdef CONFIG_TPM

  parent reply	other threads:[~2014-09-19 13:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-15 12:29 [Qemu-devel] [PATCH] virtio-balloon: Fix ballooning not working correctly when hotplug memory zhanghailiang
2014-09-18  1:47 ` zhanghailiang
2014-09-19 13:09 ` Igor Mammedov [this message]
2014-09-22  3:36   ` zhanghailiang
2014-09-22  8:14     ` Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140919150948.7ae4a8a1@nial.usersys.redhat.com \
    --to=imammedo@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=luonengjun@huawei.com \
    --cc=mst@redhat.com \
    --cc=peter.huangpeng@huawei.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=zhang.zhanghailiang@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).