qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 1/1] Fix large memory chunks allocation with tcg


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH 1/1] Fix large memory chunks allocation with tcg_malloc.
Date: Sat, 17 Mar 2012 16:19:01 +0000

Thanks, applied.

On Fri, Mar 2, 2012 at 09:22, Kirill Batuzov <address@hidden> wrote:
> An attempt to allocate a large memory chunk after a small one resulted in
> circular links in list of pools.  It caused the same memory being
> allocated twice for different arrays.
>
> Now pools for large memory chunks are kept in separate list and are
> freed during pool reset because current allocator can not reuse them.
>
> Signed-off-by: Kirill Batuzov <address@hidden>
> ---
>  tcg/tcg.c |   14 +++++++++-----
>  tcg/tcg.h |    2 +-
>  2 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 351a0a3..7db8340 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -173,11 +173,9 @@ void *tcg_malloc_internal(TCGContext *s, int size)
>         /* big malloc: insert a new pool (XXX: could optimize) */
>         p = g_malloc(sizeof(TCGPool) + size);
>         p->size = size;
> -        if (s->pool_current)
> -            s->pool_current->next = p;
> -        else
> -            s->pool_first = p;
> -        p->next = s->pool_current;
> +        p->next = s->pool_first_large;
> +        s->pool_first_large = p;
> +        return p->data;
>     } else {
>         p = s->pool_current;
>         if (!p) {
> @@ -208,6 +206,12 @@ void *tcg_malloc_internal(TCGContext *s, int size)
>
>  void tcg_pool_reset(TCGContext *s)
>  {
> +    TCGPool *p, *t;
> +    for (p = s->pool_first_large; p; p = t) {
> +        t = p->next;
> +        g_free(p);
> +    }
> +    s->pool_first_large = NULL;
>     s->pool_cur = s->pool_end = NULL;
>     s->pool_current = NULL;
>  }
> diff --git a/tcg/tcg.h b/tcg/tcg.h
> index 5c28239..48d3f17 100644
> --- a/tcg/tcg.h
> +++ b/tcg/tcg.h
> @@ -337,7 +337,7 @@ typedef struct TCGContext TCGContext;
>
>  struct TCGContext {
>     uint8_t *pool_cur, *pool_end;
> -    TCGPool *pool_first, *pool_current;
> +    TCGPool *pool_first, *pool_current, *pool_first_large;
>     TCGLabel *labels;
>     int nb_labels;
>     TCGTemp *temps; /* globals first, temps after */
> --
> 1.7.5.4
>
>



reply via email to

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