Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lock region allocator #49990

Merged
merged 37 commits into from
Mar 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3d639f2
delete backport.yml so I can push to master
PeterSolMS Aug 21, 2020
c78344e
Merge remote-tracking branch 'upstream/master'
PeterSolMS Aug 27, 2020
0fc9aeb
Undo unintended changes
PeterSolMS Aug 27, 2020
9073278
Merge remote-tracking branch 'upstream/master'
PeterSolMS Aug 31, 2020
eb4f188
Merge remote-tracking branch 'upstream/master'
PeterSolMS Sep 28, 2020
c809f97
Merge remote-tracking branch 'upstream/master'
PeterSolMS Oct 2, 2020
808750e
Merge remote-tracking branch 'upstream/master'
PeterSolMS Oct 20, 2020
8985284
Merge remote-tracking branch 'upstream/master'
PeterSolMS Nov 5, 2020
61be136
Merge remote-tracking branch 'upstream/master'
PeterSolMS Nov 13, 2020
5893c56
Merge remote-tracking branch 'upstream/master'
PeterSolMS Nov 17, 2020
827db97
Merge remote-tracking branch 'upstream/master'
PeterSolMS Nov 26, 2020
a0df529
Merge remote-tracking branch 'upstream/master'
PeterSolMS Nov 30, 2020
15e891c
Merge from upstream/master
PeterSolMS Nov 30, 2020
ddea2eb
Merge remote-tracking branch 'upstream/master'
PeterSolMS Dec 1, 2020
bdeba60
delete backport.yml so I can push to master
PeterSolMS Aug 21, 2020
e5afb51
Undo unintended changes
PeterSolMS Aug 27, 2020
6887c32
Merge from upstream/master
PeterSolMS Nov 30, 2020
4f1f430
Merge branch 'master' of https://github.com/PeterSolMS/runtime-1
PeterSolMS Dec 1, 2020
989a242
Undo unintended Mono changes that somehow crept in.
PeterSolMS Dec 1, 2020
5370012
Merge remote-tracking branch 'upstream/master'
PeterSolMS Dec 7, 2020
9522406
Merge remote-tracking branch 'upstream/master'
PeterSolMS Dec 8, 2020
a31ce60
Merge remote-tracking branch 'upstream/master'
PeterSolMS Dec 16, 2020
0ba8f94
Merge remote-tracking branch 'upstream/master'
PeterSolMS Dec 21, 2020
6bc4d50
Merge remote-tracking branch 'upstream/master'
PeterSolMS Jan 7, 2021
c6f573a
Merge remote-tracking branch 'upstream/master'
PeterSolMS Jan 18, 2021
94e74a4
Merge remote-tracking branch 'upstream/master'
PeterSolMS Jan 25, 2021
871da36
Merge remote-tracking branch 'upstream/master'
PeterSolMS Jan 29, 2021
5e9cdd6
Merge remote-tracking branch 'upstream/master'
PeterSolMS Feb 4, 2021
88fadae
Merge remote-tracking branch 'upstream/master'
PeterSolMS Feb 15, 2021
3b69fdd
Merge remote-tracking branch 'upstream/master'
PeterSolMS Feb 25, 2021
7c8c021
Merge remote-tracking branch 'upstream/main' into main
PeterSolMS Mar 11, 2021
2623256
Merge remote-tracking branch 'upstream/main' into main
PeterSolMS Mar 15, 2021
9fcb397
Merge remote-tracking branch 'upstream/main' into main
PeterSolMS Mar 22, 2021
64daa81
Make region_allocator multi-thread safe by wrapping a lock around reg…
PeterSolMS Mar 22, 2021
9efeeab
Fixed deadlock in SVR GC.
PeterSolMS Mar 22, 2021
8b3bc8e
Even though this is for regions, disable USE_REGIONS for checkin.
PeterSolMS Mar 22, 2021
a338dac
Use new spin lock logic local to region_allocator rather than the gen…
PeterSolMS Mar 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/coreclr/gc/gc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3493,6 +3493,7 @@ void region_allocator::make_busy_block (uint32_t* index_start, uint32_t num_unit
#ifdef _DEBUG
dprintf (REGIONS_LOG, ("MBB[B: %Id] %d->%d", (size_t)num_units, (int)(index_start - region_map_start), (int)(index_start - region_map_start + num_units)));
#endif //_DEBUG
ASSERT_HOLDING_SPIN_LOCK (&region_allocator_lock);
*index_start = num_units;
}

