@@ -2411,6 +2411,7 @@ void qsort1(uint8_t** low, uint8_t** high, unsigned int depth);
2411
2411
#endif //USE_INTROSORT
2412
2412
2413
2413
void* virtual_alloc (size_t size);
2414
+ void* virtual_alloc (size_t size, bool use_large_pages_p);
2414
2415
void virtual_free (void* add, size_t size);
2415
2416
2416
2417
/* per heap static initialization */
@@ -2826,6 +2827,7 @@ GCSpinLock gc_heap::gc_lock;
2826
2827
2827
2828
size_t gc_heap::eph_gen_starts_size = 0;
2828
2829
heap_segment* gc_heap::segment_standby_list;
2830
+ size_t gc_heap::use_large_pages_p = 0;
2829
2831
size_t gc_heap::last_gc_index = 0;
2830
2832
#ifdef SEG_MAPPING_TABLE
2831
2833
size_t gc_heap::min_segment_size = 0;
@@ -4271,7 +4273,7 @@ typedef struct
4271
4273
4272
4274
initial_memory_details memory_details;
4273
4275
4274
- BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_heaps)
4276
+ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_heaps, bool use_large_pages_p )
4275
4277
{
4276
4278
BOOL reserve_success = FALSE;
4277
4279
@@ -4312,7 +4314,7 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4312
4314
4313
4315
size_t requestedMemory = memory_details.block_count * (normal_size + large_size);
4314
4316
4315
- uint8_t* allatonce_block = (uint8_t*)virtual_alloc (requestedMemory);
4317
+ uint8_t* allatonce_block = (uint8_t*)virtual_alloc (requestedMemory, use_large_pages_p );
4316
4318
if (allatonce_block)
4317
4319
{
4318
4320
g_gc_lowest_address = allatonce_block;
@@ -4332,10 +4334,10 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4332
4334
// try to allocate 2 blocks
4333
4335
uint8_t* b1 = 0;
4334
4336
uint8_t* b2 = 0;
4335
- b1 = (uint8_t*)virtual_alloc (memory_details.block_count * normal_size);
4337
+ b1 = (uint8_t*)virtual_alloc (memory_details.block_count * normal_size, use_large_pages_p );
4336
4338
if (b1)
4337
4339
{
4338
- b2 = (uint8_t*)virtual_alloc (memory_details.block_count * large_size);
4340
+ b2 = (uint8_t*)virtual_alloc (memory_details.block_count * large_size, use_large_pages_p );
4339
4341
if (b2)
4340
4342
{
4341
4343
memory_details.allocation_pattern = initial_memory_details::TWO_STAGE;
@@ -4368,7 +4370,7 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4368
4370
memory_details.block_size_normal :
4369
4371
memory_details.block_size_large);
4370
4372
current_block->memory_base =
4371
- (uint8_t*)virtual_alloc (block_size);
4373
+ (uint8_t*)virtual_alloc (block_size, use_large_pages_p );
4372
4374
if (current_block->memory_base == 0)
4373
4375
{
4374
4376
// Free the blocks that we've allocated so far
@@ -4476,6 +4478,11 @@ heap_segment* get_initial_segment (size_t size, int h_number)
4476
4478
}
4477
4479
4478
4480
void* virtual_alloc (size_t size)
4481
+ {
4482
+ return virtual_alloc(size, false);
4483
+ }
4484
+
4485
+ void* virtual_alloc (size_t size, bool use_large_pages_p)
4479
4486
{
4480
4487
size_t requested_size = size;
4481
4488
@@ -4496,7 +4503,8 @@ void* virtual_alloc (size_t size)
4496
4503
flags = VirtualReserveFlags::WriteWatch;
4497
4504
}
4498
4505
#endif // !FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
4499
- void* prgmem = GCToOSInterface::VirtualReserve (requested_size, card_size * card_word_width, flags);
4506
+
4507
+ void* prgmem = use_large_pages_p ? GCToOSInterface::VirtualReserveAndCommitLargePages(requested_size, card_size * card_word_width) : GCToOSInterface::VirtualReserve(requested_size, card_size * card_word_width, flags);
4500
4508
void *aligned_mem = prgmem;
4501
4509
4502
4510
// We don't want (prgmem + size) to be right at the end of the address space
@@ -9308,7 +9316,7 @@ heap_segment* gc_heap::make_heap_segment (uint8_t* new_pages, size_t size, int h
9308
9316
heap_segment_mem (new_segment) = start;
9309
9317
heap_segment_used (new_segment) = start;
9310
9318
heap_segment_reserved (new_segment) = new_pages + size;
9311
- heap_segment_committed (new_segment) = new_pages + initial_commit;
9319
+ heap_segment_committed (new_segment) = (use_large_pages_p ? heap_segment_reserved(new_segment) : ( new_pages + initial_commit)) ;
9312
9320
init_heap_segment (new_segment);
9313
9321
dprintf (2, ("Creating heap segment %Ix", (size_t)new_segment));
9314
9322
return new_segment;
@@ -9399,6 +9407,8 @@ void gc_heap::reset_heap_segment_pages (heap_segment* seg)
9399
9407
void gc_heap::decommit_heap_segment_pages (heap_segment* seg,
9400
9408
size_t extra_space)
9401
9409
{
9410
+ if (use_large_pages_p)
9411
+ return;
9402
9412
uint8_t* page_start = align_on_page (heap_segment_allocated(seg));
9403
9413
size_t size = heap_segment_committed (seg) - page_start;
9404
9414
extra_space = align_on_page (extra_space);
@@ -10108,12 +10118,15 @@ HRESULT gc_heap::initialize_gc (size_t segment_size,
10108
10118
block_count = 1;
10109
10119
#endif //MULTIPLE_HEAPS
10110
10120
10121
+ use_large_pages_p = false;
10122
+
10111
10123
if (heap_hard_limit)
10112
10124
{
10113
10125
check_commit_cs.Initialize();
10126
+ use_large_pages_p = GCConfig::GetGCLargePages();
10114
10127
}
10115
10128
10116
- if (!reserve_initial_memory(segment_size,heap_size,block_count))
10129
+ if (!reserve_initial_memory(segment_size,heap_size,block_count,use_large_pages_p ))
10117
10130
return E_OUTOFMEMORY;
10118
10131
10119
10132
#ifdef CARD_BUNDLE
0 commit comments