All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 01/16] Remove uses of ram.last_offset (aka last_ram_offset)
Date: Tue, 06 Jul 2010 10:45:48 -0500	[thread overview]
Message-ID: <4C334FAC.7070106@codemonkey.ws> (raw)
In-Reply-To: <20100625170838.8325.24344.stgit@localhost.localdomain>

On 06/25/2010 12:08 PM, Alex Williamson wrote:
> We currently need this either to allocate the next ram_addr_t for a
> new block, or for total memory to be migrated.  Both of which we can
> calculate without need of this to keep us in a contiguous address space.
>
> Signed-off-by: Alex Williamson<alex.williamson@redhat.com>
>    

Applied all.  Thanks.

Regards,

Anthony Liguori

> ---
>
>   arch_init.c |   23 ++++++++++++++++-------
>   cpu-all.h   |    1 -
>   exec.c      |   19 ++++++++++++++-----
>   3 files changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/arch_init.c b/arch_init.c
> index eb5b67c..109dcef 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -108,9 +108,10 @@ static int ram_save_block(QEMUFile *f)
>       static ram_addr_t current_addr = 0;
>       ram_addr_t saved_addr = current_addr;
>       ram_addr_t addr = 0;
> +    uint64_t total_ram = ram_bytes_total();
>       int bytes_sent = 0;
>
> -    while (addr<  ram_list.last_offset) {
> +    while (addr<  total_ram) {
>           if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
>               uint8_t *p;
>
> @@ -133,7 +134,7 @@ static int ram_save_block(QEMUFile *f)
>               break;
>           }
>           addr += TARGET_PAGE_SIZE;
> -        current_addr = (saved_addr + addr) % ram_list.last_offset;
> +        current_addr = (saved_addr + addr) % total_ram;
>       }
>
>       return bytes_sent;
> @@ -145,8 +146,9 @@ static ram_addr_t ram_save_remaining(void)
>   {
>       ram_addr_t addr;
>       ram_addr_t count = 0;
> +    uint64_t total_ram = ram_bytes_total();
>
> -    for (addr = 0; addr<  ram_list.last_offset; addr += TARGET_PAGE_SIZE) {
> +    for (addr = 0; addr<  total_ram; addr += TARGET_PAGE_SIZE) {
>           if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
>               count++;
>           }
> @@ -167,7 +169,13 @@ uint64_t ram_bytes_transferred(void)
>
>   uint64_t ram_bytes_total(void)
>   {
> -    return ram_list.last_offset;
> +    RAMBlock *block;
> +    uint64_t total = 0;
> +
> +    QLIST_FOREACH(block,&ram_list.blocks, next)
> +        total += block->length;
> +
> +    return total;
>   }
>
>   int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
> @@ -188,10 +196,11 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
>       }
>
>       if (stage == 1) {
> +        uint64_t total_ram = ram_bytes_total();
>           bytes_transferred = 0;
>
>           /* Make sure all dirty bits are set */
> -        for (addr = 0; addr<  ram_list.last_offset; addr += TARGET_PAGE_SIZE) {
> +        for (addr = 0; addr<  total_ram; addr += TARGET_PAGE_SIZE) {
>               if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
>                   cpu_physical_memory_set_dirty(addr);
>               }
> @@ -200,7 +209,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
>           /* Enable dirty memory tracking */
>           cpu_physical_memory_set_dirty_tracking(1);
>
> -        qemu_put_be64(f, ram_list.last_offset | RAM_SAVE_FLAG_MEM_SIZE);
> +        qemu_put_be64(f, total_ram | RAM_SAVE_FLAG_MEM_SIZE);
>       }
>
>       bytes_transferred_last = bytes_transferred;
> @@ -259,7 +268,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
>           addr&= TARGET_PAGE_MASK;
>
>           if (flags&  RAM_SAVE_FLAG_MEM_SIZE) {
> -            if (addr != ram_list.last_offset) {
> +            if (addr != ram_bytes_total()) {
>                   return -EINVAL;
>               }
>           }
> diff --git a/cpu-all.h b/cpu-all.h
> index e31c2de..dbb2139 100644
> --- a/cpu-all.h
> +++ b/cpu-all.h
> @@ -870,7 +870,6 @@ typedef struct RAMBlock {
>
>   typedef struct RAMList {
>       uint8_t *phys_dirty;
> -    ram_addr_t last_offset;
>       QLIST_HEAD(ram, RAMBlock) blocks;
>   } RAMList;
>   extern RAMList ram_list;
> diff --git a/exec.c b/exec.c
> index 7f64384..058b709 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -2765,6 +2765,17 @@ static void *file_ram_alloc(ram_addr_t memory, const char *path)
>   }
>   #endif
>
> +static ram_addr_t find_ram_offset(ram_addr_t size)
> +{
> +    RAMBlock *block;
> +    ram_addr_t last = 0;
> +
> +    QLIST_FOREACH(block,&ram_list.blocks, next)
> +        last = MAX(last, block->offset + block->length);
> +
> +    return last;
> +}
> +
>   ram_addr_t qemu_ram_alloc(ram_addr_t size)
>   {
>       RAMBlock *new_block;
> @@ -2798,18 +2809,16 @@ ram_addr_t qemu_ram_alloc(ram_addr_t size)
>           madvise(new_block->host, size, MADV_MERGEABLE);
>   #endif
>       }
> -    new_block->offset = ram_list.last_offset;
> +    new_block->offset = find_ram_offset(size);
>       new_block->length = size;
>
>       QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
>
>       ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
> -        (ram_list.last_offset + size)>>  TARGET_PAGE_BITS);
> -    memset(ram_list.phys_dirty + (ram_list.last_offset>>  TARGET_PAGE_BITS),
> +        (new_block->offset + size)>>  TARGET_PAGE_BITS);
> +    memset(ram_list.phys_dirty + (new_block->offset>>  TARGET_PAGE_BITS),
>              0xff, size>>  TARGET_PAGE_BITS);
>
> -    ram_list.last_offset += size;
> -
>       if (kvm_enabled())
>           kvm_setup_guest_memory(new_block->host, size);
>
>
>
>
>    

  reply	other threads:[~2010-07-06 15:46 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-24  4:40 [Qemu-devel] [PATCH 00/15] Make migration work with hotplug Alex Williamson
2010-06-24  4:40 ` [Qemu-devel] [PATCH 01/15] Remove uses of ram.last_offset (aka last_ram_offset) Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 02/15] qdev: Add a get_dev_path() function to BusInfo Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 03/15] pci: Implement BusInfo.get_dev_path() Alex Williamson
2010-06-24  7:39   ` Isaku Yamahata
2010-06-24 15:05     ` Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 04/15] savevm: Add DeviceState param Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 05/15] savevm: Make use of DeviceState Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 06/15] eepro100: Add a dev field to eeprom new/free functions Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 07/15] virtio-net: Incorporate a DeviceState pointer and let savevm track instances Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 08/15] qemu_ram_alloc: Add DeviceState and name parameters Alex Williamson
2010-06-24  4:41 ` [Qemu-devel] [PATCH 09/15] ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path Alex Williamson
2010-06-24  4:42 ` [Qemu-devel] [PATCH 10/15] savevm: Migrate RAM based on name/offset Alex Williamson
2010-06-24  5:49   ` [Qemu-devel] " Paolo Bonzini
2010-06-24  4:42 ` [Qemu-devel] [PATCH 11/15] savevm: Use RAM blocks for basis of migration Alex Williamson
2010-06-24  4:42 ` [Qemu-devel] [PATCH 12/15] savevm: Create a new continue flag to avoid resending block name Alex Williamson
2010-06-24  5:51   ` [Qemu-devel] " Paolo Bonzini
2010-06-24 15:06     ` Alex Williamson
2010-06-24  4:42 ` [Qemu-devel] [PATCH 13/15] qemu_ram_free: Implement it Alex Williamson
2010-06-24  4:42 ` [Qemu-devel] [PATCH 14/15] pci: Free the space allocated for the option rom on removal Alex Williamson
2010-06-24  4:42 ` [Qemu-devel] [PATCH 15/15] ramblocks: No more being lazy about duplicate names Alex Williamson
2010-06-24  6:02 ` [Qemu-devel] [PATCH 00/15] Make migration work with hotplug Yoshiaki Tamura
2010-06-24 15:04   ` Alex Williamson
2010-06-24 15:23     ` Alex Williamson
2010-06-25  2:01       ` Yoshiaki Tamura
2010-06-25 17:08 ` [Qemu-devel] [PATCH v2 00/16] " Alex Williamson
2010-06-25 17:08   ` [Qemu-devel] [PATCH v2 01/16] Remove uses of ram.last_offset (aka last_ram_offset) Alex Williamson
2010-07-06 15:45     ` Anthony Liguori [this message]
2010-06-25 17:08   ` [Qemu-devel] [PATCH v2 02/16] pc: Allocate all ram in a single qemu_ram_alloc() Alex Williamson
2010-06-25 17:08   ` [Qemu-devel] [PATCH v2 03/16] qdev: Add a get_dev_path() function to BusInfo Alex Williamson
2010-06-25 17:08   ` [Qemu-devel] [PATCH v2 04/16] pci: Implement BusInfo.get_dev_path() Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 05/16] savevm: Add DeviceState param Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 06/16] savevm: Make use of DeviceState Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 07/16] eepro100: Add a dev field to eeprom new/free functions Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 08/16] virtio-net: Incorporate a DeviceState pointer and let savevm track instances Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 09/16] qemu_ram_alloc: Add DeviceState and name parameters Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 10/16] ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 11/16] savevm: Migrate RAM based on name/offset Alex Williamson
2010-06-25 17:09   ` [Qemu-devel] [PATCH v2 12/16] savevm: Use RAM blocks for basis of migration Alex Williamson
2010-06-25 17:10   ` [Qemu-devel] [PATCH v2 13/16] savevm: Create a new continue flag to avoid resending block name Alex Williamson
2010-06-25 17:10   ` [Qemu-devel] [PATCH v2 14/16] qemu_ram_free: Implement it Alex Williamson
2010-06-25 17:10   ` [Qemu-devel] [PATCH v2 15/16] pci: Free the space allocated for the option rom on removal Alex Williamson
2010-06-25 17:10   ` [Qemu-devel] [PATCH v2 16/16] ramblocks: No more being lazy about duplicate names Alex Williamson
2010-07-02 17:11 ` [Qemu-devel] [PATCH v3 00/16] Make migration work with hotplug Alex Williamson
2010-07-02 17:11   ` [Qemu-devel] [PATCH v3 01/16] Remove uses of ram.last_offset (aka last_ram_offset) Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 02/16] pc: Allocate all ram in a single qemu_ram_alloc() Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 03/16] qdev: Add a get_dev_path() function to BusInfo Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 04/16] pci: Implement BusInfo.get_dev_path() Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 05/16] savevm: Add DeviceState param Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 06/16] savevm: Make use of DeviceState Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 07/16] eepro100: Add a dev field to eeprom new/free functions Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 08/16] virtio-net: Incorporate a DeviceState pointer and let savevm track instances Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 09/16] qemu_ram_alloc: Add DeviceState and name parameters Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 10/16] ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path Alex Williamson
2010-07-02 17:12   ` [Qemu-devel] [PATCH v3 11/16] savevm: Migrate RAM based on name/offset Alex Williamson
2010-07-02 17:13   ` [Qemu-devel] [PATCH v3 12/16] savevm: Use RAM blocks for basis of migration Alex Williamson
2010-07-02 17:13   ` [Qemu-devel] [PATCH v3 13/16] savevm: Create a new continue flag to avoid resending block name Alex Williamson
2010-07-02 17:13   ` [Qemu-devel] [PATCH v3 14/16] qemu_ram_free: Implement it Alex Williamson
2010-07-02 17:13   ` [Qemu-devel] [PATCH v3 15/16] pci: Free the space allocated for the option rom on removal Alex Williamson
2010-07-02 17:13   ` [Qemu-devel] [PATCH v3 16/16] ramblocks: No more being lazy about duplicate names Alex Williamson

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=4C334FAC.7070106@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=alex.williamson@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.