qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] exec.c: fix dirty bitmap reallocation


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH] exec.c: fix dirty bitmap reallocation
Date: Sat, 11 Aug 2012 14:48:17 +0000

Thanks, applied.

On Fri, Aug 10, 2012 at 2:45 PM, Igor Mitsyanko <address@hidden> wrote:
> For each newly created RAM block, dirty bitmap is reallocated with g_realloc, 
> which doesn't
> make any promises on initial content of new extra data in returned buffer. In 
> theory,
> we initialize this new data with cpu_physical_memory_set_dirty_range() call. 
> The
> problem is, cpu_physical_memory_set_dirty_range() has a side effect of 
> incrementing
> ram_list.dirty_pages variable, but only for pages which are not already 
> dirty. And
> page "cleanliness" is determined using the same not yet uninitialized dirty 
> bitmap
> we've just reallocated. This results in inconsistency between real dirty page 
> number
> and value in ram_list.dirty_pages variable, which in turn could (and will) 
> result
> in errors during VM migration.
> Zero initialize new dirty bitmap bytes to fix this problem.
>
> Signed-off-by: Igor Mitsyanko <address@hidden>
> ---
>  exec.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/exec.c b/exec.c
> index a42a0b5..929db5c 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -2550,6 +2550,8 @@ 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),
> +           0, size >> TARGET_PAGE_BITS);
>      cpu_physical_memory_set_dirty_range(new_block->offset, size, 0xff);
>
>      if (kvm_enabled())
> --
> 1.7.5.4
>



reply via email to

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