Author: jasone
Date: Thu Mar  2 01:14:48 2017
New Revision: 314529
URL: https://svnweb.freebsd.org/changeset/base/314529

Log:
  Update jemalloc to 4.5.0.

Modified:
  head/contrib/jemalloc/ChangeLog
  head/contrib/jemalloc/FREEBSD-Xlist
  head/contrib/jemalloc/FREEBSD-diffs
  head/contrib/jemalloc/VERSION
  head/contrib/jemalloc/doc/jemalloc.3
  head/contrib/jemalloc/include/jemalloc/internal/arena.h
  head/contrib/jemalloc/include/jemalloc/internal/chunk.h
  head/contrib/jemalloc/include/jemalloc/internal/extent.h
  head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h
  head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h
  head/contrib/jemalloc/include/jemalloc/internal/mb.h
  head/contrib/jemalloc/include/jemalloc/internal/mutex.h
  head/contrib/jemalloc/include/jemalloc/internal/private_namespace.h
  head/contrib/jemalloc/include/jemalloc/internal/tcache.h
  head/contrib/jemalloc/include/jemalloc/internal/tsd.h
  head/contrib/jemalloc/include/jemalloc/internal/witness.h
  head/contrib/jemalloc/include/jemalloc/jemalloc.h
  head/contrib/jemalloc/src/arena.c
  head/contrib/jemalloc/src/chunk.c
  head/contrib/jemalloc/src/chunk_dss.c
  head/contrib/jemalloc/src/ctl.c
  head/contrib/jemalloc/src/extent.c
  head/contrib/jemalloc/src/huge.c
  head/contrib/jemalloc/src/jemalloc.c
  head/contrib/jemalloc/src/pages.c
  head/contrib/jemalloc/src/stats.c
  head/contrib/jemalloc/src/tcache.c
  head/contrib/jemalloc/src/witness.c

Modified: head/contrib/jemalloc/ChangeLog
==============================================================================
--- head/contrib/jemalloc/ChangeLog     Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/ChangeLog     Thu Mar  2 01:14:48 2017        
(r314529)
@@ -4,6 +4,41 @@ brevity.  Much more detail can be found 
 
     https://github.com/jemalloc/jemalloc
 
+* 4.5.0 (February 28, 2017)
+
+  This is the first release to benefit from much broader continuous integration
+  testing, thanks to @davidtgoldblatt.  Had we had this testing infrastructure
+  in place for prior releases, it would have caught all of the most serious
+  regressions fixed by this release.
+
+  New features:
+  - Add --disable-thp and the opt.thp to provide opt-out mechanisms for
+    transparent huge page integration.  (@jasone)
+  - Update zone allocator integration to work with macOS 10.12.  (@glandium)
+  - Restructure *CFLAGS configuration, so that CFLAGS behaves typically, and
+    EXTRA_CFLAGS provides a way to specify e.g. -Werror during building, but 
not
+    during configuration.  (@jasone, @ronawho)
+
+  Bug fixes:
+  - Fix DSS (sbrk(2)-based) allocation.  This regression was first released in
+    4.3.0.  (@jasone)
+  - Handle race in per size class utilization computation.  This functionality
+    was first released in 4.0.0.  (@interwq)
+  - Fix lock order reversal during gdump.  (@jasone)
+  - Fix-refactor tcache synchronization.  This regression was first released in
+    4.0.0.  (@jasone)
+  - Fix various JSON-formatted malloc_stats_print() bugs.  This functionality
+    was first released in 4.3.0.  (@jasone)
+  - Fix huge-aligned allocation.  This regression was first released in 4.4.0.
+    (@jasone)
+  - When transparent huge page integration is enabled, detect what state pages
+    start in according to the kernel's current operating mode, and only convert
+    arena chunks to non-huge during purging if that is not their initial state.
+    This functionality was first released in 4.4.0.  (@jasone)
+  - Fix lg_chunk clamping for the --enable-cache-oblivious --disable-fill case.
+    This regression was first released in 4.0.0.  (@jasone, @428desmo)
+  - Properly detect sparc64 when building for Linux.  (@glaubitz)
+
 * 4.4.0 (December 3, 2016)
 
   New features:

Modified: head/contrib/jemalloc/FREEBSD-Xlist
==============================================================================
--- head/contrib/jemalloc/FREEBSD-Xlist Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/FREEBSD-Xlist Thu Mar  2 01:14:48 2017        
(r314529)
@@ -49,6 +49,7 @@ include/msvc_compat/
 install-sh
 jemalloc.pc*
 msvc/
+scripts/
 src/valgrind.c
 src/zone.c
 test/

Modified: head/contrib/jemalloc/FREEBSD-diffs
==============================================================================
--- head/contrib/jemalloc/FREEBSD-diffs Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/FREEBSD-diffs Thu Mar  2 01:14:48 2017        
(r314529)
@@ -1,5 +1,5 @@
 diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
-index d9c8345..9898c3c 100644
+index c97ab0f..be8dda5 100644
 --- a/doc/jemalloc.xml.in
 +++ b/doc/jemalloc.xml.in
 @@ -53,11 +53,23 @@
@@ -27,7 +27,7 @@ index d9c8345..9898c3c 100644
        <refsect2>
          <title>Standard API</title>
          <funcprototype>
-@@ -2963,4 +2975,18 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
+@@ -2989,4 +3001,18 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
      <para>The <function>posix_memalign()</function> function conforms
      to IEEE Std 1003.1-2001 (<quote>POSIX.1</quote>).</para>
    </refsect1>
@@ -47,10 +47,10 @@ index d9c8345..9898c3c 100644
 +  </refsect1>
  </refentry>
 diff --git a/include/jemalloc/internal/arena.h 
b/include/jemalloc/internal/arena.h
-index ce4e602..35360b6 100644
+index 119e3a5..277989f 100644
 --- a/include/jemalloc/internal/arena.h
 +++ b/include/jemalloc/internal/arena.h
-@@ -730,8 +730,13 @@ arena_miscelm_get_mutable(arena_chunk_t *chunk, size_t 
pageind)
+@@ -731,8 +731,13 @@ arena_miscelm_get_mutable(arena_chunk_t *chunk, size_t 
pageind)
  JEMALLOC_ALWAYS_INLINE const arena_chunk_map_misc_t *
  arena_miscelm_get_const(const arena_chunk_t *chunk, size_t pageind)
  {
@@ -64,7 +64,7 @@ index ce4e602..35360b6 100644
  }
  
  JEMALLOC_ALWAYS_INLINE size_t
