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 .metadata_bits_per_obj = 1,
21 .obj_size = obj_size,
22 .obj_alignment = obj_alignment,
23 .bias_towards_pow2 = true,
24 .max_wastage_pct = SLAB_ELCM_DEFAULT_MAX_WASTAGE_PCT,
25 .max_pages = SLAB_MAX_PAGES,
26 .metadata_bytes_per_page = sizeof(struct page *),
27 .alloc_fn = initialized ? NULL : elcm_simple_alloc,
28 .free_fn = initialized ? NULL : elcm_simple_free,
29 };
30
31 if (elcm(params: &params) != ERR_OK)
32 return (struct slab_elcm_candidate){.pages = 0, .bitmap_size_bytes = 0};
33
34 struct elcm_candidate elc = params.out;
35 return (struct slab_elcm_candidate){.pages = elc.pages,
36 .bitmap_size_bytes = elc.bitmap_bytes,
37 .obj_count = elc.obj_count};
38}
39
40void slab_elcm_initialize() {
41 initialized = true;
42}
43