[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/8] Don't abort on memory allocation error
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PATCH 7/8] Don't abort on memory allocation error |
Date: |
Tue, 4 Feb 2014 16:19:44 +0100 |
From: Orit Wasserman <address@hidden>
It is better to fail migration in case of failure to
allocate new cache item
Signed-off-by: Orit Wasserman <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
arch_init.c | 4 +++-
include/migration/page_cache.h | 4 +++-
page_cache.c | 16 +++++++++++-----
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 806d096..0bfbc5a 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -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;
diff --git a/include/migration/page_cache.h b/include/migration/page_cache.h
index 87894fe..d156f0d 100644
--- a/include/migration/page_cache.h
+++ b/include/migration/page_cache.h
@@ -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
diff --git a/page_cache.c b/page_cache.c
index 62a53f8..69e8329 100644
--- a/page_cache.c
+++ b/page_cache.c
@@ -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;
@@ -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) {
cache->num_items++;
+ it->it_data = g_try_malloc(cache->page_size);
+ if (!it->it_data) {
+ DPRINTF("Error allocating page\n");
+ return -1;
+ }
}
- 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)
--
1.8.5.3
- [Qemu-devel] [PULL 0/8] migration queue, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 8/8] exec: fix ram_list dirty map optimization, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 4/8] migration:fix free XBZRLE decoded_buf wrong, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 6/8] Don't abort on out of memory when creating page cache, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 7/8] Don't abort on memory allocation error,
Juan Quintela <=
- [Qemu-devel] [PATCH 5/8] XBZRLE cache size should not be larger than guest memory size, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 3/8] Add check for cache size smaller than page size, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 1/8] vmstate: Make VMSTATE_STRUCT_POINTER take type, not ptr-to-type, Juan Quintela, 2014/02/04
- [Qemu-devel] [PATCH 2/8] Set xbzrle buffers to NULL after freeing them to avoid double free errors, Juan Quintela, 2014/02/04
- Re: [Qemu-devel] [PULL 0/8] migration queue, Juan Quintela, 2014/02/04