Orit Wasserman <owass...@redhat.com> wrote:
> On 06/22/2012 04:46 PM, Juan Quintela wrote:
>> Always use accessors to read/set the dirty bitmap.
>> 
>> Signed-off-by: Juan Quintela <quint...@redhat.com>
>> -static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr)
>> +/* read dirty bit (return 0 or 1) */
>> +static inline int cpu_physical_memory_is_dirty(ram_addr_t addr)
>>  {
>> -    return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS];
>> +    return cpu_physical_memory_get_dirty_flags(addr) == 0xff;
>>  }
> Juan,
> you changed the order of the functions , can your restore the order as it was.

There is reason after madness.  Now cpu_physical_memory_is_dirty calls
cpu_physical_memory_get_dirty_flags().  After this patch, only 4
functions touch the bitmap directly.
>> index a68b65c..dd4833d 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -2565,8 +2565,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, 
>> void *host,
>> 
>>      ram_list.phys_dirty = g_realloc(ram_list.phys_dirty,
>>                                         last_ram_offset() >> 
>> TARGET_PAGE_BITS);
>> -    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
>> -           0xff, size >> TARGET_PAGE_BITS);
>> +    cpu_physical_memory_set_dirty_range(new_block->offset, size, 0xff);
>
> This will be much slower than memset , do we use it much ?

No, we only use it each time that we add another region of RAM (i.e. a
very rare event).

Next step is to change the bitmap to three bitmaps of 1 bit per page.
That way, we only need to look at that 4 functions for changing it.

On an un-related note, I can't see how migration + TCG can work at the
moment.  TCG uses "*is_dirty()" to see if the page has changed, but if
we have migrated that page, is_dirty is going to return _not-dirty_.
AKA as bad as it can be :-(

Later, Juan.)

Reply via email to