|
|
9ae3a8 |
From f58c7c6f3574f28df445c67a378aec5a33285374 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
From: Orit Wasserman <owasserm@redhat.com>
|
|
|
9ae3a8 |
Date: Tue, 11 Feb 2014 15:32:36 +0100
|
|
|
9ae3a8 |
Subject: [PATCH 15/28] Don't abort on out of memory when creating page cache
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Orit Wasserman <owasserm@redhat.com>
|
|
|
9ae3a8 |
Message-id: <1392132757-18587-3-git-send-email-owasserm@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 57210
|
|
|
9ae3a8 |
O-Subject: [RHEL7 qemu-kvm PATCH 2/3] Don't abort on out of memory when creating page cache
|
|
|
9ae3a8 |
Bugzilla: 1047448
|
|
|
9ae3a8 |
RH-Acked-by: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
|
|
|
9ae3a8 |
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit a17b2fd3580d1da96e806c8b58e61255e8c57577)
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
arch_init.c | 18 ++++++++++++++++--
|
|
|
9ae3a8 |
page_cache.c | 18 ++++++++++++++----
|
|
|
9ae3a8 |
2 files changed, 30 insertions(+), 6 deletions(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
arch_init.c | 18 ++++++++++++++++--
|
|
|
9ae3a8 |
page_cache.c | 18 ++++++++++++++----
|
|
|
9ae3a8 |
2 files changed, 30 insertions(+), 6 deletions(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/arch_init.c b/arch_init.c
|
|
|
9ae3a8 |
index c3207bf..fc0f569 100644
|
|
|
9ae3a8 |
--- a/arch_init.c
|
|
|
9ae3a8 |
+++ b/arch_init.c
|
|
|
9ae3a8 |
@@ -659,8 +659,22 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|
|
9ae3a8 |
DPRINTF("Error creating cache\n");
|
|
|
9ae3a8 |
return -1;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
- XBZRLE.encoded_buf = g_malloc0(TARGET_PAGE_SIZE);
|
|
|
9ae3a8 |
- XBZRLE.current_buf = g_malloc(TARGET_PAGE_SIZE);
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+ /* We prefer not to abort if there is no memory */
|
|
|
9ae3a8 |
+ XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE);
|
|
|
9ae3a8 |
+ if (!XBZRLE.encoded_buf) {
|
|
|
9ae3a8 |
+ DPRINTF("Error allocating encoded_buf\n");
|
|
|
9ae3a8 |
+ return -1;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+ XBZRLE.current_buf = g_try_malloc(TARGET_PAGE_SIZE);
|
|
|
9ae3a8 |
+ if (!XBZRLE.current_buf) {
|
|
|
9ae3a8 |
+ DPRINTF("Error allocating current_buf\n");
|
|
|
9ae3a8 |
+ g_free(XBZRLE.encoded_buf);
|
|
|
9ae3a8 |
+ XBZRLE.encoded_buf = NULL;
|
|
|
9ae3a8 |
+ return -1;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
acct_clear();
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/page_cache.c b/page_cache.c
|
|
|
9ae3a8 |
index 938a79c..2920123 100644
|
|
|
9ae3a8 |
--- a/page_cache.c
|
|
|
9ae3a8 |
+++ b/page_cache.c
|
|
|
9ae3a8 |
@@ -61,8 +61,12 @@ PageCache *cache_init(int64_t num_pages, unsigned int page_size)
|
|
|
9ae3a8 |
return NULL;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- cache = g_malloc(sizeof(*cache));
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
+ /* We prefer not to abort if there is no memory */
|
|
|
9ae3a8 |
+ cache = g_try_malloc(sizeof(*cache));
|
|
|
9ae3a8 |
+ if (!cache) {
|
|
|
9ae3a8 |
+ DPRINTF("Failed to allocate cache\n");
|
|
|
9ae3a8 |
+ return NULL;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
/* round down to the nearest power of 2 */
|
|
|
9ae3a8 |
if (!is_power_of_2(num_pages)) {
|
|
|
9ae3a8 |
num_pages = pow2floor(num_pages);
|
|
|
9ae3a8 |
@@ -75,8 +79,14 @@ PageCache *cache_init(int64_t num_pages, unsigned int page_size)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
DPRINTF("Setting cache buckets to %" PRId64 "\n", cache->max_num_items);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- cache->page_cache = g_malloc((cache->max_num_items) *
|
|
|
9ae3a8 |
- sizeof(*cache->page_cache));
|
|
|
9ae3a8 |
+ /* We prefer not to abort if there is no memory */
|
|
|
9ae3a8 |
+ cache->page_cache = g_try_malloc((cache->max_num_items) *
|
|
|
9ae3a8 |
+ sizeof(*cache->page_cache));
|
|
|
9ae3a8 |
+ if (!cache->page_cache) {
|
|
|
9ae3a8 |
+ DPRINTF("Failed to allocate cache->page_cache\n");
|
|
|
9ae3a8 |
+ g_free(cache);
|
|
|
9ae3a8 |
+ return NULL;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
for (i = 0; i < cache->max_num_items; i++) {
|
|
|
9ae3a8 |
cache->page_cache[i].it_data = NULL;
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.7.1
|
|
|
9ae3a8 |
|