Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 1 | #define JEMALLOC_TCACHE_C_ |
Jason Evans | 376b152 | 2010-02-11 14:45:59 -0800 | [diff] [blame] | 2 | #include "jemalloc/internal/jemalloc_internal.h" |
Jason Evans | 962463d | 2012-02-13 12:29:49 -0800 | [diff] [blame] | 3 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 4 | /******************************************************************************/ |
| 5 | /* Data. */ |
| 6 | |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 7 | bool opt_tcache = true; |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 8 | ssize_t opt_lg_tcache_max = LG_TCACHE_MAXCLASS_DEFAULT; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 9 | |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 10 | tcache_bin_info_t *tcache_bin_info; |
| 11 | static unsigned stack_nelms; /* Total stack elms per tcache. */ |
| 12 | |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 13 | unsigned nhbins; |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 14 | size_t tcache_maxclass; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 15 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 16 | tcaches_t *tcaches; |
| 17 | |
| 18 | /* Index of first element within tcaches that has never been used. */ |
| 19 | static unsigned tcaches_past; |
| 20 | |
| 21 | /* Head of singly linked list tracking available tcaches elements. */ |
| 22 | static tcaches_t *tcaches_avail; |
| 23 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 24 | /******************************************************************************/ |
| 25 | |
Jason Evans | f7088e6 | 2012-04-19 18:28:03 -0700 | [diff] [blame] | 26 | size_t tcache_salloc(const void *ptr) |
| 27 | { |
| 28 | |
| 29 | return (arena_salloc(ptr, false)); |
| 30 | } |
| 31 | |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 32 | void |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 33 | tcache_event_hard(tsd_t *tsd, tcache_t *tcache) |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 34 | { |
Jason Evans | d01fd19 | 2015-08-19 15:21:32 -0700 | [diff] [blame] | 35 | szind_t binind = tcache->next_gc_bin; |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 36 | tcache_bin_t *tbin = &tcache->tbins[binind]; |
| 37 | tcache_bin_info_t *tbin_info = &tcache_bin_info[binind]; |
| 38 | |
| 39 | if (tbin->low_water > 0) { |
| 40 | /* |
| 41 | * Flush (ceiling) 3/4 of the objects below the low water mark. |
| 42 | */ |
| 43 | if (binind < NBINS) { |
Jason Evans | 41cfe03 | 2015-02-13 15:28:56 -0800 | [diff] [blame] | 44 | tcache_bin_flush_small(tsd, tcache, tbin, binind, |
| 45 | tbin->ncached - tbin->low_water + (tbin->low_water |
| 46 | >> 2)); |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 47 | } else { |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 48 | tcache_bin_flush_large(tsd, tbin, binind, tbin->ncached |
| 49 | - tbin->low_water + (tbin->low_water >> 2), tcache); |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 50 | } |
| 51 | /* |
| 52 | * Reduce fill count by 2X. Limit lg_fill_div such that the |
| 53 | * fill count is always at least 1. |
| 54 | */ |
| 55 | if ((tbin_info->ncached_max >> (tbin->lg_fill_div+1)) >= 1) |
| 56 | tbin->lg_fill_div++; |
| 57 | } else if (tbin->low_water < 0) { |
| 58 | /* |
| 59 | * Increase fill count by 2X. Make sure lg_fill_div stays |
| 60 | * greater than 0. |
| 61 | */ |
| 62 | if (tbin->lg_fill_div > 1) |
| 63 | tbin->lg_fill_div--; |
| 64 | } |
| 65 | tbin->low_water = tbin->ncached; |
| 66 | |
| 67 | tcache->next_gc_bin++; |
| 68 | if (tcache->next_gc_bin == nhbins) |
| 69 | tcache->next_gc_bin = 0; |
Jason Evans | 203484e | 2012-05-02 00:30:36 -0700 | [diff] [blame] | 70 | } |
| 71 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 72 | void * |
Jason Evans | 41cfe03 | 2015-02-13 15:28:56 -0800 | [diff] [blame] | 73 | tcache_alloc_small_hard(tsd_t *tsd, arena_t *arena, tcache_t *tcache, |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 74 | tcache_bin_t *tbin, szind_t binind, bool *tcache_success) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 75 | { |
| 76 | void *ret; |
| 77 | |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 78 | arena_tcache_fill_small(tsd, arena, tbin, binind, config_prof ? |
Jason Evans | 41cfe03 | 2015-02-13 15:28:56 -0800 | [diff] [blame] | 79 | tcache->prof_accumbytes : 0); |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 80 | if (config_prof) |
| 81 | tcache->prof_accumbytes = 0; |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 82 | ret = tcache_alloc_easy(tbin, tcache_success); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 83 | |
| 84 | return (ret); |
| 85 | } |
| 86 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 87 | void |
Jason Evans | 41cfe03 | 2015-02-13 15:28:56 -0800 | [diff] [blame] | 88 | tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, |
Jason Evans | d01fd19 | 2015-08-19 15:21:32 -0700 | [diff] [blame] | 89 | szind_t binind, unsigned rem) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 90 | { |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 91 | arena_t *arena; |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 92 | void *ptr; |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 93 | unsigned i, nflush, ndeferred; |
Jason Evans | a811823 | 2011-03-14 12:56:51 -0700 | [diff] [blame] | 94 | bool merged_stats = false; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 95 | |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 96 | assert(binind < NBINS); |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 97 | assert(rem <= tbin->ncached); |
| 98 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 99 | arena = arena_choose(tsd, NULL); |
| 100 | assert(arena != NULL); |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 101 | for (nflush = tbin->ncached - rem; nflush > 0; nflush = ndeferred) { |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 102 | /* Lock the arena bin associated with the first object. */ |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 103 | arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE( |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 104 | *(tbin->avail - 1)); |
Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 105 | arena_t *bin_arena = extent_node_arena_get(&chunk->node); |
Jason Evans | 064dbfb | 2015-02-12 00:09:37 -0800 | [diff] [blame] | 106 | arena_bin_t *bin = &bin_arena->bins[binind]; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 107 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 108 | if (config_prof && bin_arena == arena) { |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 109 | if (arena_prof_accum(arena, tcache->prof_accumbytes)) |
| 110 | prof_idump(); |
Jason Evans | d34f9e7 | 2010-02-11 13:19:21 -0800 | [diff] [blame] | 111 | tcache->prof_accumbytes = 0; |
Jason Evans | e69bee0 | 2010-03-15 22:25:23 -0700 | [diff] [blame] | 112 | } |
Jason Evans | e69bee0 | 2010-03-15 22:25:23 -0700 | [diff] [blame] | 113 | |
| 114 | malloc_mutex_lock(&bin->lock); |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 115 | if (config_stats && bin_arena == arena) { |
Jason Evans | 551ebc4 | 2014-10-03 10:16:09 -0700 | [diff] [blame] | 116 | assert(!merged_stats); |
Jason Evans | a811823 | 2011-03-14 12:56:51 -0700 | [diff] [blame] | 117 | merged_stats = true; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 118 | bin->stats.nflushes++; |
| 119 | bin->stats.nrequests += tbin->tstats.nrequests; |
| 120 | tbin->tstats.nrequests = 0; |
Jason Evans | d34f9e7 | 2010-02-11 13:19:21 -0800 | [diff] [blame] | 121 | } |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 122 | ndeferred = 0; |
| 123 | for (i = 0; i < nflush; i++) { |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 124 | ptr = *(tbin->avail - 1 - i); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 125 | assert(ptr != NULL); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 126 | chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); |
Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 127 | if (extent_node_arena_get(&chunk->node) == bin_arena) { |
Jason Evans | 7393f44 | 2010-10-01 17:35:43 -0700 | [diff] [blame] | 128 | size_t pageind = ((uintptr_t)ptr - |
Jason Evans | ae4c7b4 | 2012-04-02 07:04:34 -0700 | [diff] [blame] | 129 | (uintptr_t)chunk) >> LG_PAGE; |
Qinfan Wu | ff6a31d | 2014-08-29 13:34:40 -0700 | [diff] [blame] | 130 | arena_chunk_map_bits_t *bitselm = |
| 131 | arena_bitselm_get(chunk, pageind); |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 132 | arena_dalloc_bin_junked_locked(bin_arena, chunk, |
Jason Evans | fc0b3b7 | 2014-10-09 17:54:06 -0700 | [diff] [blame] | 133 | ptr, bitselm); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 134 | } else { |
| 135 | /* |
| 136 | * This object was allocated via a different |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 137 | * arena bin than the one that is currently |
| 138 | * locked. Stash the object, so that it can be |
| 139 | * handled in a future pass. |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 140 | */ |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 141 | *(tbin->avail - 1 - ndeferred) = ptr; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 142 | ndeferred++; |
| 143 | } |
| 144 | } |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 145 | malloc_mutex_unlock(&bin->lock); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 146 | arena_decay_ticks(tsd, bin_arena, nflush - ndeferred); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 147 | } |
Jason Evans | 551ebc4 | 2014-10-03 10:16:09 -0700 | [diff] [blame] | 148 | if (config_stats && !merged_stats) { |
Jason Evans | a811823 | 2011-03-14 12:56:51 -0700 | [diff] [blame] | 149 | /* |
| 150 | * The flush loop didn't happen to flush to this thread's |
| 151 | * arena, so the stats didn't get merged. Manually do so now. |
| 152 | */ |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 153 | arena_bin_t *bin = &arena->bins[binind]; |
Jason Evans | a811823 | 2011-03-14 12:56:51 -0700 | [diff] [blame] | 154 | malloc_mutex_lock(&bin->lock); |
| 155 | bin->stats.nflushes++; |
| 156 | bin->stats.nrequests += tbin->tstats.nrequests; |
| 157 | tbin->tstats.nrequests = 0; |
| 158 | malloc_mutex_unlock(&bin->lock); |
| 159 | } |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 160 | |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 161 | memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * |
| 162 | sizeof(void *)); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 163 | tbin->ncached = rem; |
Jason Evans | 1dcb4f8 | 2011-03-21 00:18:17 -0700 | [diff] [blame] | 164 | if ((int)tbin->ncached < tbin->low_water) |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 165 | tbin->low_water = tbin->ncached; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 166 | } |
| 167 | |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 168 | void |
Jason Evans | d01fd19 | 2015-08-19 15:21:32 -0700 | [diff] [blame] | 169 | tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 170 | unsigned rem, tcache_t *tcache) |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 171 | { |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 172 | arena_t *arena; |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 173 | void *ptr; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 174 | unsigned i, nflush, ndeferred; |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 175 | bool merged_stats = false; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 176 | |
| 177 | assert(binind < nhbins); |
| 178 | assert(rem <= tbin->ncached); |
| 179 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 180 | arena = arena_choose(tsd, NULL); |
| 181 | assert(arena != NULL); |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 182 | for (nflush = tbin->ncached - rem; nflush > 0; nflush = ndeferred) { |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 183 | /* Lock the arena associated with the first object. */ |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 184 | arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE( |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 185 | *(tbin->avail - 1)); |
Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 186 | arena_t *locked_arena = extent_node_arena_get(&chunk->node); |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 187 | UNUSED bool idump; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 188 | |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 189 | if (config_prof) |
| 190 | idump = false; |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 191 | malloc_mutex_lock(&locked_arena->lock); |
| 192 | if ((config_prof || config_stats) && locked_arena == arena) { |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 193 | if (config_prof) { |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 194 | idump = arena_prof_accum_locked(arena, |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 195 | tcache->prof_accumbytes); |
| 196 | tcache->prof_accumbytes = 0; |
| 197 | } |
| 198 | if (config_stats) { |
| 199 | merged_stats = true; |
| 200 | arena->stats.nrequests_large += |
| 201 | tbin->tstats.nrequests; |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 202 | arena->stats.lstats[binind - NBINS].nrequests += |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 203 | tbin->tstats.nrequests; |
| 204 | tbin->tstats.nrequests = 0; |
| 205 | } |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 206 | } |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 207 | ndeferred = 0; |
| 208 | for (i = 0; i < nflush; i++) { |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 209 | ptr = *(tbin->avail - 1 - i); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 210 | assert(ptr != NULL); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 211 | chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); |
Jason Evans | ee41ad4 | 2015-02-15 18:04:46 -0800 | [diff] [blame] | 212 | if (extent_node_arena_get(&chunk->node) == |
| 213 | locked_arena) { |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 214 | arena_dalloc_large_junked_locked(locked_arena, |
| 215 | chunk, ptr); |
Jason Evans | fc0b3b7 | 2014-10-09 17:54:06 -0700 | [diff] [blame] | 216 | } else { |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 217 | /* |
| 218 | * This object was allocated via a different |
| 219 | * arena than the one that is currently locked. |
| 220 | * Stash the object, so that it can be handled |
| 221 | * in a future pass. |
| 222 | */ |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 223 | *(tbin->avail - 1 - ndeferred) = ptr; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 224 | ndeferred++; |
| 225 | } |
| 226 | } |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 227 | malloc_mutex_unlock(&locked_arena->lock); |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 228 | if (config_prof && idump) |
| 229 | prof_idump(); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 230 | arena_decay_ticks(tsd, locked_arena, nflush - ndeferred); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 231 | } |
Jason Evans | 551ebc4 | 2014-10-03 10:16:09 -0700 | [diff] [blame] | 232 | if (config_stats && !merged_stats) { |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 233 | /* |
| 234 | * The flush loop didn't happen to flush to this thread's |
| 235 | * arena, so the stats didn't get merged. Manually do so now. |
| 236 | */ |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 237 | malloc_mutex_lock(&arena->lock); |
| 238 | arena->stats.nrequests_large += tbin->tstats.nrequests; |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 239 | arena->stats.lstats[binind - NBINS].nrequests += |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 240 | tbin->tstats.nrequests; |
| 241 | tbin->tstats.nrequests = 0; |
| 242 | malloc_mutex_unlock(&arena->lock); |
| 243 | } |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 244 | |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 245 | memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * |
| 246 | sizeof(void *)); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 247 | tbin->ncached = rem; |
Jason Evans | 1dcb4f8 | 2011-03-21 00:18:17 -0700 | [diff] [blame] | 248 | if ((int)tbin->ncached < tbin->low_water) |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 249 | tbin->low_water = tbin->ncached; |
| 250 | } |
| 251 | |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 252 | void |
| 253 | tcache_arena_associate(tcache_t *tcache, arena_t *arena) |
| 254 | { |
| 255 | |
| 256 | if (config_stats) { |
| 257 | /* Link into list of extant tcaches. */ |
| 258 | malloc_mutex_lock(&arena->lock); |
| 259 | ql_elm_new(tcache, link); |
| 260 | ql_tail_insert(&arena->tcache_ql, tcache, link); |
| 261 | malloc_mutex_unlock(&arena->lock); |
| 262 | } |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 263 | } |
| 264 | |
| 265 | void |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 266 | tcache_arena_reassociate(tcache_t *tcache, arena_t *oldarena, arena_t *newarena) |
Jason Evans | 8bb3198 | 2014-10-07 23:14:57 -0700 | [diff] [blame] | 267 | { |
| 268 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 269 | tcache_arena_dissociate(tcache, oldarena); |
| 270 | tcache_arena_associate(tcache, newarena); |
Jason Evans | 8bb3198 | 2014-10-07 23:14:57 -0700 | [diff] [blame] | 271 | } |
| 272 | |
| 273 | void |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 274 | tcache_arena_dissociate(tcache_t *tcache, arena_t *arena) |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 275 | { |
| 276 | |
| 277 | if (config_stats) { |
| 278 | /* Unlink from list of extant tcaches. */ |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 279 | malloc_mutex_lock(&arena->lock); |
| 280 | if (config_debug) { |
| 281 | bool in_ql = false; |
| 282 | tcache_t *iter; |
| 283 | ql_foreach(iter, &arena->tcache_ql, link) { |
| 284 | if (iter == tcache) { |
| 285 | in_ql = true; |
| 286 | break; |
| 287 | } |
| 288 | } |
| 289 | assert(in_ql); |
| 290 | } |
| 291 | ql_remove(&arena->tcache_ql, tcache, link); |
| 292 | tcache_stats_merge(tcache, arena); |
| 293 | malloc_mutex_unlock(&arena->lock); |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 294 | } |
| 295 | } |
| 296 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 297 | tcache_t * |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 298 | tcache_get_hard(tsd_t *tsd) |
Ben Maurer | a7619b7 | 2014-04-15 13:28:37 -0700 | [diff] [blame] | 299 | { |
Jason Evans | 8bb3198 | 2014-10-07 23:14:57 -0700 | [diff] [blame] | 300 | arena_t *arena; |
Ben Maurer | a7619b7 | 2014-04-15 13:28:37 -0700 | [diff] [blame] | 301 | |
Jason Evans | 551ebc4 | 2014-10-03 10:16:09 -0700 | [diff] [blame] | 302 | if (!tcache_enabled_get()) { |
Jason Evans | 029d44c | 2014-10-04 11:12:53 -0700 | [diff] [blame] | 303 | if (tsd_nominal(tsd)) |
| 304 | tcache_enabled_set(false); /* Memoize. */ |
Ben Maurer | a7619b7 | 2014-04-15 13:28:37 -0700 | [diff] [blame] | 305 | return (NULL); |
| 306 | } |
Jason Evans | 8bb3198 | 2014-10-07 23:14:57 -0700 | [diff] [blame] | 307 | arena = arena_choose(tsd, NULL); |
| 308 | if (unlikely(arena == NULL)) |
| 309 | return (NULL); |
Jason Evans | fc0b3b7 | 2014-10-09 17:54:06 -0700 | [diff] [blame] | 310 | return (tcache_create(tsd, arena)); |
Ben Maurer | a7619b7 | 2014-04-15 13:28:37 -0700 | [diff] [blame] | 311 | } |
| 312 | |
| 313 | tcache_t * |
Jason Evans | fc0b3b7 | 2014-10-09 17:54:06 -0700 | [diff] [blame] | 314 | tcache_create(tsd_t *tsd, arena_t *arena) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 315 | { |
| 316 | tcache_t *tcache; |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 317 | size_t size, stack_offset; |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 318 | unsigned i; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 319 | |
Jason Evans | c2fc8c8 | 2010-10-01 18:02:43 -0700 | [diff] [blame] | 320 | size = offsetof(tcache_t, tbins) + (sizeof(tcache_bin_t) * nhbins); |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 321 | /* Naturally align the pointer stacks. */ |
| 322 | size = PTR_CEILING(size); |
| 323 | stack_offset = size; |
| 324 | size += stack_nelms * sizeof(void *); |
Jason Evans | fc0b3b7 | 2014-10-09 17:54:06 -0700 | [diff] [blame] | 325 | /* Avoid false cacheline sharing. */ |
| 326 | size = sa2u(size, CACHELINE); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 327 | |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 328 | tcache = ipallocztm(tsd, size, CACHELINE, true, false, true, |
| 329 | arena_get(0, false)); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 330 | if (tcache == NULL) |
| 331 | return (NULL); |
| 332 | |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 333 | tcache_arena_associate(tcache, arena); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 334 | |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 335 | ticker_init(&tcache->gc_ticker, TCACHE_GC_INCR); |
| 336 | |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 337 | assert((TCACHE_NSLOTS_SMALL_MAX & 1U) == 0); |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 338 | for (i = 0; i < nhbins; i++) { |
Jason Evans | 1dcb4f8 | 2011-03-21 00:18:17 -0700 | [diff] [blame] | 339 | tcache->tbins[i].lg_fill_div = 1; |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 340 | stack_offset += tcache_bin_info[i].ncached_max * sizeof(void *); |
| 341 | /* |
| 342 | * avail points past the available space. Allocations will |
| 343 | * access the slots toward higher addresses (for the benefit of |
| 344 | * prefetch). |
| 345 | */ |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 346 | tcache->tbins[i].avail = (void **)((uintptr_t)tcache + |
| 347 | (uintptr_t)stack_offset); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 348 | } |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 349 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 350 | return (tcache); |
| 351 | } |
| 352 | |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 353 | static void |
| 354 | tcache_destroy(tsd_t *tsd, tcache_t *tcache) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 355 | { |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 356 | arena_t *arena; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 357 | unsigned i; |
| 358 | |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 359 | arena = arena_choose(tsd, NULL); |
| 360 | tcache_arena_dissociate(tcache, arena); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 361 | |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 362 | for (i = 0; i < NBINS; i++) { |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 363 | tcache_bin_t *tbin = &tcache->tbins[i]; |
Jason Evans | 41cfe03 | 2015-02-13 15:28:56 -0800 | [diff] [blame] | 364 | tcache_bin_flush_small(tsd, tcache, tbin, i, 0); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 365 | |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 366 | if (config_stats && tbin->tstats.nrequests != 0) { |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 367 | arena_bin_t *bin = &arena->bins[i]; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 368 | malloc_mutex_lock(&bin->lock); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 369 | bin->stats.nrequests += tbin->tstats.nrequests; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 370 | malloc_mutex_unlock(&bin->lock); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 371 | } |
| 372 | } |
| 373 | |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 374 | for (; i < nhbins; i++) { |
| 375 | tcache_bin_t *tbin = &tcache->tbins[i]; |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 376 | tcache_bin_flush_large(tsd, tbin, i, 0, tcache); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 377 | |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 378 | if (config_stats && tbin->tstats.nrequests != 0) { |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 379 | malloc_mutex_lock(&arena->lock); |
| 380 | arena->stats.nrequests_large += tbin->tstats.nrequests; |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 381 | arena->stats.lstats[i - NBINS].nrequests += |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 382 | tbin->tstats.nrequests; |
| 383 | malloc_mutex_unlock(&arena->lock); |
| 384 | } |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 385 | } |
| 386 | |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 387 | if (config_prof && tcache->prof_accumbytes > 0 && |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 388 | arena_prof_accum(arena, tcache->prof_accumbytes)) |
Jason Evans | 88c222c | 2013-02-06 11:59:30 -0800 | [diff] [blame] | 389 | prof_idump(); |
Jason Evans | d34f9e7 | 2010-02-11 13:19:21 -0800 | [diff] [blame] | 390 | |
Qi Wang | f4a0f32 | 2015-10-27 15:12:10 -0700 | [diff] [blame] | 391 | idalloctm(tsd, tcache, false, true, true); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 392 | } |
| 393 | |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 394 | void |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 395 | tcache_cleanup(tsd_t *tsd) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 396 | { |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 397 | tcache_t *tcache; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 398 | |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 399 | if (!config_tcache) |
| 400 | return; |
| 401 | |
| 402 | if ((tcache = tsd_tcache_get(tsd)) != NULL) { |
| 403 | tcache_destroy(tsd, tcache); |
| 404 | tsd_tcache_set(tsd, NULL); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 405 | } |
| 406 | } |
| 407 | |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 408 | void |
| 409 | tcache_enabled_cleanup(tsd_t *tsd) |
| 410 | { |
| 411 | |
| 412 | /* Do nothing. */ |
| 413 | } |
| 414 | |
Jason Evans | 30e7cb1 | 2013-10-21 15:00:06 -0700 | [diff] [blame] | 415 | /* Caller must own arena->lock. */ |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 416 | void |
| 417 | tcache_stats_merge(tcache_t *tcache, arena_t *arena) |
| 418 | { |
| 419 | unsigned i; |
| 420 | |
Jason Evans | 30e7cb1 | 2013-10-21 15:00:06 -0700 | [diff] [blame] | 421 | cassert(config_stats); |
| 422 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 423 | /* Merge and reset tcache stats. */ |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 424 | for (i = 0; i < NBINS; i++) { |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 425 | arena_bin_t *bin = &arena->bins[i]; |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 426 | tcache_bin_t *tbin = &tcache->tbins[i]; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 427 | malloc_mutex_lock(&bin->lock); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 428 | bin->stats.nrequests += tbin->tstats.nrequests; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 429 | malloc_mutex_unlock(&bin->lock); |
Jason Evans | 3fa9a2f | 2010-03-07 15:34:14 -0800 | [diff] [blame] | 430 | tbin->tstats.nrequests = 0; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 431 | } |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 432 | |
| 433 | for (; i < nhbins; i++) { |
Jason Evans | b172610 | 2012-02-28 16:50:47 -0800 | [diff] [blame] | 434 | malloc_large_stats_t *lstats = &arena->stats.lstats[i - NBINS]; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 435 | tcache_bin_t *tbin = &tcache->tbins[i]; |
| 436 | arena->stats.nrequests_large += tbin->tstats.nrequests; |
| 437 | lstats->nrequests += tbin->tstats.nrequests; |
| 438 | tbin->tstats.nrequests = 0; |
| 439 | } |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 440 | } |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 441 | |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 442 | bool |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 443 | tcaches_create(tsd_t *tsd, unsigned *r_ind) |
| 444 | { |
| 445 | tcache_t *tcache; |
| 446 | tcaches_t *elm; |
| 447 | |
| 448 | if (tcaches == NULL) { |
| 449 | tcaches = base_alloc(sizeof(tcache_t *) * |
| 450 | (MALLOCX_TCACHE_MAX+1)); |
| 451 | if (tcaches == NULL) |
| 452 | return (true); |
| 453 | } |
| 454 | |
| 455 | if (tcaches_avail == NULL && tcaches_past > MALLOCX_TCACHE_MAX) |
| 456 | return (true); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 457 | tcache = tcache_create(tsd, arena_get(0, false)); |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 458 | if (tcache == NULL) |
| 459 | return (true); |
| 460 | |
| 461 | if (tcaches_avail != NULL) { |
| 462 | elm = tcaches_avail; |
| 463 | tcaches_avail = tcaches_avail->next; |
| 464 | elm->tcache = tcache; |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 465 | *r_ind = (unsigned)(elm - tcaches); |
Jason Evans | 1cb181e | 2015-01-29 15:30:47 -0800 | [diff] [blame] | 466 | } else { |
| 467 | elm = &tcaches[tcaches_past]; |
| 468 | elm->tcache = tcache; |
| 469 | *r_ind = tcaches_past; |
| 470 | tcaches_past++; |
| 471 | } |
| 472 | |
| 473 | return (false); |
| 474 | } |
| 475 | |
| 476 | static void |
| 477 | tcaches_elm_flush(tsd_t *tsd, tcaches_t *elm) |
| 478 | { |
| 479 | |
| 480 | if (elm->tcache == NULL) |
| 481 | return; |
| 482 | tcache_destroy(tsd, elm->tcache); |
| 483 | elm->tcache = NULL; |
| 484 | } |
| 485 | |
| 486 | void |
| 487 | tcaches_flush(tsd_t *tsd, unsigned ind) |
| 488 | { |
| 489 | |
| 490 | tcaches_elm_flush(tsd, &tcaches[ind]); |
| 491 | } |
| 492 | |
| 493 | void |
| 494 | tcaches_destroy(tsd_t *tsd, unsigned ind) |
| 495 | { |
| 496 | tcaches_t *elm = &tcaches[ind]; |
| 497 | tcaches_elm_flush(tsd, elm); |
| 498 | elm->next = tcaches_avail; |
| 499 | tcaches_avail = elm; |
| 500 | } |
| 501 | |
| 502 | bool |
Jason Evans | 5460aa6 | 2014-09-22 21:09:23 -0700 | [diff] [blame] | 503 | tcache_boot(void) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 504 | { |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 505 | unsigned i; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 506 | |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 507 | /* |
Jason Evans | 676df88 | 2015-09-11 20:50:20 -0700 | [diff] [blame] | 508 | * If necessary, clamp opt_lg_tcache_max, now that large_maxclass is |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 509 | * known. |
| 510 | */ |
| 511 | if (opt_lg_tcache_max < 0 || (1U << opt_lg_tcache_max) < SMALL_MAXCLASS) |
| 512 | tcache_maxclass = SMALL_MAXCLASS; |
Jason Evans | 676df88 | 2015-09-11 20:50:20 -0700 | [diff] [blame] | 513 | else if ((1U << opt_lg_tcache_max) > large_maxclass) |
| 514 | tcache_maxclass = large_maxclass; |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 515 | else |
| 516 | tcache_maxclass = (1U << opt_lg_tcache_max); |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 517 | |
Jason Evans | 5aa50a2 | 2015-05-19 17:40:37 -0700 | [diff] [blame] | 518 | nhbins = size2index(tcache_maxclass) + 1; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 519 | |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 520 | /* Initialize tcache_bin_info. */ |
| 521 | tcache_bin_info = (tcache_bin_info_t *)base_alloc(nhbins * |
| 522 | sizeof(tcache_bin_info_t)); |
| 523 | if (tcache_bin_info == NULL) |
| 524 | return (true); |
| 525 | stack_nelms = 0; |
| 526 | for (i = 0; i < NBINS; i++) { |
Jason Evans | 836bbe9 | 2015-05-19 17:47:16 -0700 | [diff] [blame] | 527 | if ((arena_bin_info[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MIN) { |
| 528 | tcache_bin_info[i].ncached_max = |
| 529 | TCACHE_NSLOTS_SMALL_MIN; |
| 530 | } else if ((arena_bin_info[i].nregs << 1) <= |
| 531 | TCACHE_NSLOTS_SMALL_MAX) { |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 532 | tcache_bin_info[i].ncached_max = |
| 533 | (arena_bin_info[i].nregs << 1); |
| 534 | } else { |
| 535 | tcache_bin_info[i].ncached_max = |
| 536 | TCACHE_NSLOTS_SMALL_MAX; |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 537 | } |
Jason Evans | 3701367 | 2012-04-06 12:41:55 -0700 | [diff] [blame] | 538 | stack_nelms += tcache_bin_info[i].ncached_max; |
| 539 | } |
| 540 | for (; i < nhbins; i++) { |
| 541 | tcache_bin_info[i].ncached_max = TCACHE_NSLOTS_LARGE; |
| 542 | stack_nelms += tcache_bin_info[i].ncached_max; |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 543 | } |
Jason Evans | 84c8eef | 2011-03-16 10:30:13 -0700 | [diff] [blame] | 544 | |
Jason Evans | cd9a134 | 2012-03-21 18:33:03 -0700 | [diff] [blame] | 545 | return (false); |
| 546 | } |