Skip to content

Fixed Size Allocation

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))