1#include <mem/elcm.h>
2#include <mem/slab.h>
3
4#include "internal.h"
5
6static bool initialized = false;
7
8static void *elcm_simple_alloc(size_t size) {
9 return simple_alloc(space: slab_global.vas, size);
10}
11
12static void elcm_simple_free(void *ptr, size_t size) {
13 simple_free(space: slab_global.vas, ptr, size);
14}
15
16struct slab_elcm_candidate slab_elcm(size_t obj_size, size_t obj_alignment) {
17 kassert(obj_size && obj_alignment);
18 struct elcm_params params = {
19 .metadata_size_bytes = sizeof(struct slab),
20#ifdef DEBUG_SLAB_DEEP
21 .metadata_bits_per_obj = 1 + sizeof(stack_handle_t) * 8,
22#else
23 .metadata_bits_per_obj = 1,
24#endif
25 .obj_size = obj_size,
26 .obj_alignment = obj_alignment,
27 .bias_towards_pow2 = true,
28 .max_wastage_pct = SLAB_ELCM_DEFAULT_MAX_WASTAGE_PCT,
29 .max_pages = SLAB_MAX_PAGES,
30 .metadata_bytes_per_page = sizeof(struct page *),
31 .alloc_fn = initialized ? NULL : elcm_simple_alloc,
32 .free_fn = initialized ? NULL : elcm_simple_free,
33 };
34
35 if (elcm(params: &params) != ERR_OK)
36 return (struct slab_elcm_candidate){.pages = 0, .bitmap_size_bytes = 0};
37
38 struct elcm_candidate elc = params.out;
39
40 return (struct slab_elcm_candidate){
41 .pages = elc.pages,
42 .bitmap_size_bytes = SLAB_BITMAP_BYTES_FOR(elc.obj_count),
43 .obj_count = elc.obj_count};
44}
45
46void slab_elcm_initialize() {
47 initialized = true;
48}
49