qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 6/6] Don't abort on memory allocation error


From: Orit Wasserman
Subject: Re: [Qemu-devel] [PATCH 6/6] Don't abort on memory allocation error
Date: Thu, 30 Jan 2014 19:55:07 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0

On 01/30/2014 06:08 PM, Dr. David Alan Gilbert wrote:
* Orit Wasserman (address@hidden) wrote:
It is better to fail migration in case of failure to
allocate new cache item

Does this actually fail migration or just drop back to sending an uncompressed
page? (I think the latter, and that's an even better result).


It fails the migration, if the users wants to disable compression it can do it
and start migration again.

Signed-off-by: Orit Wasserman <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 feels like it would have been correct to do the num_items++ after the
allocation test (although since the num_items doesn't seem to be used
anywhere that's not a show-stopper, but worth fixing sometime).


You are correct, I will move it after allocation.

Orit
      }

-    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.3.1

Reviewed-by: Dr. David Alan Gilbert <address@hidden>

Dave
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK





reply via email to

[Prev in Thread] Current Thread [Next in Thread]