Don't abort on out of memory when creating page cache
Signed-off-by: Orit Wasserman <owasserm@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
a5615b14a6
commit
a17b2fd358
18
arch_init.c
18
arch_init.c
|
@ -664,8 +664,22 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
||||||
DPRINTF("Error creating cache\n");
|
DPRINTF("Error creating cache\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
XBZRLE.encoded_buf = g_malloc0(TARGET_PAGE_SIZE);
|
|
||||||
XBZRLE.current_buf = g_malloc(TARGET_PAGE_SIZE);
|
/* We prefer not to abort if there is no memory */
|
||||||
|
XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE);
|
||||||
|
if (!XBZRLE.encoded_buf) {
|
||||||
|
DPRINTF("Error allocating encoded_buf\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
XBZRLE.current_buf = g_try_malloc(TARGET_PAGE_SIZE);
|
||||||
|
if (!XBZRLE.current_buf) {
|
||||||
|
DPRINTF("Error allocating current_buf\n");
|
||||||
|
g_free(XBZRLE.encoded_buf);
|
||||||
|
XBZRLE.encoded_buf = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
acct_clear();
|
acct_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
18
page_cache.c
18
page_cache.c
|
@ -60,8 +60,12 @@ PageCache *cache_init(int64_t num_pages, unsigned int page_size)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache = g_malloc(sizeof(*cache));
|
/* We prefer not to abort if there is no memory */
|
||||||
|
cache = g_try_malloc(sizeof(*cache));
|
||||||
|
if (!cache) {
|
||||||
|
DPRINTF("Failed to allocate cache\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
/* round down to the nearest power of 2 */
|
/* round down to the nearest power of 2 */
|
||||||
if (!is_power_of_2(num_pages)) {
|
if (!is_power_of_2(num_pages)) {
|
||||||
num_pages = pow2floor(num_pages);
|
num_pages = pow2floor(num_pages);
|
||||||
|
@ -74,8 +78,14 @@ PageCache *cache_init(int64_t num_pages, unsigned int page_size)
|
||||||
|
|
||||||
DPRINTF("Setting cache buckets to %" PRId64 "\n", cache->max_num_items);
|
DPRINTF("Setting cache buckets to %" PRId64 "\n", cache->max_num_items);
|
||||||
|
|
||||||
cache->page_cache = g_malloc((cache->max_num_items) *
|
/* We prefer not to abort if there is no memory */
|
||||||
sizeof(*cache->page_cache));
|
cache->page_cache = g_try_malloc((cache->max_num_items) *
|
||||||
|
sizeof(*cache->page_cache));
|
||||||
|
if (!cache->page_cache) {
|
||||||
|
DPRINTF("Failed to allocate cache->page_cache\n");
|
||||||
|
g_free(cache);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < cache->max_num_items; i++) {
|
for (i = 0; i < cache->max_num_items; i++) {
|
||||||
cache->page_cache[i].it_data = NULL;
|
cache->page_cache[i].it_data = NULL;
|
||||||
|
|
Loading…
Reference in a new issue