[Top][All Lists]
[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
>
>