From: Juan Quintela <quintela@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 10/10] Maintaing number of dirty pages
Date: Tue, 30 Nov 2010 15:46:56 +0100 [thread overview]
Message-ID: <m3r5e2vpgf.fsf@trasno.mitica> (raw)
In-Reply-To: <4CF45DE0.8020701@codemonkey.ws> (Anthony Liguori's message of "Mon, 29 Nov 2010 20:13:52 -0600")
Anthony Liguori <anthony@codemonkey.ws> wrote:
> On 11/23/2010 05:03 PM, Juan Quintela wrote:
>> From: Juan Quintela<quintela@trasno.org>
>>
>> Calculate the number of dirty pages takes a lot on hosts with lots
>> of memory. Just maintain how many pages are dirty. Only sync bitmaps
>> if number is small enough.
>>
>
> There needs to be numbers that justify this as part of the commit message.
They are on patch 0/6.
Additionally, with 64GB of RAM, this bitmap is HUGE, having to walk over
it in each ram_save_live() call is too onerous.
> This only works for KVM because it happens to use set_dirty() whenever
> it dirties memory. I don't think will work with TCG.
The TCG is already broken with respect to migration. Nothing else
sets that bitmap nowadays.
> I also think that the fundamental problem is the kernel dirty bitmap.
> Perhaps it should return a multiple level table instead of a simple
> linear bitmap.
KVM interface is suboptimal, no doubt here. But the bigger problem is
qemu implementation. Having a byte arry where it only uses 2 bits is
wasteful at least. And having to transform the array forth<->back with
kvm is worse still.
Longer term my plan is:
- make kvm return the number of dirty pages somehow (i.e. no need to
calculate them)
- split bitmaps, migration bitmap only needs to be handled during
migration, and CODE bitmap only for TCG.
- interface with kvm would better be something like array of pages
or array (pages, count). But I need to measure if there is any
differences/improvements with one/another.
We were discussing yesterday what made ram_live_block() staying on top
of the profiles, it was this. This makes ram_save_live() to dissapear
from profiles.
Later, Juan.
> Regards,
>
> Anthony Liguori
>
>> Signed-off-by: Juan Quintela<quintela@trasno.org>
>> Signed-off-by: Juan Quintela<quintela@redhat.com>
>> ---
>> arch_init.c | 15 +--------------
>> cpu-all.h | 7 +++++++
>> exec.c | 1 +
>> 3 files changed, 9 insertions(+), 14 deletions(-)
>>
>> diff --git a/arch_init.c b/arch_init.c
>> index b463798..c2bc144 100644
>> --- a/arch_init.c
>> +++ b/arch_init.c
>> @@ -176,20 +176,7 @@ static uint64_t bytes_transferred;
>>
>> static uint64_t ram_save_remaining(void)
>> {
>> - RAMBlock *block;
>> - uint64_t count = 0;
>> -
>> - QLIST_FOREACH(block,&ram_list.blocks, next) {
>> - ram_addr_t addr;
>> - for (addr = block->offset; addr< block->offset + block->length;
>> - addr += TARGET_PAGE_SIZE) {
>> - if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
>> - count++;
>> - }
>> - }
>> - }
>> -
>> - return count;
>> + return ram_list.dirty_pages;
>> }
>>
>> uint64_t ram_bytes_remaining(void)
>> diff --git a/cpu-all.h b/cpu-all.h
>> index 30ae17d..5dc27c6 100644
>> --- a/cpu-all.h
>> +++ b/cpu-all.h
>> @@ -874,6 +874,7 @@ typedef struct RAMBlock {
>>
>> typedef struct RAMList {
>> uint8_t *phys_dirty;
>> + uint64_t dirty_pages;
>> QLIST_HEAD(ram, RAMBlock) blocks;
>> } RAMList;
>> extern RAMList ram_list;
>> @@ -922,6 +923,9 @@ static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
>>
>> static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
>> {
>> + if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
>> + ram_list.dirty_pages++;
>> +
>> ram_list.phys_dirty[addr>> TARGET_PAGE_BITS] = 0xff;
>> }
>>
>> @@ -942,6 +946,9 @@ static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
>> mask = ~dirty_flags;
>> p = ram_list.phys_dirty + (start>> TARGET_PAGE_BITS);
>> for (i = 0; i< len; i++) {
>> + if (cpu_physical_memory_get_dirty(start + i * TARGET_PAGE_SIZE,
>> + MIGRATION_DIRTY_FLAG& dirty_flags))
>> + ram_list.dirty_pages--;
>> p[i]&= mask;
>> }
>> }
>> diff --git a/exec.c b/exec.c
>> index f5b2386..ca2506e 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -2866,6 +2866,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
>> last_ram_offset()>> TARGET_PAGE_BITS);
>> memset(ram_list.phys_dirty + (new_block->offset>> TARGET_PAGE_BITS),
>> 0xff, size>> TARGET_PAGE_BITS);
>> + ram_list.dirty_pages += size>> TARGET_PAGE_BITS;
>>
>> if (kvm_enabled())
>> kvm_setup_guest_memory(new_block->host, size);
>>
next prev parent reply other threads:[~2010-12-01 4:40 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-23 23:02 [Qemu-devel] [PATCH 00/10] Fix migration with lots of memory Juan Quintela
2010-11-23 23:02 ` [Qemu-devel] [PATCH 01/10] Add spent time to migration Juan Quintela
2010-11-23 23:02 ` [Qemu-devel] [PATCH 02/10] Add buffered_file_internal constant Juan Quintela
2010-11-24 10:40 ` [Qemu-devel] " Michael S. Tsirkin
2010-11-24 10:52 ` Juan Quintela
2010-11-24 11:04 ` Michael S. Tsirkin
2010-11-24 11:13 ` Juan Quintela
2010-11-24 11:19 ` Michael S. Tsirkin
[not found] ` <4CF46012.2060804@codemonkey.ws>
2010-11-30 11:56 ` Juan Quintela
2010-11-30 14:02 ` Anthony Liguori
2010-11-30 14:11 ` Michael S. Tsirkin
2010-11-30 14:22 ` Anthony Liguori
2010-11-30 15:40 ` Juan Quintela
2010-11-30 16:10 ` Michael S. Tsirkin
2010-11-30 16:32 ` Juan Quintela
2010-11-30 16:44 ` Anthony Liguori
2010-11-30 18:04 ` Juan Quintela
2010-11-30 18:54 ` Anthony Liguori
2010-11-30 19:15 ` Juan Quintela
2010-11-30 20:23 ` Anthony Liguori
2010-11-30 20:56 ` Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 03/10] Add printf debug to savevm Juan Quintela
[not found] ` <4CF45AB2.7050506@codemonkey.ws>
2010-11-30 10:36 ` Stefan Hajnoczi
2010-11-30 22:40 ` [Qemu-devel] " Juan Quintela
2010-12-01 7:50 ` Stefan Hajnoczi
2010-11-23 23:03 ` [Qemu-devel] [PATCH 04/10] No need to iterate if we already are over the limit Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 05/10] KVM don't care about TLB handling Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 06/10] Only calculate expected_time for stage 2 Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 07/10] ram_save_remaining() returns an uint64_t Juan Quintela
[not found] ` <4CF45C0C.705@codemonkey.ws>
2010-11-30 7:21 ` [Qemu-devel] " Paolo Bonzini
2010-11-30 13:44 ` Anthony Liguori
2010-11-30 14:38 ` Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 08/10] Count nanoseconds with uint64_t not doubles Juan Quintela
2010-11-30 7:17 ` [Qemu-devel] " Paolo Bonzini
[not found] ` <4CF45C5B.9080507@codemonkey.ws>
2010-11-30 14:40 ` Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 09/10] Exit loop if we have been there too long Juan Quintela
2010-11-24 10:40 ` [Qemu-devel] " Michael S. Tsirkin
2010-11-24 11:01 ` Juan Quintela
2010-11-24 11:14 ` Michael S. Tsirkin
2010-11-24 15:16 ` Paolo Bonzini
2010-11-24 15:59 ` Michael S. Tsirkin
[not found] ` <4CF45E3F.4040609@codemonkey.ws>
2010-11-30 8:10 ` Paolo Bonzini
2010-11-30 13:26 ` Juan Quintela
[not found] ` <4CF45D67.5010906@codemonkey.ws>
2010-11-30 7:15 ` Paolo Bonzini
2010-11-30 13:47 ` Anthony Liguori
2010-11-30 13:47 ` [Qemu-devel] " Anthony Liguori
2010-11-30 13:58 ` Avi Kivity
2010-11-30 13:58 ` [Qemu-devel] " Avi Kivity
2010-11-30 14:17 ` Anthony Liguori
2010-11-30 14:17 ` [Qemu-devel] " Anthony Liguori
2010-11-30 14:27 ` Avi Kivity
2010-11-30 14:27 ` [Qemu-devel] " Avi Kivity
2010-11-30 14:50 ` Anthony Liguori
2010-11-30 14:50 ` [Qemu-devel] " Anthony Liguori
2010-12-01 12:40 ` Avi Kivity
2010-12-01 12:40 ` [Qemu-devel] " Avi Kivity
2010-11-30 17:43 ` Juan Quintela
2010-11-30 17:43 ` [Qemu-devel] " Juan Quintela
2010-12-01 1:20 ` Takuya Yoshikawa
2010-12-01 1:20 ` [Qemu-devel] " Takuya Yoshikawa
2010-12-01 1:52 ` Juan Quintela
2010-12-01 1:52 ` [Qemu-devel] " Juan Quintela
2010-12-01 2:22 ` Takuya Yoshikawa
2010-12-01 2:22 ` [Qemu-devel] " Takuya Yoshikawa
2010-12-01 12:35 ` Avi Kivity
2010-12-01 12:35 ` [Qemu-devel] " Avi Kivity
2010-12-01 13:45 ` Juan Quintela
2010-12-01 13:45 ` [Qemu-devel] " Juan Quintela
2010-12-02 1:31 ` Takuya Yoshikawa
2010-12-02 1:31 ` [Qemu-devel] " Takuya Yoshikawa
2010-12-02 8:37 ` Avi Kivity
2010-12-02 8:37 ` [Qemu-devel] " Avi Kivity
2010-11-30 14:12 ` Paolo Bonzini
2010-11-30 14:12 ` [Qemu-devel] " Paolo Bonzini
2010-11-30 15:00 ` Anthony Liguori
2010-11-30 15:00 ` [Qemu-devel] " Anthony Liguori
2010-11-30 17:59 ` Juan Quintela
2010-11-30 17:59 ` [Qemu-devel] " Juan Quintela
2010-11-23 23:03 ` [Qemu-devel] [PATCH 10/10] Maintaing number of dirty pages Juan Quintela
[not found] ` <4CF45DE0.8020701@codemonkey.ws>
2010-11-30 14:46 ` Juan Quintela [this message]
2010-12-01 14:46 ` [Qemu-devel] " Avi Kivity
2010-12-01 15:51 ` Juan Quintela
2010-12-01 15:55 ` Anthony Liguori
2010-12-01 16:25 ` Juan Quintela
2010-12-01 16:33 ` Anthony Liguori
2010-12-01 16:43 ` Avi Kivity
2010-12-01 16:49 ` Anthony Liguori
2010-12-01 16:52 ` Avi Kivity
2010-12-01 16:56 ` Anthony Liguori
2010-12-01 17:01 ` Avi Kivity
2010-12-01 17:05 ` Anthony Liguori
2010-12-01 18:51 ` Juan Quintela
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=m3r5e2vpgf.fsf@trasno.mitica \
--to=quintela@redhat.com \
--cc=anthony@codemonkey.ws \
--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.