-@@ -790,8 +795,13 @@ arena_mapbitsp_get_mutable(arena_chunk_t *chunk, size_t 
pageind)
+@@ -791,8 +796,13 @@ arena_mapbitsp_get_mutable(arena_chunk_t *chunk, size_t 
pageind)
  JEMALLOC_ALWAYS_INLINE const size_t *
  arena_mapbitsp_get_const(const arena_chunk_t *chunk, size_t pageind)
  {
@@ -79,7 +79,7 @@ index ce4e602..35360b6 100644
  
  JEMALLOC_ALWAYS_INLINE size_t
 diff --git a/include/jemalloc/internal/jemalloc_internal.h.in 
b/include/jemalloc/internal/jemalloc_internal.h.in
-index e7ace7d..d86c61d 100644
+index e3b499a..827fdbf 100644
 --- a/include/jemalloc/internal/jemalloc_internal.h.in
 +++ b/include/jemalloc/internal/jemalloc_internal.h.in
 @@ -8,6 +8,9 @@
@@ -122,7 +122,7 @@ index c907d91..4626632 100644
  #ifdef _WIN32
  #  include <windows.h>
 diff --git a/include/jemalloc/internal/mutex.h 
b/include/jemalloc/internal/mutex.h
-index b442d2d..76518db 100644
+index 2b4b1c3..e03a6d0 100644
 --- a/include/jemalloc/internal/mutex.h
 +++ b/include/jemalloc/internal/mutex.h
 @@ -57,9 +57,6 @@ struct malloc_mutex_s {
@@ -144,10 +144,10 @@ index b442d2d..76518db 100644
  
  #endif /* JEMALLOC_H_EXTERNS */
 diff --git a/include/jemalloc/internal/private_symbols.txt 
b/include/jemalloc/internal/private_symbols.txt
-index c1c6c40..c6395fd 100644
+index 60b57e5..056a8fe 100644
 --- a/include/jemalloc/internal/private_symbols.txt
 +++ b/include/jemalloc/internal/private_symbols.txt
-@@ -310,7 +310,6 @@ iralloct_realign
+@@ -312,7 +312,6 @@ iralloct_realign
  isalloc
  isdalloct
  isqalloc
@@ -335,7 +335,7 @@ index f943891..47d032c 100755
 +#include "jemalloc_FreeBSD.h"
  EOF
 diff --git a/src/jemalloc.c b/src/jemalloc.c
-index baead66..8a49f26 100644
+index f73a26c..fcfe204 100644
 --- a/src/jemalloc.c
 +++ b/src/jemalloc.c
 @@ -4,6 +4,10 @@
@@ -349,7 +349,7 @@ index baead66..8a49f26 100644
  /* Runtime configuration options. */
  const char    *je_malloc_conf
  #ifndef _WIN32
-@@ -2775,6 +2779,107 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void 
*ptr)
+@@ -2781,6 +2785,107 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void 
*ptr)
   */
  
/******************************************************************************/
  /*
@@ -457,7 +457,7 @@ index baead66..8a49f26 100644
   * The following functions are used by threading libraries for protection of
   * malloc during fork().
   */
-@@ -2913,4 +3018,11 @@ jemalloc_postfork_child(void)
+@@ -2922,4 +3027,11 @@ jemalloc_postfork_child(void)
        ctl_postfork_child(tsd_tsdn(tsd));
  }
  
@@ -516,7 +516,7 @@ index 6333e73..13f8d79 100644
 +#endif
 +}
 diff --git a/src/util.c b/src/util.c
-index dd8c236..a4ff287 100755
+index dd8c236..a4ff287 100644
 --- a/src/util.c
 +++ b/src/util.c
 @@ -67,6 +67,22 @@ wrtmessage(void *cbopaque, const char *s)

Modified: head/contrib/jemalloc/VERSION
==============================================================================
--- head/contrib/jemalloc/VERSION       Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/VERSION       Thu Mar  2 01:14:48 2017        
(r314529)
@@ -1 +1 @@
-4.4.0-0-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc
+4.5.0-0-g04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5

Modified: head/contrib/jemalloc/doc/jemalloc.3
==============================================================================
--- head/contrib/jemalloc/doc/jemalloc.3        Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/doc/jemalloc.3        Thu Mar  2 01:14:48 2017        
(r314529)
@@ -2,12 +2,12 @@
 .\"     Title: JEMALLOC
 .\"    Author: Jason Evans
 .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\"      Date: 12/04/2016
+.\"      Date: 02/28/2017
 .\"    Manual: User Manual
-.\"    Source: jemalloc 4.4.0-0-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc
+.\"    Source: jemalloc 4.5.0-0-g04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5
 .\"  Language: English
 .\"
-.TH "JEMALLOC" "3" "12/04/2016" "jemalloc 4.4.0-0-gf1f76357313e" "User Manual"
+.TH "JEMALLOC" "3" "02/28/2017" "jemalloc 4.5.0-0-g04380e79f1e2" "User Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -31,7 +31,7 @@
 jemalloc \- general purpose memory allocation functions
 .SH "LIBRARY"
 .PP