Expand All @@ -3501,6 +3502,7 @@ void region_allocator::make_free_block (uint32_t* index_start, uint32_t num_unit
#ifdef _DEBUG
dprintf (REGIONS_LOG, ("MFB[F: %Id] %d->%d", (size_t)num_units, (int)(index_start - region_map_start), (int)(index_start - region_map_start + num_units)));
#endif //_DEBUG
ASSERT_HOLDING_SPIN_LOCK (&region_allocator_lock);
*index_start = region_alloc_free_bit | num_units;
}

Expand All @@ -3519,6 +3521,7 @@ void region_allocator::adjust_map (uint32_t* current_free_index_start,

void region_allocator::print_map (const char* msg)
{
ASSERT_HOLDING_SPIN_LOCK (&region_allocator_lock);
#ifdef _DEBUG
const char* heap_type = "UH";
dprintf (REGIONS_LOG, ("[%s]-----printing----%s", heap_type, msg));
Expand Down Expand Up @@ -3550,6 +3553,8 @@ uint8_t* region_allocator::allocate_end (uint32_t num_units)
{
uint8_t* alloc = NULL;

ASSERT_HOLDING_SPIN_LOCK (&region_allocator_lock);

if (global_region_used < global_region_end)
{
size_t end_remaining = global_region_end - global_region_used;
Expand All @@ -3566,8 +3571,35 @@ uint8_t* region_allocator::allocate_end (uint32_t num_units)
return alloc;
}

void region_allocator::enter_spin_lock()
{
while (true)
{
if (Interlocked::CompareExchange(&region_allocator_lock.lock, 0, -1) < 0)
break;

while (region_allocator_lock.lock >= 0)
{
YieldProcessor(); // indicate to the processor that we are spinning
}
}
#ifdef _DEBUG
region_allocator_lock.holding_thread = GCToEEInterface::GetThread();
#endif //_DEBUG
}

void region_allocator::leave_spin_lock()
{
region_allocator_lock.lock = -1;
#ifdef _DEBUG
region_allocator_lock.holding_thread = (Thread*)-1;
#endif //_DEBUG
}

uint8_t* region_allocator::allocate (uint32_t num_units)
{
enter_spin_lock();

uint32_t* current_index = region_map_start;
uint32_t* end_index = region_map_end;

Expand Down Expand Up @@ -3607,6 +3639,9 @@ uint8_t* region_allocator::allocate (uint32_t num_units)

total_free_units -= num_units;
print_map ("alloc: found in free");

leave_spin_lock();

return region_address_of (current_free_index_start);
}
}
Expand Down Expand Up @@ -3647,6 +3682,8 @@ uint8_t* region_allocator::allocate (uint32_t num_units)
dprintf (REGIONS_LOG, ("couldn't find memory at the end! only %Id bytes left", (global_region_end - global_region_used)));
}

leave_spin_lock();

return alloc;
}

Expand Down Expand Up @@ -3685,6 +3722,8 @@ bool region_allocator::allocate_large_region (uint8_t** start, uint8_t** end)

void region_allocator::delete_region (uint8_t* start)
{
enter_spin_lock();

assert (is_region_aligned (start));

print_map ("before delete");
Expand All @@ -3710,6 +3749,8 @@ void region_allocator::delete_region (uint8_t* start)

total_free_units += current_val;
print_map ("after delete");

leave_spin_lock();
}
#endif //USE_REGIONS

Expand Down
5 changes: 5 additions & 0 deletions src/coreclr/gc/gcpriv.h
Original file line number Diff line number Diff line change
Expand Up @@ -5329,6 +5329,11 @@ class region_allocator
size_t region_alignment;
size_t large_region_alignment;

GCSpinLock region_allocator_lock;

void enter_spin_lock();
void leave_spin_lock();

uint32_t* region_map_start;
uint32_t* region_map_end;

Expand Down