@@ -2403,6 +2403,7 @@ void qsort1(uint8_t** low, uint8_t** high, unsigned int depth);
2403
2403
#endif //USE_INTROSORT
2404
2404
2405
2405
void* virtual_alloc (size_t size);
2406
+ void* virtual_alloc (size_t size, bool use_large_pages_p);
2406
2407
void virtual_free (void* add, size_t size);
2407
2408
2408
2409
/* per heap static initialization */
@@ -2818,6 +2819,7 @@ GCSpinLock gc_heap::gc_lock;
2818
2819
2819
2820
size_t gc_heap::eph_gen_starts_size = 0;
2820
2821
heap_segment* gc_heap::segment_standby_list;
2822
+ size_t gc_heap::use_large_pages_p = 0;
2821
2823
size_t gc_heap::last_gc_index = 0;
2822
2824
#ifdef SEG_MAPPING_TABLE
2823
2825
size_t gc_heap::min_segment_size = 0;
@@ -4263,7 +4265,7 @@ typedef struct
4263
4265
4264
4266
initial_memory_details memory_details;
4265
4267
4266
- BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_heaps)
4268
+ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_heaps, bool use_large_pages_p )
4267
4269
{
4268
4270
BOOL reserve_success = FALSE;
4269
4271
@@ -4304,7 +4306,7 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4304
4306
4305
4307
size_t requestedMemory = memory_details.block_count * (normal_size + large_size);
4306
4308
4307
- uint8_t* allatonce_block = (uint8_t*)virtual_alloc (requestedMemory);
4309
+ uint8_t* allatonce_block = (uint8_t*)virtual_alloc (requestedMemory, use_large_pages_p );
4308
4310
if (allatonce_block)
4309
4311
{
4310
4312
g_gc_lowest_address = allatonce_block;
@@ -4324,10 +4326,10 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4324
4326
// try to allocate 2 blocks
4325
4327
uint8_t* b1 = 0;
4326
4328
uint8_t* b2 = 0;
4327
- b1 = (uint8_t*)virtual_alloc (memory_details.block_count * normal_size);
4329
+ b1 = (uint8_t*)virtual_alloc (memory_details.block_count * normal_size, use_large_pages_p );
4328
4330
if (b1)
4329
4331
{
4330
- b2 = (uint8_t*)virtual_alloc (memory_details.block_count * large_size);
4332
+ b2 = (uint8_t*)virtual_alloc (memory_details.block_count * large_size, use_large_pages_p );
4331
4333
if (b2)
4332
4334
{
4333
4335
memory_details.allocation_pattern = initial_memory_details::TWO_STAGE;
@@ -4360,7 +4362,7 @@ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t num_h
4360
4362
memory_details.block_size_normal :
4361
4363
memory_details.block_size_large);
4362
4364
current_block->memory_base =
4363
- (uint8_t*)virtual_alloc (block_size);
4365
+ (uint8_t*)virtual_alloc (block_size, use_large_pages_p );
4364
4366
if (current_block->memory_base == 0)
4365
4367
{
4366
4368
// Free the blocks that we've allocated so far
@@ -4468,6 +4470,11 @@ heap_segment* get_initial_segment (size_t size, int h_number)
4468
4470
}
4469
4471
4470
4472
void* virtual_alloc (size_t size)
4473
+ {
4474
+ return virtual_alloc(size, false);
4475
+ }
4476
+
4477
+ void* virtual_alloc (size_t size, bool use_large_pages_p)
4471
4478
{
4472
4479
size_t requested_size = size;
4473
4480
@@ -4488,7 +4495,8 @@ void* virtual_alloc (size_t size)
4488
4495
flags = VirtualReserveFlags::WriteWatch;
4489
4496
}
4490
4497
#endif // !FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
4491
- void* prgmem = GCToOSInterface::VirtualReserve (requested_size, card_size * card_word_width, flags);
4498
+
4499
+ void* prgmem = use_large_pages_p ? GCToOSInterface::VirtualReserveAndCommitLargePages(requested_size) : GCToOSInterface::VirtualReserve(requested_size, card_size * card_word_width, flags);
4492
4500
void *aligned_mem = prgmem;
4493
4501
4494
4502
// We don't want (prgmem + size) to be right at the end of the address space
@@ -5466,9 +5474,10 @@ bool gc_heap::virtual_commit (void* address, size_t size, int h_number, bool* ha
5466
5474
}
5467
5475
5468
5476
// If it's a valid heap number it means it's commiting for memory on the GC heap.
5469
- bool commit_succeeded_p = ((h_number >= 0) ?
5470
- virtual_alloc_commit_for_heap (address, size, h_number) :
5471
- GCToOSInterface::VirtualCommit(address, size));
5477
+ // In addition if large pages is enabled, we set commit_succeeded_p to true because memory is already committed.
5478
+ bool commit_succeeded_p = ((h_number >= 0) ? (use_large_pages_p ? true :
5479
+ virtual_alloc_commit_for_heap (address, size, h_number)) :
5480
+ GCToOSInterface::VirtualCommit(address, size));
5472
5481
5473
5482
if (!commit_succeeded_p && heap_hard_limit)
5474
5483
{
@@ -9219,7 +9228,7 @@ heap_segment* gc_heap::make_heap_segment (uint8_t* new_pages, size_t size, int h
9219
9228
heap_segment_mem (new_segment) = start;
9220
9229
heap_segment_used (new_segment) = start;
9221
9230
heap_segment_reserved (new_segment) = new_pages + size;
9222
- heap_segment_committed (new_segment) = new_pages + initial_commit;
9231
+ heap_segment_committed (new_segment) = (use_large_pages_p ? heap_segment_reserved(new_segment) : ( new_pages + initial_commit)) ;
9223
9232
init_heap_segment (new_segment);
9224
9233
dprintf (2, ("Creating heap segment %Ix", (size_t)new_segment));
9225
9234
return new_segment;
@@ -9310,6 +9319,8 @@ void gc_heap::reset_heap_segment_pages (heap_segment* seg)
9310
9319
void gc_heap::decommit_heap_segment_pages (heap_segment* seg,
9311
9320
size_t extra_space)
9312
9321
{
9322
+ if (use_large_pages_p)
9323
+ return;
9313
9324
uint8_t* page_start = align_on_page (heap_segment_allocated(seg));
9314
9325
size_t size = heap_segment_committed (seg) - page_start;
9315
9326
extra_space = align_on_page (extra_space);
@@ -10019,12 +10030,15 @@ HRESULT gc_heap::initialize_gc (size_t segment_size,
10019
10030
block_count = 1;
10020
10031
#endif //MULTIPLE_HEAPS
10021
10032
10033
+ use_large_pages_p = false;
10034
+
10022
10035
if (heap_hard_limit)
10023
10036
{
10024
10037
check_commit_cs.Initialize();
10038
+ use_large_pages_p = GCConfig::GetGCLargePages();
10025
10039
}
10026
10040
10027
- if (!reserve_initial_memory(segment_size,heap_size,block_count))
10041
+ if (!reserve_initial_memory(segment_size,heap_size,block_count,use_large_pages_p ))
10028
10042
return E_OUTOFMEMORY;
10029
10043
10030
10044
#ifdef CARD_BUNDLE
0 commit comments