-This manual describes jemalloc 
4\&.4\&.0\-0\-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc\&. More information can 
be found at the
+This manual describes jemalloc 
4\&.5\&.0\-0\-g04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5\&. More information can 
be found at the
 \m[blue]\fBjemalloc website\fR\m[]\&\s-2\u[1]\d\s+2\&.
 .PP
 The following configuration options are enabled in libc\*(Aqs built\-in 
jemalloc:
@@ -779,6 +779,12 @@ config\&.tcache (\fBbool\fR) r\-
 was not specified during build configuration\&.
 .RE
 .PP
+config\&.thp (\fBbool\fR) r\-
+.RS 4
+\fB\-\-disable\-thp\fR
+was not specified during build configuration, and the system supports 
transparent huge page manipulation\&.
+.RE
+.PP
 config\&.tls (\fBbool\fR) r\-
 .RS 4
 \fB\-\-disable\-tls\fR
@@ -965,6 +971,11 @@ option for related tuning information\&.
 \m[blue]\fBValgrind\fR\m[]\&\s-2\u[3]\d\s+2, in which case it is forcefully 
disabled\&.
 .RE
 .PP
+opt\&.thp (\fBbool\fR) r\- [\fB\-\-enable\-thp\fR]
+.RS 4
+Transparent huge page (THP) integration enabled/disabled\&. When enabled, THPs 
are explicitly disabled as a side effect of unused dirty page purging for 
chunks that back small and/or large allocations, because such chunks typically 
comprise active, unused dirty, and untouched clean pages\&. This option is 
enabled by default\&.
+.RE
+.PP
 opt\&.lg_tcache_max (\fBsize_t\fR) r\- [\fB\-\-enable\-tcache\fR]
 .RS 4
 Maximum size class (log base 2) to cache in the thread\-specific cache 
(tcache)\&. At a minimum, all small size classes are cached, and at a maximum 
all large size classes are cached\&. The default maximum is 32 KiB (2^15)\&.

Modified: head/contrib/jemalloc/include/jemalloc/internal/arena.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/arena.h     Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/arena.h     Thu Mar  2 
01:14:48 2017        (r314529)
@@ -506,6 +506,7 @@ static const size_t large_pad =
 #endif
     ;
 
+extern bool            opt_thp;
 extern purge_mode_t    opt_purge;
 extern const char      *purge_mode_names[];
 extern ssize_t         opt_lg_dirty_mult;

Modified: head/contrib/jemalloc/include/jemalloc/internal/chunk.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/chunk.h     Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/chunk.h     Thu Mar  2 
01:14:48 2017        (r314529)
@@ -52,8 +52,8 @@ chunk_hooks_t chunk_hooks_get(tsdn_t *ts
 chunk_hooks_t  chunk_hooks_set(tsdn_t *tsdn, arena_t *arena,
     const chunk_hooks_t *chunk_hooks);
 
-bool   chunk_register(tsdn_t *tsdn, const void *chunk,
-    const extent_node_t *node);
+bool   chunk_register(const void *chunk, const extent_node_t *node,
+    bool *gdump);
 void   chunk_deregister(const void *chunk, const extent_node_t *node);
 void   *chunk_alloc_base(size_t size);
 void   *chunk_alloc_cache(tsdn_t *tsdn, arena_t *arena,

Modified: head/contrib/jemalloc/include/jemalloc/internal/extent.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/extent.h    Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/extent.h    Thu Mar  2 
01:14:48 2017        (r314529)
@@ -75,6 +75,11 @@ typedef rb_tree(extent_node_t) extent_tr
 
/******************************************************************************/
 #ifdef JEMALLOC_H_EXTERNS
 
+#ifdef JEMALLOC_JET
+size_t extent_size_quantize_floor(size_t size);
+#endif
+size_t extent_size_quantize_ceil(size_t size);
+
 rb_proto(, extent_tree_szsnad_, extent_tree_t, extent_node_t)
 
 rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t)

Modified: head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h Thu Mar 
 2 00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h Thu Mar 
 2 01:14:48 2017        (r314529)
@@ -96,6 +96,13 @@ static const bool config_tcache =
     false
 #endif
     ;
+static const bool config_thp =
+#ifdef JEMALLOC_THP
+    true
+#else
+    false
+#endif
+    ;
 static const bool config_tls =
 #ifdef JEMALLOC_TLS
     true
@@ -155,7 +162,6 @@ static const bool config_cache_oblivious
 #include <mach/mach_error.h>
 #include <mach/mach_init.h>
 #include <mach/vm_map.h>
-#include <malloc/malloc.h>
 #endif
 
 #include "jemalloc/internal/ph.h"

Modified: 
head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h    
Thu Mar  2 00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h    
Thu Mar  2 01:14:48 2017        (r314529)
@@ -240,7 +240,6 @@
  * Darwin (OS X) uses zones to work around Mach-O symbol override shortcomings.
  */
 /* #undef JEMALLOC_ZONE */
-/* #undef JEMALLOC_ZONE_VERSION */
 
 /*
  * Methods for determining whether the OS overcommits.
@@ -255,6 +254,12 @@
 #define JEMALLOC_HAVE_MADVISE 
 
 /*
+ * Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE
+ * arguments to madvise(2).
+ */
+/* #undef JEMALLOC_HAVE_MADVISE_HUGE */
+
+/*
  * Methods for purging unused pages differ between operating systems.
  *
  *   madvise(..., MADV_FREE) : This marks pages as being unused, such that they
@@ -266,10 +271,7 @@
 #define JEMALLOC_PURGE_MADVISE_FREE 
 #define JEMALLOC_PURGE_MADVISE_DONTNEED 
 
-/*
- * Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE
- * arguments to madvise(2).
- */
+/* Defined if transparent huge page support is enabled. */
 /* #undef JEMALLOC_THP */
 
 /* Define if operating system has alloca.h header. */

Modified: head/contrib/jemalloc/include/jemalloc/internal/mb.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/mb.h        Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/mb.h        Thu Mar  2 
01:14:48 2017        (r314529)
@@ -76,7 +76,7 @@ mb_write(void)
            : "memory" /* Clobbers. */
            );
 }
