move slab_info to main metadata region

This commit is contained in:
Daniel Micay 2018-10-18 16:01:04 -04:00
parent 3f1962dd2b
commit 1e03b004f5

View File

@ -165,6 +165,8 @@ static void *get_slab(struct size_class *c, size_t slab_size, struct slab_metada
return (char *)c->class_region_start + (index * slab_size); return (char *)c->class_region_start + (index * slab_size);
} }
#define MAX_METADATA_MAX (CLASS_REGION_SIZE / PAGE_SIZE)
static size_t get_metadata_max(size_t slab_size) { static size_t get_metadata_max(size_t slab_size) {
return CLASS_REGION_SIZE / slab_size; return CLASS_REGION_SIZE / slab_size;
} }
@ -556,6 +558,10 @@ struct region_allocator {
struct random_state rng; struct random_state rng;
}; };
struct __attribute__((aligned(PAGE_SIZE))) slab_info_mapping {
struct slab_metadata slab_info[MAX_METADATA_MAX];
};
struct __attribute__((aligned(PAGE_SIZE))) allocator_state { struct __attribute__((aligned(PAGE_SIZE))) allocator_state {
struct size_class size_class_metadata[N_SIZE_CLASSES]; struct size_class size_class_metadata[N_SIZE_CLASSES];
struct region_allocator region_allocator; struct region_allocator region_allocator;
@ -564,6 +570,8 @@ struct __attribute__((aligned(PAGE_SIZE))) allocator_state {
// padding until next page boundary for mprotect // padding until next page boundary for mprotect
struct region_metadata regions_b[MAX_REGION_TABLE_SIZE] __attribute__((aligned(PAGE_SIZE))); struct region_metadata regions_b[MAX_REGION_TABLE_SIZE] __attribute__((aligned(PAGE_SIZE)));
// padding until next page boundary for mprotect // padding until next page boundary for mprotect
struct slab_info_mapping slab_info_mapping[N_SIZE_CLASSES];
// padding until next page boundary for mprotect
}; };
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) {
@ -820,11 +828,7 @@ COLD static void init_slow_path(void) {
c->size_divisor = libdivide_u32_gen(size); c->size_divisor = libdivide_u32_gen(size);
size_t slab_size = get_slab_size(size_class_slots[class], size); size_t slab_size = get_slab_size(size_class_slots[class], size);
c->slab_size_divisor = libdivide_u64_gen(slab_size); c->slab_size_divisor = libdivide_u64_gen(slab_size);
size_t metadata_max = get_metadata_max(slab_size); c->slab_info = allocator_state->slab_info_mapping[class].slab_info;
c->slab_info = allocate_pages(metadata_max * sizeof(struct slab_metadata), PAGE_SIZE, false);
if (c->slab_info == NULL) {
fatal_error("failed to allocate slab metadata");
}
} }
deallocate_pages(rng, sizeof(struct random_state), PAGE_SIZE); deallocate_pages(rng, sizeof(struct random_state), PAGE_SIZE);