Commit ee0b44aa authored by Peter Lieven's avatar Peter Lieven Committed by Juan Quintela
Browse files

page_cache: dup memory on insert



The page cache frees all data on finish, on resize and
if there is collision on insert. So it should be the caches
responsibility to dup the data that is stored in the cache.

Signed-off-by: default avatarPeter Lieven <pl@kamp.de>
Signed-off-by: default avatarOrit Wasserman <owasserm@redhat.com>

Reviewed-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
parent 32a1c08b
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -293,8 +293,7 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data,

    if (!cache_is_cached(XBZRLE.cache, current_addr)) {
        if (!last_stage) {
            cache_insert(XBZRLE.cache, current_addr,
                         g_memdup(current_data, TARGET_PAGE_SIZE));
            cache_insert(XBZRLE.cache, current_addr, current_data);
        }
        acct_info.xbzrle_cache_miss++;
        return -1;
+2 −1
Original line number Diff line number Diff line
@@ -57,7 +57,8 @@ bool cache_is_cached(const PageCache *cache, uint64_t addr);
uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);

/**
 * cache_insert: insert the page into the cache. the previous value will be overwritten
 * cache_insert: insert the page into the cache. the page cache
 * will dup the data on insert. the previous value will be overwritten
 *
 * @cache pointer to the PageCache struct
 * @addr: page address
+1 −1
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata)
        cache->num_items++;
    }

    it->it_data = pdata;
    it->it_data = g_memdup(pdata, cache->page_size);
    it->it_age = ++cache->max_item_age;
    it->it_addr = addr;
}