-#elif defined(__sparc64__)
+#elif defined(__sparc__) && defined(__arch64__)
 JEMALLOC_INLINE void
 mb_write(void)
 {

Modified: head/contrib/jemalloc/include/jemalloc/internal/mutex.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/mutex.h     Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/mutex.h     Thu Mar  2 
01:14:48 2017        (r314529)
@@ -83,8 +83,8 @@ JEMALLOC_INLINE void
 malloc_mutex_lock(tsdn_t *tsdn, malloc_mutex_t *mutex)
 {
 
+       witness_assert_not_owner(tsdn, &mutex->witness);
        if (isthreaded) {
-               witness_assert_not_owner(tsdn, &mutex->witness);
 #ifdef _WIN32
 #  if _WIN32_WINNT >= 0x0600
                AcquireSRWLockExclusive(&mutex->lock);
@@ -98,16 +98,16 @@ malloc_mutex_lock(tsdn_t *tsdn, malloc_m
 #else
                pthread_mutex_lock(&mutex->lock);
 #endif
-               witness_lock(tsdn, &mutex->witness);
        }
+       witness_lock(tsdn, &mutex->witness);
 }
 
 JEMALLOC_INLINE void
 malloc_mutex_unlock(tsdn_t *tsdn, malloc_mutex_t *mutex)
 {
 
+       witness_unlock(tsdn, &mutex->witness);
        if (isthreaded) {
-               witness_unlock(tsdn, &mutex->witness);
 #ifdef _WIN32
 #  if _WIN32_WINNT >= 0x0600
                ReleaseSRWLockExclusive(&mutex->lock);
@@ -128,16 +128,14 @@ JEMALLOC_INLINE void
 malloc_mutex_assert_owner(tsdn_t *tsdn, malloc_mutex_t *mutex)
 {
 
-       if (isthreaded)
-               witness_assert_owner(tsdn, &mutex->witness);
+       witness_assert_owner(tsdn, &mutex->witness);
 }
 
 JEMALLOC_INLINE void
 malloc_mutex_assert_not_owner(tsdn_t *tsdn, malloc_mutex_t *mutex)
 {
 
-       if (isthreaded)
-               witness_assert_not_owner(tsdn, &mutex->witness);
+       witness_assert_not_owner(tsdn, &mutex->witness);
 }
 #endif
 

Modified: head/contrib/jemalloc/include/jemalloc/internal/private_namespace.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/private_namespace.h Thu Mar 
 2 00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/private_namespace.h Thu Mar 
 2 01:14:48 2017        (r314529)
@@ -223,6 +223,8 @@
 #define        extent_node_sn_set JEMALLOC_N(extent_node_sn_set)
 #define        extent_node_zeroed_get JEMALLOC_N(extent_node_zeroed_get)
 #define        extent_node_zeroed_set JEMALLOC_N(extent_node_zeroed_set)
+#define        extent_size_quantize_ceil JEMALLOC_N(extent_size_quantize_ceil)
+#define        extent_size_quantize_floor 
JEMALLOC_N(extent_size_quantize_floor)
 #define        extent_tree_ad_destroy JEMALLOC_N(extent_tree_ad_destroy)
 #define        extent_tree_ad_destroy_recurse 
JEMALLOC_N(extent_tree_ad_destroy_recurse)
 #define        extent_tree_ad_empty JEMALLOC_N(extent_tree_ad_empty)
@@ -389,6 +391,7 @@
 #define        opt_redzone JEMALLOC_N(opt_redzone)
 #define        opt_stats_print JEMALLOC_N(opt_stats_print)
 #define        opt_tcache JEMALLOC_N(opt_tcache)
+#define        opt_thp JEMALLOC_N(opt_thp)
 #define        opt_utrace JEMALLOC_N(opt_utrace)
 #define        opt_xmalloc JEMALLOC_N(opt_xmalloc)
 #define        opt_zero JEMALLOC_N(opt_zero)
@@ -528,6 +531,9 @@
 #define        tcache_get JEMALLOC_N(tcache_get)
 #define        tcache_get_hard JEMALLOC_N(tcache_get_hard)
 #define        tcache_maxclass JEMALLOC_N(tcache_maxclass)
+#define        tcache_postfork_child JEMALLOC_N(tcache_postfork_child)
+#define        tcache_postfork_parent JEMALLOC_N(tcache_postfork_parent)
+#define        tcache_prefork JEMALLOC_N(tcache_prefork)
 #define        tcache_salloc JEMALLOC_N(tcache_salloc)
 #define        tcache_stats_merge JEMALLOC_N(tcache_stats_merge)
 #define        tcaches JEMALLOC_N(tcaches)
@@ -611,14 +617,16 @@
 #define        valgrind_make_mem_defined JEMALLOC_N(valgrind_make_mem_defined)
 #define        valgrind_make_mem_noaccess 
JEMALLOC_N(valgrind_make_mem_noaccess)
 #define        valgrind_make_mem_undefined 
JEMALLOC_N(valgrind_make_mem_undefined)
+#define        witness_assert_depth JEMALLOC_N(witness_assert_depth)
+#define        witness_assert_depth_to_rank 
JEMALLOC_N(witness_assert_depth_to_rank)
 #define        witness_assert_lockless JEMALLOC_N(witness_assert_lockless)
 #define        witness_assert_not_owner JEMALLOC_N(witness_assert_not_owner)
 #define        witness_assert_owner JEMALLOC_N(witness_assert_owner)
+#define        witness_depth_error JEMALLOC_N(witness_depth_error)
 #define        witness_fork_cleanup JEMALLOC_N(witness_fork_cleanup)
 #define        witness_init JEMALLOC_N(witness_init)
 #define        witness_lock JEMALLOC_N(witness_lock)
 #define        witness_lock_error JEMALLOC_N(witness_lock_error)
-#define        witness_lockless_error JEMALLOC_N(witness_lockless_error)
 #define        witness_not_owner_error JEMALLOC_N(witness_not_owner_error)
 #define        witness_owner JEMALLOC_N(witness_owner)
 #define        witness_owner_error JEMALLOC_N(witness_owner_error)

Modified: head/contrib/jemalloc/include/jemalloc/internal/tcache.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/tcache.h    Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/tcache.h    Thu Mar  2 
01:14:48 2017        (r314529)
@@ -149,6 +149,9 @@ bool        tcaches_create(tsd_t *tsd, unsigned
 void   tcaches_flush(tsd_t *tsd, unsigned ind);
 void   tcaches_destroy(tsd_t *tsd, unsigned ind);
 bool   tcache_boot(tsdn_t *tsdn);
+void tcache_prefork(tsdn_t *tsdn);
+void tcache_postfork_parent(tsdn_t *tsdn);
+void tcache_postfork_child(tsdn_t *tsdn);
 
 #endif /* JEMALLOC_H_EXTERNS */
 
/******************************************************************************/

Modified: head/contrib/jemalloc/include/jemalloc/internal/tsd.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/tsd.h       Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/tsd.h       Thu Mar  2 
01:14:48 2017        (r314529)
@@ -479,13 +479,14 @@ a_name##tsd_wrapper_get(bool init)                        
                \
                                                                        \
        if (init && unlikely(wrapper == NULL)) {                        \
                tsd_init_block_t block;                                 \
-               wrapper = tsd_init_check_recursion(                     \
-                   &a_name##tsd_init_head, &block);                    \
+               wrapper = (a_name##tsd_wrapper_t *)                     \
+                   tsd_init_check_recursion(&a_name##tsd_init_head,    \
+                   &block);                                            \
                if (wrapper)                                            \
                    return (wrapper);                                   \
                wrapper = (a_name##tsd_wrapper_t *)                     \
                    malloc_tsd_malloc(sizeof(a_name##tsd_wrapper_t));   \
-               block.data = wrapper;                                   \
+               block.data = (void *)wrapper;                           \
                if (wrapper == NULL) {                                  \
                        malloc_write("<jemalloc>: Error allocating"     \
                            " TSD for "#a_name"\n");                    \

Modified: head/contrib/jemalloc/include/jemalloc/internal/witness.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/internal/witness.h   Thu Mar  2 
00:27:21 2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/internal/witness.h   Thu Mar  2 
01:14:48 2017        (r314529)
@@ -12,21 +12,32 @@ typedef int witness_comp_t (const witnes
  */
 #define        WITNESS_RANK_OMIT               0U
 
+#define WITNESS_RANK_MIN               1U
+
 #define        WITNESS_RANK_INIT               1U
 #define        WITNESS_RANK_CTL                1U
-#define        WITNESS_RANK_ARENAS             2U
+#define WITNESS_RANK_TCACHES           2U
+#define        WITNESS_RANK_ARENAS             3U
+
+#define        WITNESS_RANK_PROF_DUMP          4U
+#define        WITNESS_RANK_PROF_BT2GCTX       5U
+#define        WITNESS_RANK_PROF_TDATAS        6U
+#define        WITNESS_RANK_PROF_TDATA         7U
+#define        WITNESS_RANK_PROF_GCTX          8U
+
+/*
+ * Used as an argument to witness_assert_depth_to_rank() in order to validate
+ * depth excluding non-core locks with lower ranks.  Since the rank argument to
+ * witness_assert_depth_to_rank() is inclusive rather than exclusive, this
+ * definition can have the same value as the minimally ranked core lock.
+ */
+#define WITNESS_RANK_CORE              9U
 
-#define        WITNESS_RANK_PROF_DUMP          3U
-#define        WITNESS_RANK_PROF_BT2GCTX       4U
-#define        WITNESS_RANK_PROF_TDATAS        5U
-#define        WITNESS_RANK_PROF_TDATA         6U
-#define        WITNESS_RANK_PROF_GCTX          7U
-
-#define        WITNESS_RANK_ARENA              8U
-#define        WITNESS_RANK_ARENA_CHUNKS       9U
-#define        WITNESS_RANK_ARENA_NODE_CACHE   10
+#define        WITNESS_RANK_ARENA              9U
+#define        WITNESS_RANK_ARENA_CHUNKS       10U
+#define        WITNESS_RANK_ARENA_NODE_CACHE   11U
 
-#define        WITNESS_RANK_BASE               11U
+#define        WITNESS_RANK_BASE               12U
 
 #define        WITNESS_RANK_LEAF               0xffffffffU
 #define        WITNESS_RANK_ARENA_BIN          WITNESS_RANK_LEAF
@@ -91,10 +102,12 @@ extern witness_not_owner_error_t *witnes
 void   witness_not_owner_error(const witness_t *witness);
 #endif
 #ifdef JEMALLOC_JET
-typedef void (witness_lockless_error_t)(const witness_list_t *);
-extern witness_lockless_error_t *witness_lockless_error;
+typedef void (witness_depth_error_t)(const witness_list_t *,
+    witness_rank_t rank_inclusive, unsigned depth);
+extern witness_depth_error_t *witness_depth_error;
 #else
-void   witness_lockless_error(const witness_list_t *witnesses);
+void   witness_depth_error(const witness_list_t *witnesses,
+    witness_rank_t rank_inclusive, unsigned depth);
 #endif
 
 void   witnesses_cleanup(tsd_t *tsd);
@@ -111,6 +124,9 @@ void        witness_postfork_child(tsd_t *tsd);
 bool   witness_owner(tsd_t *tsd, const witness_t *witness);
 void   witness_assert_owner(tsdn_t *tsdn, const witness_t *witness);
 void   witness_assert_not_owner(tsdn_t *tsdn, const witness_t *witness);
+void witness_assert_depth_to_rank(tsdn_t *tsdn, witness_rank_t rank_inclusive,
+    unsigned depth);
+void witness_assert_depth(tsdn_t *tsdn, unsigned depth);
 void   witness_assert_lockless(tsdn_t *tsdn);
 void   witness_lock(tsdn_t *tsdn, witness_t *witness);
 void   witness_unlock(tsdn_t *tsdn, witness_t *witness);
@@ -123,6 +139,8 @@ witness_owner(tsd_t *tsd, const witness_
        witness_list_t *witnesses;
        witness_t *w;
 
+       cassert(config_debug);
+
        witnesses = tsd_witnessesp_get(tsd);
        ql_foreach(w, witnesses, link) {
                if (w == witness)
@@ -175,9 +193,10 @@ witness_assert_not_owner(tsdn_t *tsdn, c
 }
 
 JEMALLOC_INLINE void
-witness_assert_lockless(tsdn_t *tsdn)
-{
+witness_assert_depth_to_rank(tsdn_t *tsdn, witness_rank_t rank_inclusive,
+    unsigned depth) {
        tsd_t *tsd;
+       unsigned d;
        witness_list_t *witnesses;
        witness_t *w;
 
@@ -188,10 +207,29 @@ witness_assert_lockless(tsdn_t *tsdn)
                return;
        tsd = tsdn_tsd(tsdn);
 
+       d = 0;
        witnesses = tsd_witnessesp_get(tsd);
        w = ql_last(witnesses, link);
-       if (w != NULL)
-               witness_lockless_error(witnesses);
+       if (w != NULL) {
+               ql_reverse_foreach(w, witnesses, link) {
+                       if (w->rank < rank_inclusive) {
+                               break;
+                       }
+                       d++;
+               }
+       }
+       if (d != depth)
+               witness_depth_error(witnesses, rank_inclusive, depth);
+}
+
+JEMALLOC_INLINE void
+witness_assert_depth(tsdn_t *tsdn, unsigned depth) {
+       witness_assert_depth_to_rank(tsdn, WITNESS_RANK_MIN, depth);
+}
+
+JEMALLOC_INLINE void
+witness_assert_lockless(tsdn_t *tsdn) {
+       witness_assert_depth(tsdn, 0);
 }
 
 JEMALLOC_INLINE void

Modified: head/contrib/jemalloc/include/jemalloc/jemalloc.h
==============================================================================
--- head/contrib/jemalloc/include/jemalloc/jemalloc.h   Thu Mar  2 00:27:21 
2017        (r314528)
+++ head/contrib/jemalloc/include/jemalloc/jemalloc.h   Thu Mar  2 01:14:48 
2017        (r314529)
@@ -87,12 +87,12 @@ extern "C" {
 #include <limits.h>
 #include <strings.h>
 
-#define        JEMALLOC_VERSION 
"4.4.0-0-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc"
+#define        JEMALLOC_VERSION 
"4.5.0-0-g04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5"
 #define        JEMALLOC_VERSION_MAJOR 4
-#define        JEMALLOC_VERSION_MINOR 4
+#define        JEMALLOC_VERSION_MINOR 5
 #define        JEMALLOC_VERSION_BUGFIX 0
 #define        JEMALLOC_VERSION_NREV 0
-#define        JEMALLOC_VERSION_GID "f1f76357313e7dcad7262f17a48ff0a2e005fcdc"
+#define        JEMALLOC_VERSION_GID "04380e79f1e2428bd0ad000bbc6e3d2dfc6b66a5"
 
 #  define MALLOCX_LG_ALIGN(la) ((int)(la))
 #  if LG_SIZEOF_PTR == 2

Modified: head/contrib/jemalloc/src/arena.c
==============================================================================
--- head/contrib/jemalloc/src/arena.c   Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/src/arena.c   Thu Mar  2 01:14:48 2017        
(r314529)
@@ -4,6 +4,8 @@
 
/******************************************************************************/
 /* Data. */
 
+bool           opt_thp = true;
+static bool    thp_initially_huge;
 purge_mode_t   opt_purge = PURGE_DEFAULT;
 const char     *purge_mode_names[] = {
        "ratio",
@@ -568,8 +570,8 @@ arena_chunk_init_spare(arena_t *arena)
 }
 
 static bool
-arena_chunk_register(tsdn_t *tsdn, arena_t *arena, arena_chunk_t *chunk,
-    size_t sn, bool zero)
+arena_chunk_register(arena_t *arena, arena_chunk_t *chunk, size_t sn, bool 
zero,
+    bool *gdump)
 {
 
        /*
@@ -580,7 +582,7 @@ arena_chunk_register(tsdn_t *tsdn, arena
         */
        extent_node_init(&chunk->node, arena, chunk, chunksize, sn, zero, true);
        extent_node_achunk_set(&chunk->node, true);
-       return (chunk_register(tsdn, chunk, &chunk->node));
+       return (chunk_register(chunk, &chunk->node, gdump));
 }
 
 static arena_chunk_t *
@@ -591,6 +593,8 @@ arena_chunk_alloc_internal_hard(tsdn_t *
        size_t sn;
 
        malloc_mutex_unlock(tsdn, &arena->lock);
+       /* prof_gdump() requirement. */
+       witness_assert_depth_to_rank(tsdn, WITNESS_RANK_CORE, 0);
 
        chunk = (arena_chunk_t *)chunk_alloc_wrapper(tsdn, arena, chunk_hooks,
            NULL, chunksize, chunksize, &sn, zero, commit);
@@ -603,16 +607,20 @@ arena_chunk_alloc_internal_hard(tsdn_t *
                        chunk = NULL;
                }
        }
-       if (chunk != NULL && arena_chunk_register(tsdn, arena, chunk, sn,
-           *zero)) {
-               if (!*commit) {
-                       /* Undo commit of header. */
-                       chunk_hooks->decommit(chunk, chunksize, 0, map_bias <<
-                           LG_PAGE, arena->ind);
-               }
-               chunk_dalloc_wrapper(tsdn, arena, chunk_hooks, (void *)chunk,
-                   chunksize, sn, *zero, *commit);
-               chunk = NULL;
+       if (chunk != NULL) {
+               bool gdump;
+               if (arena_chunk_register(arena, chunk, sn, *zero, &gdump)) {
+                       if (!*commit) {
+                               /* Undo commit of header. */
+                               chunk_hooks->decommit(chunk, chunksize, 0,
+                                   map_bias << LG_PAGE, arena->ind);
+                       }
+                       chunk_dalloc_wrapper(tsdn, arena, chunk_hooks,
+                           (void *)chunk, chunksize, sn, *zero, *commit);
+                       chunk = NULL;
+               }
+               if (config_prof && opt_prof && gdump)
+                       prof_gdump(tsdn);
        }
 
        malloc_mutex_lock(tsdn, &arena->lock);
@@ -627,14 +635,24 @@ arena_chunk_alloc_internal(tsdn_t *tsdn,
        chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
        size_t sn;
 
+       /* prof_gdump() requirement. */
+       witness_assert_depth_to_rank(tsdn, WITNESS_RANK_CORE, 1);
+       malloc_mutex_assert_owner(tsdn, &arena->lock);
+
        chunk = chunk_alloc_cache(tsdn, arena, &chunk_hooks, NULL, chunksize,
            chunksize, &sn, zero, commit, true);
        if (chunk != NULL) {
-               if (arena_chunk_register(tsdn, arena, chunk, sn, *zero)) {
+               bool gdump;
+               if (arena_chunk_register(arena, chunk, sn, *zero, &gdump)) {
                        chunk_dalloc_cache(tsdn, arena, &chunk_hooks, chunk,
                            chunksize, sn, true);
                        return (NULL);
                }
+               if (config_prof && opt_prof && gdump) {
+                       malloc_mutex_unlock(tsdn, &arena->lock);
+                       prof_gdump(tsdn);
+                       malloc_mutex_lock(tsdn, &arena->lock);
+               }
        }
        if (chunk == NULL) {
                chunk = arena_chunk_alloc_internal_hard(tsdn, arena,
@@ -664,7 +682,9 @@ arena_chunk_init_hard(tsdn_t *tsdn, aren
        if (chunk == NULL)
                return (NULL);
 
-       chunk->hugepage = true;
+       if (config_thp && opt_thp) {
+               chunk->hugepage = thp_initially_huge;
+       }
 
        /*
         * Initialize the map to contain one maximal free untouched run.  Mark
@@ -729,14 +749,17 @@ arena_chunk_alloc(tsdn_t *tsdn, arena_t 
 static void
 arena_chunk_discard(tsdn_t *tsdn, arena_t *arena, arena_chunk_t *chunk)
 {
-       size_t sn, hugepage;
+       size_t sn;
+       UNUSED bool hugepage JEMALLOC_CC_SILENCE_INIT(false);
        bool committed;
        chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
 
        chunk_deregister(chunk, &chunk->node);
 
        sn = extent_node_sn_get(&chunk->node);
-       hugepage = chunk->hugepage;
+       if (config_thp && opt_thp) {
+               hugepage = chunk->hugepage;
+       }
        committed = (arena_mapbits_decommitted_get(chunk, map_bias) == 0);
        if (!committed) {
                /*
@@ -749,13 +772,16 @@ arena_chunk_discard(tsdn_t *tsdn, arena_
                chunk_hooks.decommit(chunk, chunksize, 0, map_bias << LG_PAGE,
                    arena->ind);
        }
-       if (!hugepage) {
+       if (config_thp && opt_thp && hugepage != thp_initially_huge) {
                /*
-                * Convert chunk back to the default state, so that all
-                * subsequent chunk allocations start out with chunks that can
-                * be backed by transparent huge pages.
+                * Convert chunk back to initial THP state, so that all
+                * subsequent chunk allocations start out in a consistent state.
                 */
-               pages_huge(chunk, chunksize);
+               if (thp_initially_huge) {
+                       pages_huge(chunk, chunksize);
+               } else {
+                       pages_nohuge(chunk, chunksize);
+               }
        }
 
        chunk_dalloc_cache(tsdn, arena, &chunk_hooks, (void *)chunk, chunksize,
@@ -1695,13 +1721,13 @@ arena_purge_stashed(tsdn_t *tsdn, arena_
 
                        /*
                         * If this is the first run purged within chunk, mark
-                        * the chunk as non-huge.  This will prevent all use of
-                        * transparent huge pages for this chunk until the chunk
-                        * as a whole is deallocated.
+                        * the chunk as non-THP-capable.  This will prevent all
+                        * use of THPs for this chunk until the chunk as a whole
+                        * is deallocated.
                         */
-                       if (chunk->hugepage) {
-                               pages_nohuge(chunk, chunksize);
-                               chunk->hugepage = false;
+                       if (config_thp && opt_thp && chunk->hugepage) {
+                               chunk->hugepage = pages_nohuge(chunk,
+                                   chunksize);
                        }
 
                        assert(pageind + npages <= chunk_npages);
@@ -2694,6 +2720,7 @@ arena_malloc_hard(tsdn_t *tsdn, arena_t 
                return (arena_malloc_small(tsdn, arena, ind, zero));
        if (likely(size <= large_maxclass))
                return (arena_malloc_large(tsdn, arena, ind, zero));
+       assert(index2size(ind) >= chunksize);
        return (huge_malloc(tsdn, arena, index2size(ind), zero));
 }
 
@@ -3755,11 +3782,78 @@ bin_info_init(void)
 #undef SC
 }
 
+static void
+init_thp_initially_huge(void) {
+       int fd;
+       char buf[sizeof("[always] madvise never\n")];
+       ssize_t nread;
+       static const char *enabled_states[] = {
+               "[always] madvise never\n",
+               "always [madvise] never\n",
+               "always madvise [never]\n"
+       };
+       static const bool thp_initially_huge_states[] = {
+               true,
+               false,
+               false
+       };
+       unsigned i;
+
+       if (config_debug) {
+               for (i = 0; i < sizeof(enabled_states)/sizeof(const char *);
+                   i++) {
+                       assert(sizeof(buf) > strlen(enabled_states[i]));
+               }
+       }
+       assert(sizeof(enabled_states)/sizeof(const char *) ==
+           sizeof(thp_initially_huge_states)/sizeof(bool));
+
+#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open)
+       fd = (int)syscall(SYS_open,
+           "/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY);
+#else
+       fd = open("/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY);
+#endif
+       if (fd == -1) {
+               goto label_error;
+       }
+
+#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read)
+       nread = (ssize_t)syscall(SYS_read, fd, &buf, sizeof(buf));
+#else
+       nread = read(fd, &buf, sizeof(buf));
+#endif
+
+#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close)
+       syscall(SYS_close, fd);
+#else
+       close(fd);
+#endif
+
+       if (nread < 1) {
+               goto label_error;
+       }
+       for (i = 0; i < sizeof(enabled_states)/sizeof(const char *);
+           i++) {
+               if (strncmp(buf, enabled_states[i], (size_t)nread) == 0) {
+                       thp_initially_huge = thp_initially_huge_states[i];
+                       return;
+               }
+       }
+
+label_error:
+       thp_initially_huge = false;
+}
+
 void
 arena_boot(void)
 {
        unsigned i;
 
+       if (config_thp && opt_thp) {
+               init_thp_initially_huge();
+       }
+
        arena_lg_dirty_mult_default_set(opt_lg_dirty_mult);
        arena_decay_time_default_set(opt_decay_time);
 
@@ -3790,15 +3884,8 @@ arena_boot(void)
        arena_maxrun = chunksize - (map_bias << LG_PAGE);
        assert(arena_maxrun > 0);
        large_maxclass = index2size(size2index(chunksize)-1);
-       if (large_maxclass > arena_maxrun) {
-               /*
-                * For small chunk sizes it's possible for there to be fewer
-                * non-header pages available than are necessary to serve the
-                * size classes just below chunksize.
-                */
-               large_maxclass = arena_maxrun;
-       }
        assert(large_maxclass > 0);
+       assert(large_maxclass + large_pad <= arena_maxrun);
        nlclasses = size2index(large_maxclass) - size2index(SMALL_MAXCLASS);
        nhclasses = NSIZES - nlclasses - NBINS;
 

Modified: head/contrib/jemalloc/src/chunk.c
==============================================================================
--- head/contrib/jemalloc/src/chunk.c   Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/src/chunk.c   Thu Mar  2 01:14:48 2017        
(r314529)
@@ -141,7 +141,7 @@ chunk_hooks_assure_initialized(tsdn_t *t
 }
 
 bool
-chunk_register(tsdn_t *tsdn, const void *chunk, const extent_node_t *node)
+chunk_register(const void *chunk, const extent_node_t *node, bool *gdump)
 {
 
        assert(extent_node_addr_get(node) == chunk);
@@ -160,8 +160,7 @@ chunk_register(tsdn_t *tsdn, const void 
                         */
                        high = atomic_read_z(&highchunks);
                }
-               if (cur > high && prof_gdump_get_unlocked())
-                       prof_gdump(tsdn);
+               *gdump = (cur > high && prof_gdump_get_unlocked());
        }
 
        return (false);
@@ -189,12 +188,17 @@ chunk_deregister(const void *chunk, cons
 static extent_node_t *
 chunk_first_best_fit(arena_t *arena, extent_tree_t *chunks_szsnad, size_t size)
 {
+       extent_node_t *node;
+       size_t qsize;
        extent_node_t key;
 
        assert(size == CHUNK_CEILING(size));
 
-       extent_node_init(&key, arena, NULL, size, 0, false, false);
-       return (extent_tree_szsnad_nsearch(chunks_szsnad, &key));
+       qsize = extent_size_quantize_ceil(size);
+       extent_node_init(&key, arena, NULL, qsize, 0, false, false);
+       node = extent_tree_szsnad_nsearch(chunks_szsnad, &key);
+       assert(node == NULL || extent_node_size_get(node) >= size);
+       return node;
 }
 
 static void *

Modified: head/contrib/jemalloc/src/chunk_dss.c
==============================================================================
--- head/contrib/jemalloc/src/chunk_dss.c       Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/src/chunk_dss.c       Thu Mar  2 01:14:48 2017        
(r314529)
@@ -115,8 +115,9 @@ chunk_alloc_dss(tsdn_t *tsdn, arena_t *a
                 * malloc.
                 */
                while (true) {
-                       void *ret, *cpad, *max_cur, *dss_next, *dss_prev;
-                       size_t gap_size, cpad_size;
+                       void *ret, *max_cur, *dss_next, *dss_prev;
+                       void *gap_addr_chunk, *gap_addr_subchunk;
+                       size_t gap_size_chunk, gap_size_subchunk;
                        intptr_t incr;
 
                        max_cur = chunk_dss_max_update(new_addr);
@@ -124,25 +125,32 @@ chunk_alloc_dss(tsdn_t *tsdn, arena_t *a
                                goto label_oom;
 
                        /*
-                        * Calculate how much padding is necessary to
-                        * chunk-align the end of the DSS.
-                        */
-                       gap_size = (chunksize - CHUNK_ADDR2OFFSET(dss_max)) &
-                           chunksize_mask;
-                       /*
-                        * Compute how much chunk-aligned pad space (if any) is
+                        * Compute how much chunk-aligned gap space (if any) is
                         * necessary to satisfy alignment.  This space can be
                         * recycled for later use.
                         */
-                       cpad = (void *)((uintptr_t)dss_max + gap_size);
-                       ret = (void *)ALIGNMENT_CEILING((uintptr_t)dss_max,
-                           alignment);
-                       cpad_size = (uintptr_t)ret - (uintptr_t)cpad;
+                       gap_addr_chunk = (void *)(CHUNK_CEILING(
+                           (uintptr_t)max_cur));
+                       ret = (void *)ALIGNMENT_CEILING(
+                           (uintptr_t)gap_addr_chunk, alignment);
+                       gap_size_chunk = (uintptr_t)ret -
+                           (uintptr_t)gap_addr_chunk;
+                       /*
+                        * Compute the address just past the end of the desired
+                        * allocation space.
+                        */
                        dss_next = (void *)((uintptr_t)ret + size);
-                       if ((uintptr_t)ret < (uintptr_t)dss_max ||
-                           (uintptr_t)dss_next < (uintptr_t)dss_max)
+                       if ((uintptr_t)ret < (uintptr_t)max_cur ||
+                           (uintptr_t)dss_next < (uintptr_t)max_cur)
                                goto label_oom; /* Wrap-around. */
-                       incr = gap_size + cpad_size + size;
+                       /* Compute the increment, including subchunk bytes. */
+                       gap_addr_subchunk = max_cur;
+                       gap_size_subchunk = (uintptr_t)ret -
+                           (uintptr_t)gap_addr_subchunk;
+                       incr = gap_size_subchunk + size;
+
+                       assert((uintptr_t)max_cur + incr == (uintptr_t)ret +
+                           size);
 
                        /*
                         * Optimistically update dss_max, and roll back below if
@@ -157,11 +165,12 @@ chunk_alloc_dss(tsdn_t *tsdn, arena_t *a
                        dss_prev = chunk_dss_sbrk(incr);
                        if (dss_prev == max_cur) {
                                /* Success. */
-                               if (cpad_size != 0) {
+                               if (gap_size_chunk != 0) {
                                        chunk_hooks_t chunk_hooks =
                                            CHUNK_HOOKS_INITIALIZER;
                                        chunk_dalloc_wrapper(tsdn, arena,
-                                           &chunk_hooks, cpad, cpad_size,
+                                           &chunk_hooks, gap_addr_chunk,
+                                           gap_size_chunk,
                                            arena_extent_sn_next(arena), false,
                                            true);
                                }

Modified: head/contrib/jemalloc/src/ctl.c
==============================================================================
--- head/contrib/jemalloc/src/ctl.c     Thu Mar  2 00:27:21 2017        
(r314528)
+++ head/contrib/jemalloc/src/ctl.c     Thu Mar  2 01:14:48 2017        
(r314529)
@@ -84,6 +84,7 @@ CTL_PROTO(config_prof_libgcc)
 CTL_PROTO(config_prof_libunwind)
 CTL_PROTO(config_stats)
 CTL_PROTO(config_tcache)
+CTL_PROTO(config_thp)
 CTL_PROTO(config_tls)
 CTL_PROTO(config_utrace)
 CTL_PROTO(config_valgrind)
@@ -104,6 +105,7 @@ CTL_PROTO(opt_utrace)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to