Patchwork [1/1] Fix large memory chunks allocation with tcg_malloc.

login
register
mail settings
Submitter Kirill Batuzov
Date March 2, 2012, 9:22 a.m.
Message ID <1330680137-6601-2-git-send-email-batuzovk@ispras.ru>
Download mbox | patch
Permalink /patch/144164/
State New
Headers show

Comments

Kirill Batuzov - March 2, 2012, 9:22 a.m.
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 <batuzovk@ispras.ru>
---
 tcg/tcg.c |   14 +++++++++-----
 tcg/tcg.h |    2 +-
 2 files changed, 10 insertions(+), 6 deletions(-)
Blue Swirl - March 17, 2012, 4:19 p.m.
Thanks, applied.

On Fri, Mar 2, 2012 at 09:22, Kirill Batuzov <batuzovk@ispras.ru> 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 <batuzovk@ispras.ru>
> ---
>  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
>
>

Patch

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 */