qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH, RESEND] kvm: Fix dirty tracking with large kern


From: Benjamin Herrenschmidt
Subject: Re: [Qemu-devel] [PATCH, RESEND] kvm: Fix dirty tracking with large kernel page size
Date: Mon, 02 Apr 2012 14:14:21 +1000

On Mon, 2012-04-02 at 14:04 +1000, David Gibson wrote:
> From: Ben Herrenschmidt <address@hidden>
> 
> If the kernel page size is larger than TARGET_PAGE_SIZE, which
> happens for example on ppc64 with kernels compiled for 64K pages,
> the dirty tracking doesn't work.

BTW. That was discussed ages back on the list and we basically
agreed it was the right fix for now, but for some reason the patch
then went into a black hole :-)

Cheers,
Ben.

> Cc: Avi Kivity <address@hidden>
> Cc: Marcelo Tosatti <address@hidden>
> 
> Signed-off-by: Benjamin Herrenschmidt <address@hidden>
> Signed-off-by: David Gibson <address@hidden>
> ---
>  kvm-all.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> I've sent this a number of times now, the last couple without comment.
> It fixes a real bug, please apply.
> 
> diff --git a/kvm-all.c b/kvm-all.c
> index ba2cee1..7e44429 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -354,6 +354,7 @@ static int 
> kvm_get_dirty_pages_log_range(MemoryRegionSection *section,
>      unsigned long page_number, c;
>      target_phys_addr_t addr, addr1;
>      unsigned int len = ((section->size / TARGET_PAGE_SIZE) + HOST_LONG_BITS 
> - 1) / HOST_LONG_BITS;
> +    unsigned long hpratio = getpagesize() / TARGET_PAGE_SIZE;
>  
>      /*
>       * bitmap-traveling is faster than memory-traveling (for addr...)
> @@ -365,10 +366,11 @@ static int 
> kvm_get_dirty_pages_log_range(MemoryRegionSection *section,
>              do {
>                  j = ffsl(c) - 1;
>                  c &= ~(1ul << j);
> -                page_number = i * HOST_LONG_BITS + j;
> +                page_number = (i * HOST_LONG_BITS + j) * hpratio;
>                  addr1 = page_number * TARGET_PAGE_SIZE;
>                  addr = section->offset_within_region + addr1;
> -                memory_region_set_dirty(section->mr, addr, TARGET_PAGE_SIZE);
> +                memory_region_set_dirty(section->mr, addr,
> +                                        TARGET_PAGE_SIZE * hpratio);
>              } while (c != 0);
>          }
>      }





reply via email to

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