All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Orit Wasserman <owasserm@redhat.com>
Cc: peter.maydell@linaro.org, qemu-devel@nongnu.org,
	anthony@codemonkey.ws, quintela@redhat.com
Subject: Re: [Qemu-devel] [PATCH 6/6] Don't abort on memory allocation error
Date: Thu, 30 Jan 2014 16:08:32 +0000	[thread overview]
Message-ID: <20140130160831.GC2655@work-vm> (raw)
In-Reply-To: <1391066055-17024-7-git-send-email-owasserm@redhat.com>

* Orit Wasserman (owasserm@redhat.com) 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).

> Signed-off-by: Orit Wasserman <owasserm@redhat.com>
> ---
>  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).

>      }
>  
> -    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 <dgilbert@redhat.com>

Dave
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2014-01-30 16:08 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-30  7:14 [Qemu-devel] [PATCH 0/6] XBZRLE Fixes Orit Wasserman
2014-01-30  7:14 ` [Qemu-devel] [PATCH 1/6] Set xbzrle buffers to NULL after freeing them to avoid double free errors Orit Wasserman
2014-01-30 18:25   ` Eric Blake
2014-01-30  7:14 ` [Qemu-devel] [PATCH 2/6] Add check for cache size smaller than page size Orit Wasserman
2014-01-30  7:14 ` [Qemu-devel] [PATCH 3/6] migration:fix free XBZRLE decoded_buf wrong Orit Wasserman
2014-02-04 15:01   ` Juan Quintela
2014-01-30  7:14 ` [Qemu-devel] [PATCH 4/6] XBZRLE cache size should not be larger than guest memory size Orit Wasserman
2014-02-04 15:01   ` Juan Quintela
2014-01-30  7:14 ` [Qemu-devel] [PATCH 5/6] Don't abort on out of memory when creating page cache Orit Wasserman
2014-01-30 15:48   ` Dr. David Alan Gilbert
2014-01-30 17:51     ` Orit Wasserman
2014-01-30  7:14 ` [Qemu-devel] [PATCH 6/6] Don't abort on memory allocation error Orit Wasserman
2014-01-30 16:08   ` Dr. David Alan Gilbert [this message]
2014-01-30 17:55     ` Orit Wasserman
2014-02-04 15:00   ` Juan Quintela

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140130160831.GC2655@work-vm \
    --to=dgilbert@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=owasserm@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.