All of lore.kernel.org
 help / color / mirror / Atom feed
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Bob Liu <lliubbo@gmail.com>
Cc: xen-devel@lists.xenproject.org, keir@xen.org,
	ian.campbell@citrix.com, JBeulich@suse.com
Subject: Re: [PATCH 13/16] tmem: cleanup: __tmem_alloc_page: drop unneed parameters
Date: Fri, 22 Nov 2013 13:17:53 -0500	[thread overview]
Message-ID: <20131122181753.GH8120@phenom.dumpdata.com> (raw)
In-Reply-To: <1384937185-24749-13-git-send-email-bob.liu@oracle.com>

On Wed, Nov 20, 2013 at 04:46:22PM +0800, Bob Liu wrote:
> The two parameters of __tmem_alloc_page() can be reduced.

That is dangerous. The last one (no_heap) was added to guard
against recursion. Check how tmem_alloc_page_thispool calls
alloc_domheap_pages, whcih calls alloc_heap_pages which
can call tmem_relinquish_pages, which can .. well, you will
get the idea.

> tmem_called_from_tmem() was also dropped by this patch.
> 
> Signed-off-by: Bob Liu <bob.liu@oracle.com>
> ---
>  xen/common/tmem.c          |   13 +++++--------
>  xen/include/xen/tmem_xen.h |   11 +++++------
>  2 files changed, 10 insertions(+), 14 deletions(-)
> 
> diff --git a/xen/common/tmem.c b/xen/common/tmem.c
> index ee61899..bf0fa1b 100644
> --- a/xen/common/tmem.c
> +++ b/xen/common/tmem.c
> @@ -245,7 +245,7 @@ static struct page_info *tmem_alloc_page(struct tmem_pool *pool)
>      if ( pool != NULL && is_persistent(pool) )
>          pfp = __tmem_alloc_page_thispool(pool->client->domain);
>      else
> -        pfp = __tmem_alloc_page(pool,0);
> +        pfp = __tmem_alloc_page();
>      return pfp;
>  }
>  
> @@ -263,9 +263,8 @@ static noinline void *tmem_mempool_page_get(unsigned long size)
>      struct page_info *pi;
>  
>      ASSERT(size == PAGE_SIZE);
> -    if ( (pi = __tmem_alloc_page(NULL,0)) == NULL )
> +    if ( (pi = __tmem_alloc_page()) == NULL )
>          return NULL;
> -    ASSERT(IS_VALID_PAGE(pi));
>      return page_to_virt(pi);
>  }
>  
> @@ -2450,7 +2449,6 @@ void tmem_freeze_all(unsigned char key)
>  void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
>  {
>      struct page_info *pfp;
> -    unsigned long evicts_per_relinq = 0;
>      int max_evictions = 10;
>  
>      if (!tmem_enabled() || !tmem_freeable_pages())
> @@ -2464,14 +2462,13 @@ void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
>          return NULL;
>      }
>  
> -    if ( tmem_called_from_tmem(memflags) )
> +    if ( memflags & MEMF_tmem )
>          read_lock(&tmem_rwlock);
>  
> -    while ( (pfp = __tmem_alloc_page(NULL,1)) == NULL )
> +    while ( (pfp = tmem_page_list_get()) == NULL )

No no. That could lead to bad recursion. You need to pass '1' somehow.


>      {
>          if ( (max_evictions-- <= 0) || !tmem_evict())
>              break;
> -        evicts_per_relinq++;


? Should this be a seperate patch?

>      }
>      if ( pfp != NULL )
>      {
> @@ -2479,7 +2476,7 @@ void *tmem_relinquish_pages(unsigned int order, unsigned int memflags)
>              scrub_one_page(pfp);
>      }
>  
> -    if ( tmem_called_from_tmem(memflags) )
> +    if ( memflags & MEMF_tmem )

Perhaps a comment too? /* Called recursively from within tmem. */

