summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Lieven <pl@dlhnet.de>2013-02-25 19:12:04 +0200
committerJuan Quintela <quintela@redhat.com>2013-03-11 13:32:03 +0100
commitee0b44aa9d9450e873a761ca2030b2fa3ec52eb0 (patch)
tree1f8f203f961610e5b5a1d23e8985df071e847d1b
parent32a1c08b60a8ac0e63b54a5793a26b5e32b36618 (diff)
downloadqemu-ee0b44aa9d9450e873a761ca2030b2fa3ec52eb0.zip
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>
-rw-r--r--arch_init.c3
-rw-r--r--include/migration/page_cache.h3
-rw-r--r--page_cache.c2
3 files changed, 4 insertions, 4 deletions
diff --git a/arch_init.c b/arch_init.c
index 6089c53386..98e2bc6f55 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -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;
diff --git a/include/migration/page_cache.h b/include/migration/page_cache.h
index 3839ac7726..87894fea9f 100644
--- a/include/migration/page_cache.h
+++ b/include/migration/page_cache.h
@@ -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
diff --git a/page_cache.c b/page_cache.c
index 809dadc7eb..938a79c9ea 100644
--- a/page_cache.c
+++ b/page_cache.c
@@ -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;
}