blob: d1e7ad91a07c6e2739aa7a874b6f45050c9cf0df [file] [log] [blame]
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_GC_ALLOCATOR_ROSALLOC_H_
18#define ART_RUNTIME_GC_ALLOCATOR_ROSALLOC_H_
19
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070020#include <stdint.h>
21#include <stdlib.h>
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070022#include <sys/mman.h>
Ian Rogers700a4022014-05-19 16:49:03 -070023#include <memory>
24#include <set>
25#include <string>
26#include <unordered_set>
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070027#include <vector>
28
Mathieu Chartier58553c72014-09-16 16:25:55 -070029#include "base/allocator.h"
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070030#include "base/mutex.h"
31#include "base/logging.h"
32#include "globals.h"
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -080033#include "mem_map.h"
Ian Rogerse63db272014-07-15 15:36:11 -070034#include "thread.h"
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070035#include "utils.h"
36
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070037namespace art {
38namespace gc {
39namespace allocator {
40
Ian Rogers6fac4472014-02-25 17:01:10 -080041// A runs-of-slots memory allocator.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070042class RosAlloc {
43 private:
Ian Rogers6fac4472014-02-25 17:01:10 -080044 // Represents a run of free pages.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070045 class FreePageRun {
46 public:
Ian Rogers13735952014-10-08 12:43:28 -070047 uint8_t magic_num_; // The magic number used for debugging only.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070048
49 bool IsFree() const {
Mathieu Chartiera1c1c712014-06-23 17:53:09 -070050 return !kIsDebugBuild || magic_num_ == kMagicNumFree;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070051 }
52 size_t ByteSize(RosAlloc* rosalloc) const EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
Ian Rogers13735952014-10-08 12:43:28 -070053 const uint8_t* fpr_base = reinterpret_cast<const uint8_t*>(this);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070054 size_t pm_idx = rosalloc->ToPageMapIndex(fpr_base);
55 size_t byte_size = rosalloc->free_page_run_size_map_[pm_idx];
56 DCHECK_GE(byte_size, static_cast<size_t>(0));
Mathieu Chartier58553c72014-09-16 16:25:55 -070057 DCHECK_ALIGNED(byte_size, kPageSize);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070058 return byte_size;
59 }
60 void SetByteSize(RosAlloc* rosalloc, size_t byte_size)
61 EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
62 DCHECK_EQ(byte_size % kPageSize, static_cast<size_t>(0));
Ian Rogers13735952014-10-08 12:43:28 -070063 uint8_t* fpr_base = reinterpret_cast<uint8_t*>(this);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070064 size_t pm_idx = rosalloc->ToPageMapIndex(fpr_base);
65 rosalloc->free_page_run_size_map_[pm_idx] = byte_size;
66 }
67 void* Begin() {
68 return reinterpret_cast<void*>(this);
69 }
70 void* End(RosAlloc* rosalloc) EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
Ian Rogers13735952014-10-08 12:43:28 -070071 uint8_t* fpr_base = reinterpret_cast<uint8_t*>(this);
72 uint8_t* end = fpr_base + ByteSize(rosalloc);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -070073 return end;
74 }
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -080075 bool IsLargerThanPageReleaseThreshold(RosAlloc* rosalloc)
76 EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
77 return ByteSize(rosalloc) >= rosalloc->page_release_size_threshold_;
78 }
79 bool IsAtEndOfSpace(RosAlloc* rosalloc)
80 EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
Ian Rogers13735952014-10-08 12:43:28 -070081 return reinterpret_cast<uint8_t*>(this) + ByteSize(rosalloc) == rosalloc->base_ + rosalloc->footprint_;
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -080082 }
83 bool ShouldReleasePages(RosAlloc* rosalloc) EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
84 switch (rosalloc->page_release_mode_) {
85 case kPageReleaseModeNone:
86 return false;
87 case kPageReleaseModeEnd:
88 return IsAtEndOfSpace(rosalloc);
89 case kPageReleaseModeSize:
90 return IsLargerThanPageReleaseThreshold(rosalloc);
91 case kPageReleaseModeSizeAndEnd:
92 return IsLargerThanPageReleaseThreshold(rosalloc) && IsAtEndOfSpace(rosalloc);
93 case kPageReleaseModeAll:
94 return true;
95 default:
96 LOG(FATAL) << "Unexpected page release mode ";
97 return false;
98 }
99 }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700100 void ReleasePages(RosAlloc* rosalloc) EXCLUSIVE_LOCKS_REQUIRED(rosalloc->lock_) {
Ian Rogers13735952014-10-08 12:43:28 -0700101 uint8_t* start = reinterpret_cast<uint8_t*>(this);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700102 size_t byte_size = ByteSize(rosalloc);
103 DCHECK_EQ(byte_size % kPageSize, static_cast<size_t>(0));
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700104 if (ShouldReleasePages(rosalloc)) {
105 rosalloc->ReleasePageRange(start, start + byte_size);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700106 }
107 }
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700108
109 private:
110 DISALLOW_COPY_AND_ASSIGN(FreePageRun);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700111 };
112
113 // Represents a run of memory slots of the same size.
114 //
115 // A run's memory layout:
116 //
117 // +-------------------+
118 // | magic_num |
119 // +-------------------+
120 // | size_bracket_idx |
121 // +-------------------+
122 // | is_thread_local |
123 // +-------------------+
124 // | to_be_bulk_freed |
125 // +-------------------+
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700126 // | top_bitmap_idx |
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700127 // +-------------------+
128 // | |
129 // | alloc bit map |
130 // | |
131 // +-------------------+
132 // | |
133 // | bulk free bit map |
134 // | |
135 // +-------------------+
136 // | |
137 // | thread-local free |
138 // | bit map |
139 // | |
140 // +-------------------+
141 // | padding due to |
142 // | alignment |
143 // +-------------------+
144 // | slot 0 |
145 // +-------------------+
146 // | slot 1 |
147 // +-------------------+
148 // | slot 2 |
149 // +-------------------+
150 // ...
151 // +-------------------+
152 // | last slot |
153 // +-------------------+
154 //
155 class Run {
156 public:
Ian Rogers13735952014-10-08 12:43:28 -0700157 uint8_t magic_num_; // The magic number used for debugging.
158 uint8_t size_bracket_idx_; // The index of the size bracket of this run.
159 uint8_t is_thread_local_; // True if this run is used as a thread-local run.
160 uint8_t to_be_bulk_freed_; // Used within BulkFree() to flag a run that's involved with a bulk free.
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700161 uint32_t first_search_vec_idx_; // The index of the first bitmap vector which may contain an available slot.
162 uint32_t alloc_bit_map_[0]; // The bit map that allocates if each slot is in use.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700163
164 // bulk_free_bit_map_[] : The bit map that is used for GC to
165 // temporarily mark the slots to free without using a lock. After
166 // all the slots to be freed in a run are marked, all those slots
167 // get freed in bulk with one locking per run, as opposed to one
168 // locking per slot to minimize the lock contention. This is used
169 // within BulkFree().
170
171 // thread_local_free_bit_map_[] : The bit map that is used for GC
172 // to temporarily mark the slots to free in a thread-local run
173 // without using a lock (without synchronizing the thread that
174 // owns the thread-local run.) When the thread-local run becomes
175 // full, the thread will check this bit map and update the
176 // allocation bit map of the run (that is, the slots get freed.)
177
178 // Returns the byte size of the header except for the bit maps.
179 static size_t fixed_header_size() {
180 Run temp;
Ian Rogers13735952014-10-08 12:43:28 -0700181 size_t size = reinterpret_cast<uint8_t*>(&temp.alloc_bit_map_) - reinterpret_cast<uint8_t*>(&temp);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700182 DCHECK_EQ(size, static_cast<size_t>(8));
183 return size;
184 }
185 // Returns the base address of the free bit map.
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800186 uint32_t* BulkFreeBitMap() {
Ian Rogers13735952014-10-08 12:43:28 -0700187 return reinterpret_cast<uint32_t*>(reinterpret_cast<uint8_t*>(this) + bulkFreeBitMapOffsets[size_bracket_idx_]);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700188 }
189 // Returns the base address of the thread local free bit map.
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800190 uint32_t* ThreadLocalFreeBitMap() {
Ian Rogers13735952014-10-08 12:43:28 -0700191 return reinterpret_cast<uint32_t*>(reinterpret_cast<uint8_t*>(this) + threadLocalFreeBitMapOffsets[size_bracket_idx_]);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700192 }
193 void* End() {
Ian Rogers13735952014-10-08 12:43:28 -0700194 return reinterpret_cast<uint8_t*>(this) + kPageSize * numOfPages[size_bracket_idx_];
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700195 }
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700196 // Returns the number of bitmap words per run.
197 size_t NumberOfBitmapVectors() const {
198 return RoundUp(numOfSlots[size_bracket_idx_], 32) / 32;
199 }
200 void SetIsThreadLocal(bool is_thread_local) {
201 is_thread_local_ = is_thread_local ? 1 : 0;
202 }
203 bool IsThreadLocal() const {
204 return is_thread_local_ != 0;
205 }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700206 // Frees slots in the allocation bit map with regard to the
207 // thread-local free bit map. Used when a thread-local run becomes
208 // full.
209 bool MergeThreadLocalFreeBitMapToAllocBitMap(bool* is_all_free_after_out);
210 // Frees slots in the allocation bit map with regard to the bulk
211 // free bit map. Used in a bulk free.
212 void MergeBulkFreeBitMapIntoAllocBitMap();
213 // Unions the slots to be freed in the free bit map into the
214 // thread-local free bit map. In a bulk free, as a two-step
215 // process, GC will first record all the slots to free in a run in
216 // the free bit map where it can write without a lock, and later
217 // acquire a lock once per run to union the bits of the free bit
218 // map to the thread-local free bit map.
219 void UnionBulkFreeBitMapToThreadLocalFreeBitMap();
220 // Allocates a slot in a run.
221 void* AllocSlot();
222 // Frees a slot in a run. This is used in a non-bulk free.
223 void FreeSlot(void* ptr);
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700224 // Marks the slots to free in the bulk free bit map. Returns the bracket size.
225 size_t MarkBulkFreeBitMap(void* ptr);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700226 // Marks the slots to free in the thread-local free bit map.
227 void MarkThreadLocalFreeBitMap(void* ptr);
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700228 // Last word mask, all of the bits in the last word which aren't valid slots are set to
229 // optimize allocation path.
Andreas Gampe59e67602014-04-25 17:15:12 -0700230 static uint32_t GetBitmapLastVectorMask(size_t num_slots, size_t num_vec);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700231 // Returns true if all the slots in the run are not in use.
232 bool IsAllFree();
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700233 // Returns the number of free slots.
234 size_t NumberOfFreeSlots();
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700235 // Returns true if all the slots in the run are in use.
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700236 ALWAYS_INLINE bool IsFull();
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800237 // Returns true if the bulk free bit map is clean.
238 bool IsBulkFreeBitmapClean();
239 // Returns true if the thread local free bit map is clean.
240 bool IsThreadLocalFreeBitmapClean();
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700241 // Set the alloc_bit_map_ bits for slots that are past the end of the run.
242 void SetAllocBitMapBitsForInvalidSlots();
243 // Zero the run's data.
244 void ZeroData();
245 // Zero the run's header.
246 void ZeroHeader();
247 // Fill the alloc bitmap with 1s.
248 void FillAllocBitMap();
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700249 // Iterate over all the slots and apply the given function.
250 void InspectAllSlots(void (*handler)(void* start, void* end, size_t used_bytes, void* callback_arg), void* arg);
251 // Dump the run metadata for debugging.
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800252 std::string Dump();
253 // Verify for debugging.
Andreas Gamped7576322014-10-24 22:13:45 -0700254 void Verify(Thread* self, RosAlloc* rosalloc, bool running_on_valgrind)
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800255 EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_)
256 EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_list_lock_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700257
258 private:
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700259 // The common part of MarkFreeBitMap() and MarkThreadLocalFreeBitMap(). Returns the bracket
260 // size.
261 size_t MarkFreeBitMapShared(void* ptr, uint32_t* free_bit_map_base, const char* caller_name);
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800262 // Turns the bit map into a string for debugging.
263 static std::string BitMapToStr(uint32_t* bit_map_base, size_t num_vec);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700264
265 // TODO: DISALLOW_COPY_AND_ASSIGN(Run);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700266 };
267
268 // The magic number for a run.
Ian Rogers13735952014-10-08 12:43:28 -0700269 static constexpr uint8_t kMagicNum = 42;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700270 // The magic number for free pages.
Ian Rogers13735952014-10-08 12:43:28 -0700271 static constexpr uint8_t kMagicNumFree = 43;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700272 // The number of size brackets. Sync this with the length of Thread::rosalloc_runs_.
Ian Rogers13735952014-10-08 12:43:28 -0700273 static constexpr size_t kNumOfSizeBrackets = kNumRosAllocThreadLocalSizeBrackets;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700274 // The number of smaller size brackets that are 16 bytes apart.
Ian Rogers13735952014-10-08 12:43:28 -0700275 static constexpr size_t kNumOfQuantumSizeBrackets = 32;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700276 // The sizes (the slot sizes, in bytes) of the size brackets.
277 static size_t bracketSizes[kNumOfSizeBrackets];
278 // The numbers of pages that are used for runs for each size bracket.
279 static size_t numOfPages[kNumOfSizeBrackets];
280 // The numbers of slots of the runs for each size bracket.
281 static size_t numOfSlots[kNumOfSizeBrackets];
282 // The header sizes in bytes of the runs for each size bracket.
283 static size_t headerSizes[kNumOfSizeBrackets];
284 // The byte offsets of the bulk free bit maps of the runs for each size bracket.
285 static size_t bulkFreeBitMapOffsets[kNumOfSizeBrackets];
286 // The byte offsets of the thread-local free bit maps of the runs for each size bracket.
287 static size_t threadLocalFreeBitMapOffsets[kNumOfSizeBrackets];
288
289 // Initialize the run specs (the above arrays).
290 static void Initialize();
291 static bool initialized_;
292
293 // Returns the byte size of the bracket size from the index.
294 static size_t IndexToBracketSize(size_t idx) {
Ian Rogers59c07062014-10-10 13:03:39 -0700295 DCHECK_LT(idx, kNumOfSizeBrackets);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700296 return bracketSizes[idx];
297 }
298 // Returns the index of the size bracket from the bracket size.
299 static size_t BracketSizeToIndex(size_t size) {
300 DCHECK(16 <= size && ((size < 1 * KB && size % 16 == 0) || size == 1 * KB || size == 2 * KB));
301 size_t idx;
302 if (UNLIKELY(size == 1 * KB)) {
303 idx = kNumOfSizeBrackets - 2;
304 } else if (UNLIKELY(size == 2 * KB)) {
305 idx = kNumOfSizeBrackets - 1;
306 } else {
307 DCHECK(size < 1 * KB);
308 DCHECK_EQ(size % 16, static_cast<size_t>(0));
309 idx = size / 16 - 1;
310 }
311 DCHECK(bracketSizes[idx] == size);
312 return idx;
313 }
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700314 // Returns true if the given allocation size is for a thread local allocation.
315 static bool IsSizeForThreadLocal(size_t size) {
316 DCHECK_GT(kNumThreadLocalSizeBrackets, 0U);
317 size_t max_thread_local_bracket_idx = kNumThreadLocalSizeBrackets - 1;
318 bool is_size_for_thread_local = size <= bracketSizes[max_thread_local_bracket_idx];
319 DCHECK(size > kLargeSizeThreshold ||
320 (is_size_for_thread_local == (SizeToIndex(size) < kNumThreadLocalSizeBrackets)));
321 return is_size_for_thread_local;
322 }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700323 // Rounds up the size up the nearest bracket size.
324 static size_t RoundToBracketSize(size_t size) {
325 DCHECK(size <= kLargeSizeThreshold);
326 if (LIKELY(size <= 512)) {
327 return RoundUp(size, 16);
328 } else if (512 < size && size <= 1 * KB) {
329 return 1 * KB;
330 } else {
331 DCHECK(1 * KB < size && size <= 2 * KB);
332 return 2 * KB;
333 }
334 }
335 // Returns the size bracket index from the byte size with rounding.
336 static size_t SizeToIndex(size_t size) {
337 DCHECK(size <= kLargeSizeThreshold);
338 if (LIKELY(size <= 512)) {
339 return RoundUp(size, 16) / 16 - 1;
340 } else if (512 < size && size <= 1 * KB) {
341 return kNumOfSizeBrackets - 2;
342 } else {
343 DCHECK(1 * KB < size && size <= 2 * KB);
344 return kNumOfSizeBrackets - 1;
345 }
346 }
347 // A combination of SizeToIndex() and RoundToBracketSize().
348 static size_t SizeToIndexAndBracketSize(size_t size, size_t* bracket_size_out) {
349 DCHECK(size <= kLargeSizeThreshold);
350 if (LIKELY(size <= 512)) {
351 size_t bracket_size = RoundUp(size, 16);
352 *bracket_size_out = bracket_size;
353 size_t idx = bracket_size / 16 - 1;
354 DCHECK_EQ(bracket_size, IndexToBracketSize(idx));
355 return idx;
356 } else if (512 < size && size <= 1 * KB) {
357 size_t bracket_size = 1024;
358 *bracket_size_out = bracket_size;
359 size_t idx = kNumOfSizeBrackets - 2;
360 DCHECK_EQ(bracket_size, IndexToBracketSize(idx));
361 return idx;
362 } else {
363 DCHECK(1 * KB < size && size <= 2 * KB);
364 size_t bracket_size = 2048;
365 *bracket_size_out = bracket_size;
366 size_t idx = kNumOfSizeBrackets - 1;
367 DCHECK_EQ(bracket_size, IndexToBracketSize(idx));
368 return idx;
369 }
370 }
371 // Returns the page map index from an address. Requires that the
372 // address is page size aligned.
373 size_t ToPageMapIndex(const void* addr) const {
Andreas Gamped7576322014-10-24 22:13:45 -0700374 DCHECK_LE(base_, addr);
375 DCHECK_LT(addr, base_ + capacity_);
Ian Rogers13735952014-10-08 12:43:28 -0700376 size_t byte_offset = reinterpret_cast<const uint8_t*>(addr) - base_;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700377 DCHECK_EQ(byte_offset % static_cast<size_t>(kPageSize), static_cast<size_t>(0));
378 return byte_offset / kPageSize;
379 }
380 // Returns the page map index from an address with rounding.
Andreas Gamped7576322014-10-24 22:13:45 -0700381 size_t RoundDownToPageMapIndex(const void* addr) const {
Ian Rogers13735952014-10-08 12:43:28 -0700382 DCHECK(base_ <= addr && addr < reinterpret_cast<uint8_t*>(base_) + capacity_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700383 return (reinterpret_cast<uintptr_t>(addr) - reinterpret_cast<uintptr_t>(base_)) / kPageSize;
384 }
385
386 // A memory allocation request larger than this size is treated as a large object and allocated
387 // at a page-granularity.
388 static const size_t kLargeSizeThreshold = 2048;
389
Hiroshi Yamauchi3c2856e2013-11-22 13:42:53 -0800390 // If true, check that the returned memory is actually zero.
391 static constexpr bool kCheckZeroMemory = kIsDebugBuild;
Andreas Gamped7576322014-10-24 22:13:45 -0700392 // Valgrind protects memory, so do not check memory when running under valgrind. In a normal
393 // build with kCheckZeroMemory the whole test should be optimized away.
394 // TODO: Unprotect before checks.
395 ALWAYS_INLINE bool ShouldCheckZeroMemory();
Hiroshi Yamauchi3c2856e2013-11-22 13:42:53 -0800396
397 // If true, log verbose details of operations.
398 static constexpr bool kTraceRosAlloc = false;
399
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700400 struct hash_run {
401 size_t operator()(const RosAlloc::Run* r) const {
402 return reinterpret_cast<size_t>(r);
403 }
404 };
405
406 struct eq_run {
407 bool operator()(const RosAlloc::Run* r1, const RosAlloc::Run* r2) const {
408 return r1 == r2;
409 }
410 };
411
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800412 public:
413 // Different page release modes.
414 enum PageReleaseMode {
415 kPageReleaseModeNone, // Release no empty pages.
416 kPageReleaseModeEnd, // Release empty pages at the end of the space.
417 kPageReleaseModeSize, // Release empty pages that are larger than the threshold.
418 kPageReleaseModeSizeAndEnd, // Release empty pages that are larger than the threshold or
419 // at the end of the space.
420 kPageReleaseModeAll, // Release all empty pages.
421 };
422
423 // The default value for page_release_size_threshold_.
424 static constexpr size_t kDefaultPageReleaseSizeThreshold = 4 * MB;
425
Mathieu Chartier0651d412014-04-29 14:37:57 -0700426 // We use thread-local runs for the size Brackets whose indexes
427 // are less than this index. We use shared (current) runs for the rest.
Hiroshi Yamauchi3f3c6c02014-11-20 14:16:06 -0800428 static const size_t kNumThreadLocalSizeBrackets = 8;
Mathieu Chartier0651d412014-04-29 14:37:57 -0700429
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800430 private:
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700431 // The base address of the memory region that's managed by this allocator.
Ian Rogers13735952014-10-08 12:43:28 -0700432 uint8_t* base_;
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700433
434 // The footprint in bytes of the currently allocated portion of the
435 // memory region.
436 size_t footprint_;
437
438 // The maximum footprint. The address, base_ + capacity_, indicates
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -0800439 // the end of the memory region that's currently managed by this allocator.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700440 size_t capacity_;
441
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -0800442 // The maximum capacity. The address, base_ + max_capacity_, indicates
443 // the end of the memory region that's ever managed by this allocator.
444 size_t max_capacity_;
445
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700446 // The run sets that hold the runs whose slots are not all
447 // full. non_full_runs_[i] is guarded by size_bracket_locks_[i].
Mathieu Chartier58553c72014-09-16 16:25:55 -0700448 AllocationTrackingSet<Run*, kAllocatorTagRosAlloc> non_full_runs_[kNumOfSizeBrackets];
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700449 // The run sets that hold the runs whose slots are all full. This is
450 // debug only. full_runs_[i] is guarded by size_bracket_locks_[i].
Mathieu Chartier58553c72014-09-16 16:25:55 -0700451 std::unordered_set<Run*, hash_run, eq_run, TrackingAllocator<Run*, kAllocatorTagRosAlloc>>
452 full_runs_[kNumOfSizeBrackets];
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700453 // The set of free pages.
Mathieu Chartier58553c72014-09-16 16:25:55 -0700454 AllocationTrackingSet<FreePageRun*, kAllocatorTagRosAlloc> free_page_runs_ GUARDED_BY(lock_);
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700455 // The dedicated full run, it is always full and shared by all threads when revoking happens.
456 // This is an optimization since enables us to avoid a null check for revoked runs.
457 static Run* dedicated_full_run_;
458 // Using size_t to ensure that it is at least word aligned.
459 static size_t dedicated_full_run_storage_[];
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700460 // The current runs where the allocations are first attempted for
461 // the size brackes that do not use thread-local
462 // runs. current_runs_[i] is guarded by size_bracket_locks_[i].
463 Run* current_runs_[kNumOfSizeBrackets];
464 // The mutexes, one per size bracket.
465 Mutex* size_bracket_locks_[kNumOfSizeBrackets];
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700466 // Bracket lock names (since locks only have char* names).
Zuo Wangf37a88b2014-07-10 04:26:41 -0700467 std::string size_bracket_lock_names_[kNumOfSizeBrackets];
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700468 // The types of page map entries.
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700469 enum PageMapKind {
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700470 kPageMapReleased = 0, // Zero and released back to the OS.
471 kPageMapEmpty, // Zero but probably dirty.
472 kPageMapRun, // The beginning of a run.
473 kPageMapRunPart, // The non-beginning part of a run.
474 kPageMapLargeObject, // The beginning of a large object.
475 kPageMapLargeObjectPart, // The non-beginning part of a large object.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700476 };
477 // The table that indicates what pages are currently used for.
Ian Rogers13735952014-10-08 12:43:28 -0700478 volatile uint8_t* page_map_; // No GUARDED_BY(lock_) for kReadPageMapEntryWithoutLockInBulkFree.
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -0800479 size_t page_map_size_;
480 size_t max_page_map_size_;
Ian Rogers700a4022014-05-19 16:49:03 -0700481 std::unique_ptr<MemMap> page_map_mem_map_;
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -0800482
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700483 // The table that indicates the size of free page runs. These sizes
484 // are stored here to avoid storing in the free page header and
485 // release backing pages.
Mathieu Chartier58553c72014-09-16 16:25:55 -0700486 std::vector<size_t, TrackingAllocator<size_t, kAllocatorTagRosAlloc>> free_page_run_size_map_
487 GUARDED_BY(lock_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700488 // The global lock. Used to guard the page map, the free page set,
489 // and the footprint.
490 Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
491 // The reader-writer lock to allow one bulk free at a time while
Hiroshi Yamauchi70f60042014-02-03 12:31:29 -0800492 // allowing multiple individual frees at the same time. Also, this
493 // is used to avoid race conditions between BulkFree() and
494 // RevokeThreadLocalRuns() on the bulk free bitmaps.
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700495 ReaderWriterMutex bulk_free_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
496
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800497 // The page release mode.
498 const PageReleaseMode page_release_mode_;
499 // Under kPageReleaseModeSize(AndEnd), if the free page run size is
500 // greater than or equal to this value, release pages.
501 const size_t page_release_size_threshold_;
502
Andreas Gamped7576322014-10-24 22:13:45 -0700503 // Whether this allocator is running under Valgrind.
504 bool running_on_valgrind_;
505
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700506 // The base address of the memory region that's managed by this allocator.
Ian Rogers13735952014-10-08 12:43:28 -0700507 uint8_t* Begin() { return base_; }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700508 // The end address of the memory region that's managed by this allocator.
Ian Rogers13735952014-10-08 12:43:28 -0700509 uint8_t* End() { return base_ + capacity_; }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700510
511 // Page-granularity alloc/free
Ian Rogers13735952014-10-08 12:43:28 -0700512 void* AllocPages(Thread* self, size_t num_pages, uint8_t page_map_type)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700513 EXCLUSIVE_LOCKS_REQUIRED(lock_);
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700514 // Returns how many bytes were freed.
515 size_t FreePages(Thread* self, void* ptr, bool already_zero) EXCLUSIVE_LOCKS_REQUIRED(lock_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700516
517 // Allocate/free a run slot.
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700518 void* AllocFromRun(Thread* self, size_t size, size_t* bytes_allocated, size_t* usable_size,
519 size_t* bytes_tl_bulk_allocated)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700520 LOCKS_EXCLUDED(lock_);
Mathieu Chartier0651d412014-04-29 14:37:57 -0700521 // Allocate/free a run slot without acquiring locks.
522 // TODO: EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_)
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700523 void* AllocFromRunThreadUnsafe(Thread* self, size_t size, size_t* bytes_allocated,
524 size_t* usable_size, size_t* bytes_tl_bulk_allocated)
Mathieu Chartier0651d412014-04-29 14:37:57 -0700525 LOCKS_EXCLUDED(lock_);
526 void* AllocFromCurrentRunUnlocked(Thread* self, size_t idx);
527
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700528 // Returns the bracket size.
529 size_t FreeFromRun(Thread* self, void* ptr, Run* run)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700530 LOCKS_EXCLUDED(lock_);
531
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700532 // Used to allocate a new thread local run for a size bracket.
533 Run* AllocRun(Thread* self, size_t idx) LOCKS_EXCLUDED(lock_);
534
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700535 // Used to acquire a new/reused run for a size bracket. Used when a
536 // thread-local or current run gets full.
537 Run* RefillRun(Thread* self, size_t idx) LOCKS_EXCLUDED(lock_);
538
539 // The internal of non-bulk Free().
Mathieu Chartier8585bad2014-04-11 17:53:48 -0700540 size_t FreeInternal(Thread* self, void* ptr) LOCKS_EXCLUDED(lock_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700541
Hiroshi Yamauchi3c2856e2013-11-22 13:42:53 -0800542 // Allocates large objects.
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700543 void* AllocLargeObject(Thread* self, size_t size, size_t* bytes_allocated,
544 size_t* usable_size, size_t* bytes_tl_bulk_allocated)
545 LOCKS_EXCLUDED(lock_);
Hiroshi Yamauchi3c2856e2013-11-22 13:42:53 -0800546
Mathieu Chartier0651d412014-04-29 14:37:57 -0700547 // Revoke a run by adding it to non_full_runs_ or freeing the pages.
548 void RevokeRun(Thread* self, size_t idx, Run* run);
549
550 // Revoke the current runs which share an index with the thread local runs.
551 void RevokeThreadUnsafeCurrentRuns();
552
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700553 // Release a range of pages.
Ian Rogers13735952014-10-08 12:43:28 -0700554 size_t ReleasePageRange(uint8_t* start, uint8_t* end) EXCLUSIVE_LOCKS_REQUIRED(lock_);
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700555
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700556 // Dumps the page map for debugging.
557 std::string DumpPageMap() EXCLUSIVE_LOCKS_REQUIRED(lock_);
558
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700559 public:
Hiroshi Yamauchi26d69ff2014-02-27 11:27:10 -0800560 RosAlloc(void* base, size_t capacity, size_t max_capacity,
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800561 PageReleaseMode page_release_mode,
Andreas Gamped7576322014-10-24 22:13:45 -0700562 bool running_on_valgrind,
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800563 size_t page_release_size_threshold = kDefaultPageReleaseSizeThreshold);
Mathieu Chartier661974a2014-01-09 11:23:53 -0800564 ~RosAlloc();
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700565
Mathieu Chartier0651d412014-04-29 14:37:57 -0700566 // If kThreadUnsafe is true then the allocator may avoid acquiring some locks as an optimization.
567 // If used, this may cause race conditions if multiple threads are allocating at the same time.
568 template<bool kThreadSafe = true>
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700569 void* Alloc(Thread* self, size_t size, size_t* bytes_allocated, size_t* usable_size,
570 size_t* bytes_tl_bulk_allocated)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700571 LOCKS_EXCLUDED(lock_);
Mathieu Chartier8585bad2014-04-11 17:53:48 -0700572 size_t Free(Thread* self, void* ptr)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700573 LOCKS_EXCLUDED(bulk_free_lock_);
Mathieu Chartier8585bad2014-04-11 17:53:48 -0700574 size_t BulkFree(Thread* self, void** ptrs, size_t num_ptrs)
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700575 LOCKS_EXCLUDED(bulk_free_lock_);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700576
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700577 // Returns true if the given allocation request can be allocated in
578 // an existing thread local run without allocating a new run.
579 ALWAYS_INLINE bool CanAllocFromThreadLocalRun(Thread* self, size_t size);
580 // Allocate the given allocation request in an existing thread local
581 // run without allocating a new run.
582 ALWAYS_INLINE void* AllocFromThreadLocalRun(Thread* self, size_t size, size_t* bytes_allocated);
583
584 // Returns the maximum bytes that could be allocated for the given
585 // size in bulk, that is the maximum value for the
586 // bytes_allocated_bulk out param returned by RosAlloc::Alloc().
587 ALWAYS_INLINE size_t MaxBytesBulkAllocatedFor(size_t size);
588
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700589 // Returns the size of the allocated slot for a given allocated memory chunk.
Andreas Gamped7576322014-10-24 22:13:45 -0700590 size_t UsableSize(const void* ptr);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700591 // Returns the size of the allocated slot for a given size.
592 size_t UsableSize(size_t bytes) {
593 if (UNLIKELY(bytes > kLargeSizeThreshold)) {
594 return RoundUp(bytes, kPageSize);
595 } else {
596 return RoundToBracketSize(bytes);
597 }
598 }
599 // Try to reduce the current footprint by releasing the free page
600 // run at the end of the memory region, if any.
601 bool Trim();
602 // Iterates over all the memory slots and apply the given function.
603 void InspectAll(void (*handler)(void* start, void* end, size_t used_bytes, void* callback_arg),
604 void* arg)
605 LOCKS_EXCLUDED(lock_);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700606
Hiroshi Yamauchid9a88de2014-04-07 13:52:31 -0700607 // Release empty pages.
608 size_t ReleasePages() LOCKS_EXCLUDED(lock_);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700609 // Returns the current footprint.
610 size_t Footprint() LOCKS_EXCLUDED(lock_);
611 // Returns the current capacity, maximum footprint.
612 size_t FootprintLimit() LOCKS_EXCLUDED(lock_);
613 // Update the current capacity.
614 void SetFootprintLimit(size_t bytes) LOCKS_EXCLUDED(lock_);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700615
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700616 // Releases the thread-local runs assigned to the given thread back to the common set of runs.
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700617 // Returns the total bytes of free slots in the revoked thread local runs. This is to be
618 // subtracted from Heap::num_bytes_allocated_ to cancel out the ahead-of-time counting.
619 size_t RevokeThreadLocalRuns(Thread* thread);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700620 // Releases the thread-local runs assigned to all the threads back to the common set of runs.
Hiroshi Yamauchi4460a842015-03-09 11:57:48 -0700621 // Returns the total bytes of free slots in the revoked thread local runs. This is to be
622 // subtracted from Heap::num_bytes_allocated_ to cancel out the ahead-of-time counting.
623 size_t RevokeAllThreadLocalRuns() LOCKS_EXCLUDED(Locks::thread_list_lock_);
Hiroshi Yamauchic93c5302014-03-20 16:15:37 -0700624 // Assert the thread local runs of a thread are revoked.
625 void AssertThreadLocalRunsAreRevoked(Thread* thread);
626 // Assert all the thread local runs are revoked.
627 void AssertAllThreadLocalRunsAreRevoked() LOCKS_EXCLUDED(Locks::thread_list_lock_);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700628
Mathieu Chartier73d1e172014-04-11 17:53:48 -0700629 static Run* GetDedicatedFullRun() {
630 return dedicated_full_run_;
631 }
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700632 bool IsFreePage(size_t idx) const {
633 DCHECK_LT(idx, capacity_ / kPageSize);
Ian Rogers13735952014-10-08 12:43:28 -0700634 uint8_t pm_type = page_map_[idx];
Mathieu Chartiera5b5c552014-06-24 14:48:59 -0700635 return pm_type == kPageMapReleased || pm_type == kPageMapEmpty;
636 }
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700637
638 // Callbacks for InspectAll that will count the number of bytes
639 // allocated and objects allocated, respectively.
640 static void BytesAllocatedCallback(void* start, void* end, size_t used_bytes, void* arg);
641 static void ObjectsAllocatedCallback(void* start, void* end, size_t used_bytes, void* arg);
Hiroshi Yamauchi573f7d22013-12-17 11:54:23 -0800642
643 bool DoesReleaseAllPages() const {
644 return page_release_mode_ == kPageReleaseModeAll;
645 }
Hiroshi Yamauchia4adbfd2014-02-04 18:12:17 -0800646
647 // Verify for debugging.
648 void Verify() EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchi654dd482014-07-09 12:54:32 -0700649
650 void LogFragmentationAllocFailure(std::ostream& os, size_t failed_alloc_bytes);
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700651
652 private:
653 friend std::ostream& operator<<(std::ostream& os, const RosAlloc::PageMapKind& rhs);
654
655 DISALLOW_COPY_AND_ASSIGN(RosAlloc);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700656};
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700657std::ostream& operator<<(std::ostream& os, const RosAlloc::PageMapKind& rhs);
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700658
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800659// Callback from rosalloc when it needs to increase the footprint. Must be implemented somewhere
660// else (currently rosalloc_space.cc).
661void* ArtRosAllocMoreCore(allocator::RosAlloc* rosalloc, intptr_t increment);
662
Hiroshi Yamauchicf58d4a2013-09-26 14:21:22 -0700663} // namespace allocator
664} // namespace gc
665} // namespace art
666
667#endif // ART_RUNTIME_GC_ALLOCATOR_ROSALLOC_H_