include/mem/fixed_size_alloc.h View source View on GitHub
struct fixed_size_node {
struct list_head list_node;
};
struct fixed_size_page_hdr {
ssize_t domain;
size_t free_count;
size_t total;
struct list_head page_list;
};
struct fixed_size_range_attributes {
size_t obj_size;
size_t obj_align;
void (*init_obj)(void *);
void (*deinit_obj)(void *);
bool bootstrap_mode : 1;
};
struct fixed_size_range {
struct fixed_size_range_attributes attrs;
struct spinlock lock;
struct list_head freelist;
struct list_head fl_pages;
size_t empty_pages;
size_t full_node_size;
struct fixed_size_range **perdomain_fsrs;
ssize_t domain;
};
void * fixed_size_alloc(struct fixed_size_range *fsr);
void fixed_size_free(struct fixed_size_range *fsr, void *obj);
void fixed_size_reclaim_freelist_pages(struct fixed_size_range *fsr);
struct fixed_size_range * fixed_size_range_create(struct fixed_size_range_attributes *attrs);
void fixed_size_range_init(struct fixed_size_range *fsr, struct fixed_size_range_attributes *attrs);
#define FIXED_SIZE_KEEP_EMPTY_PAGES 1
#define FIXED_SIZE_RANGE_PERDOMAIN_DECLARE(name, ...) \
static void __##name##_fsr_init(struct fixed_size_range *__fsr, \
size_t __domain) { \
(void) __domain; \
static struct fixed_size_range **__perdomain_fsrs_##name = NULL; \
if (!__perdomain_fsrs_##name) \
__perdomain_fsrs_##name = kmalloc( \
sizeof(struct fixed_size_range *) * global.domain_count); \
\
struct fixed_size_range_attributes __attrs = {__VA_ARGS__}; \
fixed_size_range_init(__fsr, &__attrs); \
__perdomain_fsrs_##name[__domain] = __fsr; \
__fsr->perdomain_fsrs = __perdomain_fsrs_##name; \
__fsr->domain = __domain; \
} \
PERDOMAIN_DECLARE(__##name##_fsr, struct fixed_size_range, \
__##name##_fsr_init)
#define FSR_PERDOMAIN_THIS(name) PERDOMAIN_PTR(__##name##_fsr)
#define FSR_PERDOMAIN_ALLOC(name) fixed_size_alloc(FSR_PERDOMAIN_THIS(name))
#define FSR_PERDOMAIN_FREE(name, obj) \
fixed_size_free(FSR_PERDOMAIN_THIS(name), (obj))