forked from pool/glibc
Accepting request 98636 from home:a_jaeger:my-factory-packages
Cleanup. OBS-URL: https://build.opensuse.org/request/show/98636 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=147
This commit is contained in:
parent
edcf84733c
commit
39bd22ed75
@ -1,236 +0,0 @@
|
|||||||
Allow M_ARENA_MAX / MALLOC_ARENA_MAX limit even with PER_THREAD disabled
|
|
||||||
|
|
||||||
With the new PER_THREAD compile-time option, the allocator also offers
|
|
||||||
a way to limit the total number of arenas using MALLOC_ARENA_MAX
|
|
||||||
environment variable or mallopt(M_ARENA_MAX).
|
|
||||||
|
|
||||||
In principle, this feature is not tied to the PER_THREAD option. This
|
|
||||||
patch makes it possible to use it even with the default compilation
|
|
||||||
settings.
|
|
||||||
|
|
||||||
One motivation to limit the number of arenas may be libhugetlbfs users
|
|
||||||
that rely on its __morecore hook providing hugetlbfs-backed memory for
|
|
||||||
the allocator - this can work only with a single arena and multi-threaded
|
|
||||||
programs wishing to use this feature need a way to limit the allocator
|
|
||||||
to a single arena. Another motivation is avoiding pathological behavior
|
|
||||||
in extremely thread-intensive applications.
|
|
||||||
|
|
||||||
|
|
||||||
2011-02-04 Petr Baudis <pasky@suse.cz>
|
|
||||||
|
|
||||||
* malloc/arena.c: Define and manage narenas even ifndef
|
|
||||||
PER_THREAD.
|
|
||||||
* malloc/arena.c (ptmalloc_init_minimal): Likewise.
|
|
||||||
* malloc/arena.c (_int_new_arena): Likewise.
|
|
||||||
* malloc/arena.c (ptmalloc_init): Implement MALLOC_ARENA_MAX
|
|
||||||
even ifndef PER_THREAD.
|
|
||||||
* malloc/arena.c (reused_arena): Split off get_narenas_limit(),
|
|
||||||
define even ifndef PER_THREAD.
|
|
||||||
* malloc/arena.c (arena_get2): Adjust for get_narenas_limit()
|
|
||||||
split, call reused_arena even ifndef PER_THREAD.
|
|
||||||
* malloc/hooks.c (public_gET_STATe): Set arena_max, narenas
|
|
||||||
even ifndef PER_THREAD.
|
|
||||||
* malloc/hooks.c (public_sET_STATe): Likewise.
|
|
||||||
* malloc/malloc.c (malloc_par): Define arena_max even ifndef
|
|
||||||
PER_THREAD.
|
|
||||||
* malloc/malloc.c (mALLOPt): Implement M_ARENA_MAX even ifndef
|
|
||||||
PER_THREAD.
|
|
||||||
* malloc/malloc.c: Remove redundant M_* defines.
|
|
||||||
|
|
||||||
Index: glibc-2.13/malloc/arena.c
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.13.orig/malloc/arena.c
|
|
||||||
+++ glibc-2.13/malloc/arena.c
|
|
||||||
@@ -78,8 +78,8 @@ extern int sanity_check_heap_info_alignm
|
|
||||||
|
|
||||||
static tsd_key_t arena_key;
|
|
||||||
static mutex_t list_lock;
|
|
||||||
-#ifdef PER_THREAD
|
|
||||||
static size_t narenas;
|
|
||||||
+#ifdef PER_THREAD
|
|
||||||
static mstate free_list;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -416,8 +416,8 @@ ptmalloc_init_minimal (void)
|
|
||||||
#ifdef PER_THREAD
|
|
||||||
# define NARENAS_FROM_NCORES(n) ((n) * (sizeof(long) == 4 ? 2 : 8))
|
|
||||||
mp_.arena_test = NARENAS_FROM_NCORES (1);
|
|
||||||
- narenas = 1;
|
|
||||||
#endif
|
|
||||||
+ narenas = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -574,10 +574,8 @@ ptmalloc_init (void)
|
|
||||||
{
|
|
||||||
if (memcmp (envline, "MMAP_MAX_", 9) == 0)
|
|
||||||
mALLOPt(M_MMAP_MAX, atoi(&envline[10]));
|
|
||||||
-#ifdef PER_THREAD
|
|
||||||
else if (memcmp (envline, "ARENA_MAX", 9) == 0)
|
|
||||||
mALLOPt(M_ARENA_MAX, atoi(&envline[10]));
|
|
||||||
-#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef PER_THREAD
|
|
||||||
@@ -946,9 +944,9 @@ _int_new_arena(size_t size)
|
|
||||||
atomic_write_barrier ();
|
|
||||||
main_arena.next = a;
|
|
||||||
|
|
||||||
-#ifdef PER_THREAD
|
|
||||||
++narenas;
|
|
||||||
|
|
||||||
+#ifdef PER_THREAD
|
|
||||||
(void)mutex_unlock(&list_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -982,13 +980,10 @@ get_free_list (void)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
-
|
|
||||||
-static mstate
|
|
||||||
-reused_arena (void)
|
|
||||||
+static int get_narenas_limit (void) __attribute__((pure));
|
|
||||||
+static int
|
|
||||||
+get_narenas_limit (void)
|
|
||||||
{
|
|
||||||
- if (narenas <= mp_.arena_test)
|
|
||||||
- return NULL;
|
|
||||||
-
|
|
||||||
static int narenas_limit;
|
|
||||||
if (narenas_limit == 0)
|
|
||||||
{
|
|
||||||
@@ -1006,10 +1001,16 @@ reused_arena (void)
|
|
||||||
narenas_limit = NARENAS_FROM_NCORES (2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ return narenas_limit;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
- if (narenas < narenas_limit)
|
|
||||||
- return NULL;
|
|
||||||
|
|
||||||
+/* Reuse and return one of the existing arenas; if all arenas are busy,
|
|
||||||
+ * pick one in a round-robin fashion and block until it becomes available. */
|
|
||||||
+static mstate
|
|
||||||
+reused_arena (void)
|
|
||||||
+{
|
|
||||||
mstate result;
|
|
||||||
static mstate next_to_use;
|
|
||||||
if (next_to_use == NULL)
|
|
||||||
@@ -1035,7 +1036,6 @@ reused_arena (void)
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
static mstate
|
|
||||||
internal_function
|
|
||||||
@@ -1048,10 +1048,15 @@ arena_get2(a_tsd, size) mstate a_tsd; si
|
|
||||||
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);
|
|
||||||
+ if ((a = get_free_list ()) == NULL)
|
|
||||||
+ {
|
|
||||||
+ if (narenas > mp_.arena_test && narenas >= get_narenas_limit())
|
|
||||||
+ a = reused_arena ();
|
|
||||||
+ else
|
|
||||||
+ /* Nothing immediately available, but we can still generate more
|
|
||||||
+ * arenas, so get a new one. */
|
|
||||||
+ a = _int_new_arena(size);
|
|
||||||
+ }
|
|
||||||
#else
|
|
||||||
if(!a_tsd)
|
|
||||||
a = a_tsd = &main_arena;
|
|
||||||
@@ -1093,8 +1098,14 @@ arena_get2(a_tsd, size) mstate a_tsd; si
|
|
||||||
goto repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Nothing immediately available, so generate a new arena. */
|
|
||||||
- a = _int_new_arena(size);
|
|
||||||
+ if (__builtin_expect(mp_.arena_max > 0, 0) && narenas >= mp_.arena_max)
|
|
||||||
+ /* Try again, this time blocking in case we are still unable to find
|
|
||||||
+ * a free arena. */
|
|
||||||
+ a = reused_arena();
|
|
||||||
+ else
|
|
||||||
+ /* Nothing immediately available, so generate a new arena. */
|
|
||||||
+ a = _int_new_arena(size);
|
|
||||||
+
|
|
||||||
(void)mutex_unlock(&list_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Index: glibc-2.13/malloc/hooks.c
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.13.orig/malloc/hooks.c
|
|
||||||
+++ glibc-2.13/malloc/hooks.c
|
|
||||||
@@ -579,9 +579,9 @@ public_gET_STATe(void)
|
|
||||||
ms->max_fast = get_max_fast();
|
|
||||||
#ifdef PER_THREAD
|
|
||||||
ms->arena_test = mp_.arena_test;
|
|
||||||
+#endif
|
|
||||||
ms->arena_max = mp_.arena_max;
|
|
||||||
ms->narenas = narenas;
|
|
||||||
-#endif
|
|
||||||
(void)mutex_unlock(&main_arena.mutex);
|
|
||||||
return (Void_t*)ms;
|
|
||||||
}
|
|
||||||
@@ -683,9 +683,9 @@ public_sET_STATe(Void_t* msptr)
|
|
||||||
if (ms->version >= 4) {
|
|
||||||
#ifdef PER_THREAD
|
|
||||||
mp_.arena_test = ms->arena_test;
|
|
||||||
+#endif
|
|
||||||
mp_.arena_max = ms->arena_max;
|
|
||||||
narenas = ms->narenas;
|
|
||||||
-#endif
|
|
||||||
}
|
|
||||||
check_malloc_state(&main_arena);
|
|
||||||
|
|
||||||
Index: glibc-2.13/malloc/malloc.c
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.13.orig/malloc/malloc.c
|
|
||||||
+++ glibc-2.13/malloc/malloc.c
|
|
||||||
@@ -2405,9 +2405,10 @@ struct malloc_par {
|
|
||||||
INTERNAL_SIZE_T top_pad;
|
|
||||||
INTERNAL_SIZE_T mmap_threshold;
|
|
||||||
#ifdef PER_THREAD
|
|
||||||
+ /* Lower bound for arena_max. */
|
|
||||||
INTERNAL_SIZE_T arena_test;
|
|
||||||
- INTERNAL_SIZE_T arena_max;
|
|
||||||
#endif
|
|
||||||
+ INTERNAL_SIZE_T arena_max;
|
|
||||||
|
|
||||||
/* Memory map support */
|
|
||||||
int n_mmaps;
|
|
||||||
@@ -2445,13 +2446,6 @@ static struct malloc_state main_arena;
|
|
||||||
static struct malloc_par mp_;
|
|
||||||
|
|
||||||
|
|
||||||
-#ifdef PER_THREAD
|
|
||||||
-/* Non public mallopt parameters. */
|
|
||||||
-#define M_ARENA_TEST -7
|
|
||||||
-#define M_ARENA_MAX -8
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
-
|
|
||||||
/* Maximum size of memory handled in fastbins. */
|
|
||||||
static INTERNAL_SIZE_T global_max_fast;
|
|
||||||
|
|
||||||
@@ -6111,12 +6105,12 @@ int mALLOPt(param_number, value) int par
|
|
||||||
if (value > 0)
|
|
||||||
mp_.arena_test = value;
|
|
||||||
break;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
case M_ARENA_MAX:
|
|
||||||
if (value > 0)
|
|
||||||
mp_.arena_max = value;
|
|
||||||
break;
|
|
||||||
-#endif
|
|
||||||
}
|
|
||||||
(void)mutex_unlock(&av->mutex);
|
|
||||||
return res;
|
|
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jan 3 14:37:48 UTC 2012 - aj@suse.de
|
||||||
|
|
||||||
|
- Cleanup spec file:
|
||||||
|
- experimental malloc is not experimental anymore and only option
|
||||||
|
(drop patch glibc-malloc-arena-max.diff)
|
||||||
|
- remove obsolete configure flags
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue Jan 3 08:40:28 UTC 2012 - aj@suse.de
|
Tue Jan 3 08:40:28 UTC 2012 - aj@suse.de
|
||||||
|
|
||||||
|
20
glibc.spec
20
glibc.spec
@ -56,14 +56,6 @@ BuildRequires: libstdc++-devel
|
|||||||
# 2.6.16 is the SLES 10 kernel, use this as oldest supported kernel
|
# 2.6.16 is the SLES 10 kernel, use this as oldest supported kernel
|
||||||
# since many SUSE build machines have it
|
# since many SUSE build machines have it
|
||||||
%define enablekernel 2.6.16
|
%define enablekernel 2.6.16
|
||||||
%ifarch ppc ppc64
|
|
||||||
# On PowerPC we got a memory corruption during building, disabling
|
|
||||||
# exp_malloc fixed it. Disable it until we have found and fixed the
|
|
||||||
# root cause.
|
|
||||||
%define exp_malloc 0
|
|
||||||
%else
|
|
||||||
%define exp_malloc 1
|
|
||||||
%endif
|
|
||||||
# ngpt was used in 8.1 and SLES8
|
# ngpt was used in 8.1 and SLES8
|
||||||
Obsoletes: ngpt < 2.2.2
|
Obsoletes: ngpt < 2.2.2
|
||||||
Obsoletes: ngpt-devel < 2.2.2
|
Obsoletes: ngpt-devel < 2.2.2
|
||||||
@ -165,8 +157,6 @@ Patch46: glibc-resolv-mdnshint.diff
|
|||||||
# PATCH-MISSING-TAG -- See http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
|
# PATCH-MISSING-TAG -- See http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
|
||||||
Patch47: glibc-nscd-hconf.diff
|
Patch47: glibc-nscd-hconf.diff
|
||||||
# PATCH-MISSING-TAG -- See http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
|
# PATCH-MISSING-TAG -- See http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
|
||||||
Patch48: glibc-malloc-arena-max.diff
|
|
||||||
# PATCH-MISSING-TAG -- See http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
|
|
||||||
Patch49: glibc-fini-unwind.diff
|
Patch49: glibc-fini-unwind.diff
|
||||||
# PATCH-FIX-OPENSUSE bnc#657627
|
# PATCH-FIX-OPENSUSE bnc#657627
|
||||||
Patch52: glibc-elf-localscope.diff
|
Patch52: glibc-elf-localscope.diff
|
||||||
@ -400,9 +390,6 @@ rm nscd/s-stamp
|
|||||||
%patch45
|
%patch45
|
||||||
%patch46 -p1
|
%patch46 -p1
|
||||||
%patch47 -p1
|
%patch47 -p1
|
||||||
%if !%{exp_malloc}
|
|
||||||
%patch48 -p1
|
|
||||||
%endif
|
|
||||||
%patch49
|
%patch49
|
||||||
%patch52
|
%patch52
|
||||||
%patch65 -p1
|
%patch65 -p1
|
||||||
@ -531,7 +518,7 @@ configure_and_build_glibc() {
|
|||||||
CFLAGS="$conf_cflags" CC="$BuildCC" CXX="$BuildCCplus" ../configure \
|
CFLAGS="$conf_cflags" CC="$BuildCC" CXX="$BuildCCplus" ../configure \
|
||||||
--prefix=%{_prefix} \
|
--prefix=%{_prefix} \
|
||||||
--libexecdir=%{_libdir} --infodir=%{_infodir} \
|
--libexecdir=%{_libdir} --infodir=%{_infodir} \
|
||||||
--enable-add-ons=nptl$addons --without-cvs --enable-profile \
|
--enable-add-ons=nptl$addons --enable-profile \
|
||||||
"$@" \
|
"$@" \
|
||||||
%if %{enable_stackguard_randomization}
|
%if %{enable_stackguard_randomization}
|
||||||
--enable-stackguard-randomization \
|
--enable-stackguard-randomization \
|
||||||
@ -543,10 +530,7 @@ configure_and_build_glibc() {
|
|||||||
%ifarch mipsel
|
%ifarch mipsel
|
||||||
--without-fp \
|
--without-fp \
|
||||||
%endif
|
%endif
|
||||||
%if %{exp_malloc}
|
--enable-kernel=%{enablekernel} \
|
||||||
--enable-experimental-malloc \
|
|
||||||
%endif
|
|
||||||
--with-tls --with-__thread --enable-kernel=%{enablekernel} \
|
|
||||||
--enable-bind-now
|
--enable-bind-now
|
||||||
# Should we enable --enable-nss-crypt to build use freebl3 hash functions?
|
# Should we enable --enable-nss-crypt to build use freebl3 hash functions?
|
||||||
# explicitly set CFLAGS to use the full CFLAGS (not the reduced one for configure)
|
# explicitly set CFLAGS to use the full CFLAGS (not the reduced one for configure)
|
||||||
|
Loading…
Reference in New Issue
Block a user