move slab allocator state into main state region
parent
e8eca2d430
commit
1e5dec97e0
19
malloc.c
19
malloc.c
|
@ -556,6 +556,11 @@ struct region_allocator {
|
||||||
struct random_state rng;
|
struct random_state rng;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct allocator_state {
|
||||||
|
struct size_class size_class_metadata[N_SIZE_CLASSES];
|
||||||
|
struct region_allocator region_allocator;
|
||||||
|
};
|
||||||
|
|
||||||
static void regions_quarantine_deallocate_pages(void *p, size_t size, size_t guard_size) {
|
static void regions_quarantine_deallocate_pages(void *p, size_t size, size_t guard_size) {
|
||||||
if (size >= REGION_QUARANTINE_SKIP_THRESHOLD) {
|
if (size >= REGION_QUARANTINE_SKIP_THRESHOLD) {
|
||||||
deallocate_pages(p, size, guard_size);
|
deallocate_pages(p, size, guard_size);
|
||||||
|
@ -762,10 +767,13 @@ COLD static void init_slow_path(void) {
|
||||||
size_t metadata_guard_size =
|
size_t metadata_guard_size =
|
||||||
(get_random_u64_uniform(rng, REAL_CLASS_REGION_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE;
|
(get_random_u64_uniform(rng, REAL_CLASS_REGION_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE;
|
||||||
|
|
||||||
ro.region_allocator = allocate_pages(sizeof(struct region_allocator), metadata_guard_size, true);
|
struct allocator_state *allocator_state =
|
||||||
if (ro.region_allocator == NULL) {
|
allocate_pages(sizeof(struct allocator_state), metadata_guard_size, true);
|
||||||
fatal_error("failed to allocate region allocator state");
|
if (allocator_state == NULL) {
|
||||||
|
fatal_error("failed to reserve allocator state");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ro.region_allocator = &allocator_state->region_allocator;
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
mutex_init(&ra->lock);
|
mutex_init(&ra->lock);
|
||||||
|
@ -788,10 +796,7 @@ COLD static void init_slow_path(void) {
|
||||||
}
|
}
|
||||||
ro.slab_region_end = (char *)ro.slab_region_start + slab_region_size;
|
ro.slab_region_end = (char *)ro.slab_region_start + slab_region_size;
|
||||||
|
|
||||||
ro.size_class_metadata = allocate_pages(sizeof(struct size_class) * N_SIZE_CLASSES, PAGE_SIZE, true);
|
ro.size_class_metadata = allocator_state->size_class_metadata;
|
||||||
if (ro.size_class_metadata == NULL) {
|
|
||||||
fatal_error("failed to allocate slab allocator state");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned class = 0; class < N_SIZE_CLASSES; class++) {
|
for (unsigned class = 0; class < N_SIZE_CLASSES; class++) {
|
||||||
struct size_class *c = &ro.size_class_metadata[class];
|
struct size_class *c = &ro.size_class_metadata[class];
|
||||||
|
|
Loading…
Reference in New Issue