[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 42/51] ram: Pass RAMBlock to bitmap_sync
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH 42/51] ram: Pass RAMBlock to bitmap_sync |
Date: |
Tue, 28 Mar 2017 18:12:54 +0100 |
User-agent: |
Mutt/1.8.0 (2017-02-23) |
* Juan Quintela (address@hidden) wrote:
> Yang Hongyang <address@hidden> wrote:
> > On 2017/3/24 4:45, Juan Quintela wrote:
> >> We change the meaning of start to be the offset from the beggining of
> >> the block.
> >>
> >> @@ -701,7 +701,7 @@ static void migration_bitmap_sync(RAMState *rs)
> >> qemu_mutex_lock(&rs->bitmap_mutex);
> >> rcu_read_lock();
> >> QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
> >> - migration_bitmap_sync_range(rs, block->offset,
> >> block->used_length);
> >> + migration_bitmap_sync_range(rs, block, 0, block->used_length);
> >
> > Since RAMBlock been passed to bitmap_sync, could we remove
> > param 'block->used_length' either?
>
> Hi
>
> good catch.
>
> I had that removed, and then realized that I want to synchronize parts
> of the bitmap, not the whole one. That part of the series is still not
> done.
>
> Right now we do something like (I have simplified a lot of details):
>
> while(true) {
> foreach(block)
> bitmap_sync(block)
> foreach(page)
> if(dirty(page))
> page_send(page)
> }
>
>
> If you have several terabytes of RAM that is too ineficient, because
> when we arrive to the page_send(page), it is possible that it is already
> dirty again, and we have to send it twice. So, the idea is to change to
> something like:
>
> while(true) {
> foreach(block)
> bitmap_sync(block)
> foreach(block)
> foreach(64pages)
> bitmap_sync(64pages)
> foreach(page of the 64)
> if (dirty)
> page_send(page)
Yes, although it might be best to actually do the sync in a separate thread
so that the sync is always a bit ahead of the thread doing the writing.
Dave
> }
>
>
> Where 64 is a magic number, I have to test what is the good value.
> Basically it should be a multiple of sizeof(long) and a multiple/divisor
> of host page size.
>
> Reason of changing the for to be for each block, is that then we can
> easily put bitmaps by hostpage size, instead of having to had it for
> target page size.
>
> Thanks for the review, Juan.
>
> Later, Juan.
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- Re: [Qemu-devel] [PATCH 40/51] ram: Rename qemu_target_page_bits() to qemu_target_page_size(), (continued)
Re: [Qemu-devel] [PATCH 42/51] ram: Pass RAMBlock to bitmap_sync, Dr. David Alan Gilbert, 2017/03/30
[Qemu-devel] [PATCH 45/51] ram: Use page number instead of an address for the bitmap operations, Juan Quintela, 2017/03/23
[Qemu-devel] [PATCH 43/51] ram: ram_discard_range() don't use the mis parameter, Juan Quintela, 2017/03/23
[Qemu-devel] [PATCH 46/51] ram: Remember last_page instead of last_offset, Juan Quintela, 2017/03/23