move slab_info to main metadata region
This commit is contained in:
parent
3f1962dd2b
commit
1e03b004f5
14
malloc.c
14
malloc.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user