[glibc/f16] - Check malloc areana atomically - Don't call reused_arena when _int_new_arena failed (#753601)

Jeffrey Law law at fedoraproject.org
Mon Nov 21 04:31:30 UTC 2011


commit 6d7f7445a99aec574cbdbf21ac12ae7ebfdff811
Author: Jeff Law <law at redhat.com>
Date:   Sun Nov 20 21:30:51 2011 -0700

      - Check malloc areana atomically
      - Don't call reused_arena when _int_new_arena failed (#753601)

 glibc-arenalock.patch |  146 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 146 insertions(+), 0 deletions(-)
---
diff --git a/glibc-arenalock.patch b/glibc-arenalock.patch
new file mode 100644
index 0000000..56ea56d
--- /dev/null
+++ b/glibc-arenalock.patch
@@ -0,0 +1,146 @@
+commit 77cdc054e02069d72dcf54a9ad7d7df3a24bcb01
+Author: Andreas Schwab <schwab at redhat.com>
+Date:   Wed Nov 9 17:14:39 2011 +0100
+
+    Check malloc arana limit atomically
+
+diff --git a/ChangeLog b/ChangeLog
+index bf09161..edd7dd8 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,14 @@
++2011-11-14  Andreas Schwab  <schwab at redhat.com>
++
++	* malloc/arena.c (arena_get2): Don't call reused_arena when
++	_int_new_arena failed.
++
++2011-11-10  Andreas Schwab  <schwab at redhat.com>
++
++	* malloc/arena.c (_int_new_arena): Don't increment narenas.
++	(reused_arena): Don't check arena limit.
++	(arena_get2): Atomically check arena limit.
++
+ 2011-10-19  Andreas Schwab  <schwab at redhat.com>
+ 
+ 	* sysdeps/x86_64/fpu/math_private.h (libc_feupdateenv): Use
+diff --git a/malloc/arena.c b/malloc/arena.c
+index 9114fd2..042cac8 100644
+--- a/malloc/arena.c
++++ b/malloc/arena.c
+@@ -747,8 +747,6 @@ _int_new_arena(size_t size)
+   main_arena.next = a;
+ 
+ #ifdef PER_THREAD
+-  ++narenas;
+-
+   (void)mutex_unlock(&list_lock);
+ #endif
+ 
+@@ -786,30 +784,6 @@ get_free_list (void)
+ static mstate
+ reused_arena (void)
+ {
+-  if (narenas <= mp_.arena_test)
+-    return NULL;
+-
+-  static int narenas_limit;
+-  if (narenas_limit == 0)
+-    {
+-      if (mp_.arena_max != 0)
+-	narenas_limit = mp_.arena_max;
+-      else
+-	{
+-	  int n  = __get_nprocs ();
+-
+-	  if (n >= 1)
+-	    narenas_limit = NARENAS_FROM_NCORES (n);
+-	  else
+-	    /* We have no information about the system.  Assume two
+-	       cores.  */
+-	    narenas_limit = NARENAS_FROM_NCORES (2);
+-	}
+-    }
+-
+-  if (narenas < narenas_limit)
+-    return NULL;
+-
+   mstate result;
+   static mstate next_to_use;
+   if (next_to_use == NULL)
+@@ -844,10 +818,41 @@ arena_get2(mstate a_tsd, size_t size)
+   mstate a;
+ 
+ #ifdef PER_THREAD
+-  if ((a = get_free_list ()) == NULL
+-      && (a = reused_arena ()) == NULL)
+-    /* Nothing immediately available, so generate a new arena.  */
+-    a = _int_new_arena(size);
++  static size_t narenas_limit;
++
++  a = get_free_list ();
++  if (a == NULL)
++    {
++      /* Nothing immediately available, so generate a new arena.  */
++      if (narenas_limit == 0)
++	{
++	  if (mp_.arena_max != 0)
++	    narenas_limit = mp_.arena_max;
++	  else
++	    {
++	      int n  = __get_nprocs ();
++
++	      if (n >= 1)
++		narenas_limit = NARENAS_FROM_NCORES (n);
++	      else
++		/* We have no information about the system.  Assume two
++		   cores.  */
++		narenas_limit = NARENAS_FROM_NCORES (2);
++	    }
++	}
++    repeat:;
++      size_t n = narenas;
++      if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0))
++	{
++	  if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n))
++	    goto repeat;
++	  a = _int_new_arena (size);
++	  if (__builtin_expect (a != NULL, 1))
++	    return a;
++	  catomic_decrement(&narenas);
++	}
++      a = reused_arena ();
++    }
+ #else
+   if(!a_tsd)
+     a = a_tsd = &main_arena;
+
+commit a5fb313cb7b7e692fd4684916aaa98e03ec7e8b6
+Author: Andreas Schwab <schwab at redhat.com>
+Date:   Mon Nov 14 11:41:52 2011 +0100
+
+    Don't call reused_arena when _int_new_arena failed
+
+diff --git a/malloc/arena.c b/malloc/arena.c
+index 042cac8..cb8548b 100644
+--- a/malloc/arena.c
++++ b/malloc/arena.c
+@@ -844,14 +844,14 @@ arena_get2(mstate a_tsd, size_t size)
+       size_t n = narenas;
+       if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0))
+ 	{
+-	  if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n))
++	  if (catomic_compare_and_exchange_bool_acq (&narenas, n + 1, n))
+ 	    goto repeat;
+ 	  a = _int_new_arena (size);
+-	  if (__builtin_expect (a != NULL, 1))
+-	    return a;
+-	  catomic_decrement(&narenas);
++	  if (__builtin_expect (a == NULL, 0))
++	    catomic_decrement (&narenas);
+ 	}
+-      a = reused_arena ();
++      else
++	a = reused_arena ();
+     }
+ #else
+   if(!a_tsd)


More information about the scm-commits mailing list