>          read_unlock(&tmem_rwlock);
>  
>      return pfp;
> diff --git a/xen/include/xen/tmem_xen.h b/xen/include/xen/tmem_xen.h
> index 7468c28..c4b9f5a 100644
> --- a/xen/include/xen/tmem_xen.h
> +++ b/xen/include/xen/tmem_xen.h
> @@ -144,15 +144,16 @@ static inline void __tmem_free_page_thispool(struct page_info *pi)
>  /*
>   * Memory allocation for ephemeral (non-persistent) data
>   */
> -static inline struct page_info *__tmem_alloc_page(void *pool, int no_heap)
> +static inline struct page_info *__tmem_alloc_page(void)
>  {
>      struct page_info *pi = tmem_page_list_get();
>  
> -    if ( pi == NULL && !no_heap )
> +    if ( pi == NULL)
>          pi = alloc_domheap_pages(0,0,MEMF_tmem);
> -    ASSERT((pi == NULL) || IS_VALID_PAGE(pi));
> -    if ( pi != NULL && !no_heap )
> +
> +    if ( pi )
>          atomic_inc(&freeable_page_count);
> +    ASSERT((pi == NULL) || IS_VALID_PAGE(pi));
>      return pi;
>  }
>  
> @@ -168,8 +169,6 @@ static inline unsigned long tmem_free_mb(void)
>      return (tmem_page_list_pages + total_free_pages()) >> (20 - PAGE_SHIFT);
>  }
>  
> -#define tmem_called_from_tmem(_memflags) (_memflags & MEMF_tmem)
> -
>  /*  "Client" (==domain) abstraction */
>  
>  struct client;
> -- 
> 1.7.10.4
> 

  reply	other threads:[~2013-11-22 18:18 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-20  8:46 [PATCH 01/16] tmem: cleanup: drop some debug code Bob Liu
2013-11-20  8:46 ` [PATCH 02/16] tmem: cleanup: drop useless function 'tmem_copy_page' Bob Liu
2013-11-20  8:46 ` [PATCH 03/16] tmem: cleanup: rm unused tmem_op Bob Liu
2013-11-22 17:38   ` Konrad Rzeszutek Wilk
2013-11-25  9:43     ` Jan Beulich
2013-11-25  9:52       ` Ian Campbell
2013-11-25  9:58         ` Jan Beulich
2013-11-25 16:37         ` Konrad Rzeszutek Wilk
2013-11-25 16:40           ` Ian Campbell
2013-11-25 17:09             ` Konrad Rzeszutek Wilk
2013-11-25 17:12               ` Ian Campbell
2013-11-25 19:56                 ` Konrad Rzeszutek Wilk
2013-11-26  8:56                   ` Bob Liu
2013-11-20  8:46 ` [PATCH 04/16] tmem: cleanup: rm unneeded parameters from put path Bob Liu
2013-11-22 17:54   ` Konrad Rzeszutek Wilk
2013-11-26  8:22     ` Bob Liu
2013-11-20  8:46 ` [PATCH 05/16] tmem: cleanup: rm unneeded parameters from get path Bob Liu
2013-11-22 17:55   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 06/16] tmem: cleanup: reorg do_tmem_put() Bob Liu
2013-11-22 18:04   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 07/16] tmem: drop unneeded is_ephemeral() and is_private() Bob Liu
2013-11-20  8:46 ` [PATCH 08/16] tmem: cleanup: rm useless EXPORT/FORWARD define Bob Liu
2013-11-22 18:05   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 09/16] tmem: cleanup: drop tmemc_list() temporary Bob Liu
2013-11-22 18:07   ` Konrad Rzeszutek Wilk
2013-11-26  8:28     ` Bob Liu
2013-11-22 21:00   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 10/16] tmem: cleanup: drop runtime statistics Bob Liu
2013-11-22 18:08   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 11/16] tmem: cleanup: drop tmem_lock_all Bob Liu
2013-11-20  8:46 ` [PATCH 12/16] tmem: cleanup: refactor the alloc/free path Bob Liu
2013-11-20  8:46 ` [PATCH 13/16] tmem: cleanup: __tmem_alloc_page: drop unneed parameters Bob Liu
2013-11-22 18:17   ` Konrad Rzeszutek Wilk [this message]
2013-11-26  8:41     ` Bob Liu
2013-11-26 17:38       ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 14/16] tmem: cleanup: drop useless functions from head file Bob Liu
2013-11-27 14:38   ` Andrew Cooper
2013-11-27 14:52     ` Konrad Rzeszutek Wilk
2013-11-27 14:59       ` Andrew Cooper
2013-11-27 15:55         ` Jan Beulich
2013-11-20  8:46 ` [PATCH 15/16] tmem: refator function tmem_ensure_avail_pages() Bob Liu
2013-11-22 18:22   ` Konrad Rzeszutek Wilk
2013-11-20  8:46 ` [PATCH 16/16] tmem: cleanup: rename tmem_relinquish_npages() Bob Liu
2013-11-20  9:08 ` [PATCH 01/16] tmem: cleanup: drop some debug code Jan Beulich
2013-11-20  9:19   ` Bob Liu
2013-11-20  9:25     ` Jan Beulich
2013-11-20 13:51       ` Konrad Rzeszutek Wilk
2013-11-20 14:21         ` Jan Beulich
2013-11-20 18:46           ` Konrad Rzeszutek Wilk

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=20131122181753.GH8120@phenom.dumpdata.com \
    --to=konrad.wilk@oracle.com \
    --cc=JBeulich@suse.com \
    --cc=ian.campbell@citrix.com \
    --cc=keir@xen.org \
    --cc=lliubbo@gmail.com \
    --cc=xen-devel@lists.xenproject.org \
    /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.