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: Peter Lieven <pl@kamp.de> Signed-off-by: Orit Wasserman <owasserm@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
32a1c08b60
commit
ee0b44aa9d
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user