Skip to content

Commit

Permalink
Don't abort on memory allocation error
Browse files Browse the repository at this point in the history
It is better to fail migration in case of failure to
allocate new cache item

Signed-off-by: Orit Wasserman <[email protected]>
Reviewed-by: Dr. David Alan Gilbert <[email protected]>
Signed-off-by: Juan Quintela <[email protected]>
  • Loading branch information
oritwas authored and Juan Quintela committed Feb 4, 2014
1 parent a17b2fd commit 89db998
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
4 changes: 3 additions & 1 deletion arch_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,9 @@ 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, current_data);
if (cache_insert(XBZRLE.cache, current_addr, current_data) == -1) {
return -1;
}
}
acct_info.xbzrle_cache_miss++;
return -1;
Expand Down
4 changes: 3 additions & 1 deletion include/migration/page_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);
* cache_insert: insert the page into the cache. the page cache
* will dup the data on insert. the previous value will be overwritten
*
* Returns -1 on error
*
* @cache pointer to the PageCache struct
* @addr: page address
* @pdata: pointer to the page
*/
void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata);
int cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata);

/**
* cache_resize: resize the page cache. In case of size reduction the extra
Expand Down
16 changes: 11 additions & 5 deletions page_cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ uint8_t *get_cached_data(const PageCache *cache, uint64_t addr)
return cache_get_by_addr(cache, addr)->it_data;
}

void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata)
int cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata)
{

CacheItem *it = NULL;
Expand All @@ -161,16 +161,22 @@ 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);

/* allocate page */
if (!it->it_data) {
it->it_data = g_try_malloc(cache->page_size);
if (!it->it_data) {
DPRINTF("Error allocating page\n");
return -1;
}
cache->num_items++;
}

it->it_data = g_memdup(pdata, cache->page_size);
memcpy(it->it_data, pdata, cache->page_size);

it->it_age = ++cache->max_item_age;
it->it_addr = addr;

return 0;
}

int64_t cache_resize(PageCache *cache, int64_t new_num_pages)
Expand Down

0 comments on commit 89db998

Please sign in to comment.