| 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 | |
| 10 | struct 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 | |
| 23 | struct 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 | |
| 39 | enum errno elcm(struct elcm_params *params); |
| 40 | |