X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=page_cache.c;h=a05db643ccd711b3cccaf68a6d042f095a6fa247;hb=0478f37ce258438d74164dd182b0ae125f174ec6;hp=ba5640bd73120314f81f2014de5ffb8247cdb0cc;hpb=caf71f86a3de97394bcc5b06549012b7dc65fe60;p=qemu.git diff --git a/page_cache.c b/page_cache.c index ba5640bd7..a05db643c 100644 --- a/page_cache.c +++ b/page_cache.c @@ -21,7 +21,6 @@ #include #include #include -#include #include "qemu-common.h" #include "migration/page_cache.h" @@ -152,11 +151,14 @@ void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata) /* actual update of entry */ it = cache_get_by_addr(cache, addr); + /* free old cached data if any */ + g_free(it->it_data); + if (!it->it_data) { 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; } @@ -192,22 +194,22 @@ int64_t cache_resize(PageCache *cache, int64_t new_num_pages) if (old_it->it_addr != -1) { /* check for collision, if there is, keep MRU page */ new_it = cache_get_by_addr(new_cache, old_it->it_addr); - if (new_it->it_data) { + if (new_it->it_data && new_it->it_age >= old_it->it_age) { /* keep the MRU page */ - if (new_it->it_age >= old_it->it_age) { - g_free(old_it->it_data); - } else { - g_free(new_it->it_data); - new_it->it_data = old_it->it_data; - new_it->it_age = old_it->it_age; - new_it->it_addr = old_it->it_addr; - } + g_free(old_it->it_data); } else { - cache_insert(new_cache, old_it->it_addr, old_it->it_data); + if (!new_it->it_data) { + new_cache->num_items++; + } + g_free(new_it->it_data); + new_it->it_data = old_it->it_data; + new_it->it_age = old_it->it_age; + new_it->it_addr = old_it->it_addr; } } } + g_free(cache->page_cache); cache->page_cache = new_cache->page_cache; cache->max_num_items = new_cache->max_num_items; cache->num_items = new_cache->num_items;