You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hello, I have been developing my application on AIFM for some time. Recently I encountered a bug with gc_cache() and CircularBuffer().
Describe the bug
In gc_cache() a GC worker first checks is_free_cache_high(), which is the size of free_regions_ over the capacity of free_regions, then tries to pick up regions from used_regions_. There is a case where the is_free_cache_high() is not satisfied by "default".
This is because the free_regions_ is constructed with free_regions_count as the argument.
The free_regions_count includes the number of real free regions that can be allocated and the number of per-core pre-allocated free regions. For example, if the kNumSocket1CPUs is set to be 30 and the free_regions_count is 76 (16 + 30 * 2), then only 16 free regions will be in the free_regions_ circular buffer and the is_free_cache_high() is not satisfied by default.
So if GC is triggered, the GC will run into an indefinite loop because the is_free_cache_high() will never be satisfied.
Priority
I think this can be fixed. I can change this line which initialized the free_regions_ from using free_regions_count as the size (capacity) argument to using free_regions_coun - 2 * helpers::kNumSocket1CPUs.
Hello, I have been developing my application on AIFM for some time. Recently I encountered a bug with
gc_cache()
andCircularBuffer()
.Describe the bug
In
gc_cache()
a GC worker first checksis_free_cache_high()
, which is the size offree_regions_
over the capacity offree_regions
, then tries to pick up regions fromused_regions_
. There is a case where theis_free_cache_high()
is not satisfied by "default".This is because the
free_regions_
is constructed withfree_regions_count
as the argument.free_regions_ = std::move(CircularBuffer<Region, false>(free_regions_count));
The
free_regions_count
includes the number of real free regions that can be allocated and the number of per-core pre-allocated free regions. For example, if thekNumSocket1CPUs
is set to be 30 and thefree_regions_count
is 76 (16 + 30 * 2), then only 16 free regions will be in thefree_regions_
circular buffer and theis_free_cache_high()
is not satisfied by default.So if GC is triggered, the GC will run into an indefinite loop because the
is_free_cache_high()
will never be satisfied.Priority
I think this can be fixed. I can change this line which initialized the
free_regions_
from usingfree_regions_count
as the size (capacity) argument to usingfree_regions_coun - 2 * helpers::kNumSocket1CPUs
.I can create a PR for this if other things are fine after the change because there may be some places where I miss.
Screenshots
The
gc_cache()
runs into an indefinite loop.server
I think the environment does not matter much in this case.
g++ version: g++ 9.2.0
kernel version: 5.14.0
The text was updated successfully, but these errors were encountered: