1#pragma once
2#include <errno.h>
3#include <math/fixed.h>
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7
8#define ELCM_MAX_WASTAGE_DEFAULT 1
9
10struct elcm_candidate {
11 size_t pages;
12 size_t wasted; /* bytes; negative when metadata_size_bytes exceeds slack */
13 fx32_32_t wastage; /* fraction in [0, 1) */
14 size_t distance;
15 fx32_32_t score_value;
16 size_t obj_count;
17 size_t bitmap_bytes;
18 size_t metadata_bytes;
19 size_t obj_size;
20 size_t obj_alignment;
21};
22
23struct elcm_params {
24 size_t obj_alignment;
25 size_t obj_size;
26 size_t max_wastage_pct;
27 size_t max_pages;
28 bool bias_towards_pow2;
29 size_t metadata_size_bytes;
30 size_t metadata_bits_per_obj;
31 size_t metadata_bytes_per_page;
32
33 /* If NULL, defaults to kmalloc */
34 void *(*alloc_fn)(size_t size);
35 void (*free_fn)(void *ptr, size_t size);
36 struct elcm_candidate out;
37};
38
39enum errno elcm(struct elcm_params *params);
40