qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]