X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/a4ec38a4c7ef61b04b92d34637c846a8e2e95f7f..c166bd62fbb907f95f79f621e2a2fb4fdde08e01:/lunaix-os/kernel/mm/cake.c diff --git a/lunaix-os/kernel/mm/cake.c b/lunaix-os/kernel/mm/cake.c index 5aa9bef..d9ef381 100644 --- a/lunaix-os/kernel/mm/cake.c +++ b/lunaix-os/kernel/mm/cake.c @@ -12,8 +12,7 @@ #include #include -#include -#include +#include #include #include @@ -28,11 +27,12 @@ struct llist_header piles = { .next = &piles, .prev = &piles }; void* __alloc_cake(unsigned int cake_pg) { - uintptr_t pa = pmm_alloc_cpage(KERNEL_PID, cake_pg, 0); - if (!pa) { + struct leaflet* leaflet = alloc_leaflet(count_order(cake_pg)); + if (!leaflet) { return NULL; } - return vmm_vmap(pa, cake_pg * PG_SIZE, PG_PREM_RW); + + return (void*)vmap(leaflet, KERNEL_DATA); } struct cake_s* @@ -44,9 +44,11 @@ __new_cake(struct cake_pile* pile) return NULL; } - int max_piece = pile->pieces_per_cake; + u32_t max_piece = pile->pieces_per_cake; - cake->first_piece = (void*)((uintptr_t)cake + pile->offset); + assert(max_piece); + + cake->first_piece = (void*)((ptr_t)cake + pile->offset); cake->next_free = 0; pile->cakes_count++; @@ -75,16 +77,16 @@ __init_pile(struct cake_pile* pile, unsigned int offset = sizeof(long); // 默认每块儿蛋糕对齐到地址总线宽度 - if ((options & PILE_CACHELINE)) { + if ((options & PILE_ALIGN_CACHE)) { // 对齐到128字节缓存行大小,主要用于DMA offset = CACHE_LINE_SIZE; } piece_size = ROUNDUP(piece_size, offset); *pile = (struct cake_pile){ .piece_size = piece_size, - .cakes_count = 1, + .cakes_count = 0, .pieces_per_cake = - (pg_per_cake * PG_SIZE) / + (pg_per_cake * PAGE_SIZE) / (piece_size + sizeof(piece_index_t)), .pg_per_cake = pg_per_cake }; @@ -115,11 +117,20 @@ cake_new_pile(char* name, { struct cake_pile* pile = (struct cake_pile*)cake_grab(&master_pile); + // must aligned to napot order! + assert(is_pot(pg_per_cake)); + __init_pile(pile, name, piece_size, pg_per_cake, options); return pile; } +void +cake_set_constructor(struct cake_pile* pile, pile_cb ctor) +{ + pile->ctor = ctor; +} + void* cake_grab(struct cake_pile* pile) { @@ -141,20 +152,27 @@ cake_grab(struct cake_pile* pile) pile->alloced_pieces++; llist_delete(&pos->cakes); - if (pos->next_free == EO_FREE_PIECE) { + if (pos->free_list[pos->next_free] == EO_FREE_PIECE) { llist_append(&pile->full, &pos->cakes); } else { llist_append(&pile->partial, &pos->cakes); } - return (void*)((uintptr_t)pos->first_piece + - found_index * pile->piece_size); + void* ptr = + (void*)((ptr_t)pos->first_piece + found_index * pile->piece_size); + + if (pile->ctor) { + pile->ctor(pile, ptr); + } + + return ptr; } int cake_release(struct cake_pile* pile, void* area) { piece_index_t piece_index; + size_t dsize = 0; struct cake_s *pos, *n; struct llist_header* hdrs[2] = { &pile->full, &pile->partial }; @@ -164,8 +182,8 @@ cake_release(struct cake_pile* pile, void* area) if (pos->first_piece > area) { continue; } - piece_index = - (uintptr_t)(area - pos->first_piece) / pile->piece_size; + dsize = (ptr_t)(area - pos->first_piece); + piece_index = dsize / pile->piece_size; if (piece_index < pile->pieces_per_cake) { goto found; } @@ -175,8 +193,12 @@ cake_release(struct cake_pile* pile, void* area) return 0; found: + assert(!(dsize % pile->piece_size)); pos->free_list[piece_index] = pos->next_free; pos->next_free = piece_index; + + assert_msg(pos->free_list[piece_index] != pos->next_free, "double free"); + pos->used_pieces--; pile->alloced_pieces--; @@ -187,5 +209,13 @@ found: llist_append(&pile->partial, &pos->cakes); } + *((unsigned int*)area) = DEADCAKE_MARK; + return 1; +} + +void +cake_ctor_zeroing(struct cake_pile* pile, void* piece) +{ + memset(piece, 0, pile->piece_size); } \ No newline at end of file