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;