On 02/25/2013 01:42 PM, Peter Lieven wrote:
> XBZRLE encoded migration introduced a MRU page cache meachnism.
> Unfortunately, cached items where never freed on a collision.
> 
> This lead to out of memory conditions during XBZRLE migration
> if the page cache was small and there where a lot of collisions.
> 
> Signed-off-by: Peter Lieven <p...@kamp.de>
> ---
>  page_cache.c |    4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/page_cache.c b/page_cache.c
> index ba5640b..a6c3a15 100644
> --- a/page_cache.c
> +++ b/page_cache.c
> @@ -152,8 +152,10 @@ void cache_insert(PageCache *cache, uint64_t addr, 
> uint8_t *pdata)
>      /* actual update of entry */
>      it = cache_get_by_addr(cache, addr);
> 
> -    if (!it->it_data) {
> +    if (it->it_data == NULL) {
>          cache->num_items++;
> +    } else {
> +        g_free(it->it_data);

Why? we don't allocate here but just store the pointer.
It is the caller responsibility to allocate/free the data,
for example for migration it is the guest memory page.

Orit
>      }
> 
>      it->it_data = pdata;


Reply via email to