Lines Matching defs:mm

36 #include <mm/mm.h>
69 static struct mmnode *new_node(struct mm *mm, enum nodetype type,
73 (childbits > 0 && childbits <= mm->maxchildbits));
75 struct mmnode *node = slab_alloc(&mm->slabs);
86 static errval_t resize_node(struct mm *mm, struct mmnode *node,
91 assert(newchildbits <= mm->maxchildbits);
104 newnode = new_node(mm, NodeType_Dummy, diffchildbits);
125 static errval_t add_node(struct mm *mm, genpaddr_t base, uint8_t sizebits,
153 err = resize_node(mm, node, nodesizebits - sizebits);
163 return add_node(mm, base, sizebits, node->children[nchild],
170 struct mmnode *new = new_node(mm, NodeType_Dummy, FLAGBITS);
186 while (nodesizebits > sizebits + mm->maxchildbits) {
187 node->childbits = mm->maxchildbits;
188 childsizebits = nodesizebits - mm->maxchildbits;
193 struct mmnode *new = new_node(mm, NodeType_Dummy, FLAGBITS);
202 childsizebits -= mm->maxchildbits;
203 nodesizebits -= mm->maxchildbits;
222 struct mmnode *new = new_node(mm, NodeType_Free, FLAGBITS);
233 static errval_t find_node(struct mm *mm, bool do_realloc, uint8_t sizebits,
308 err = find_node(mm, do_realloc, sizebits, minbase, maxlimit,
336 * \param mm Memory allocator context
347 static errval_t chunk_node(struct mm *mm, uint8_t sizebits,
361 if (childbits > mm->maxchildbits) {
362 childbits = mm->maxchildbits;
371 err = mm->slot_alloc(mm->slot_alloc_inst, UNBITS_CA(childbits), &cap);
373 if (err_no(err) == LIB_ERR_SLOT_ALLOC_NO_SPACE && mm->slot_refill) {
374 err = mm->slot_refill(mm->slot_alloc_inst);
376 DEBUG_ERR(err, "mm slot_alloc refill");
380 err = mm->slot_alloc(mm->slot_alloc_inst, UNBITS_CA(childbits), &cap);
390 err = cap_retype(cap, node->cap, 0, mm->objtype,
404 // TODO: Should deallocate the unused slots from mm->slot_alloc()
409 struct mmnode *new = new_node(mm, node->type, FLAGBITS);
420 if(mm->delete_chunked) {
479 * \param mm Pointer to memory manager instance, to be filled-in
496 errval_t mm_init(struct mm *mm, enum objtype objtype, genpaddr_t base,
503 assert(mm != NULL);
504 mm->objtype = objtype;
507 mm->base = base;
508 mm->sizebits = sizebits;
510 mm->maxchildbits = maxchildbits;
511 mm->root = NULL;
512 mm->slot_alloc = slot_alloc_func;
513 mm->slot_refill = slot_refill_func;
514 mm->slot_alloc_inst = slot_alloc_inst;
515 mm->delete_chunked = delete_chunked;
518 slab_init(&mm->slabs, MM_NODE_SIZE(maxchildbits), slab_refill_func);
526 * \param mm Memory manager instance
528 void mm_destroy(struct mm *mm)
539 * \param mm Memory manager instance
544 errval_t mm_add(struct mm *mm, struct capref cap, uint8_t sizebits, genpaddr_t base)
547 if (base < mm->base ||
548 base + UNBITS_GENPA(sizebits) > mm->base + UNBITS_GENPA(mm->sizebits)) {
557 if (mm->root == NULL) {
559 if (base == mm->base && sizebits == mm->sizebits) {
560 mm->root = new_node(mm, NodeType_Free, FLAGBITS);
561 if (mm->root == NULL) {
564 mm->root->cap = cap;
567 mm->root = new_node(mm, NodeType_Dummy, FLAGBITS);
568 if (mm->root == NULL) {
576 err = add_node(mm, base, sizebits, mm->root, mm->base, mm->sizebits, &node);
591 * \param mm Memory manager instance
596 errval_t mm_add_multi(struct mm *mm, struct capref cap, gensize_t size, genpaddr_t base)
598 DEBUG("%s: mm=%p, base=%#"PRIxGENPADDR", bytes=%" PRIuGENSIZE "\n",
599 __FUNCTION__, mm, base, size);
606 return mm_add(mm, cap, log2ceil(size), base);
615 err = mm->slot_alloc(mm->slot_alloc_inst, 1, &temp);
617 if (mm->slot_refill == NULL) {
621 err = mm->slot_refill(mm->slot_alloc_inst);
626 err = mm->slot_alloc(mm->slot_alloc_inst, 1, &temp);
633 err = cap_retype(temp, cap, offset, mm->objtype, blockbytes, 1);
639 err = mm_add(mm, temp, blockbits, base);
662 * \param mm Memory manager instance
668 errval_t mm_alloc(struct mm *mm, uint8_t sizebits, struct capref *retcap,
672 if (sizebits > mm->sizebits) {
676 return mm_alloc_range(mm, sizebits, mm->base,
677 mm->base + UNBITS_GENPA(mm->sizebits), retcap, retbase);
686 * \param mm Memory manager instance
694 errval_t mm_alloc_range(struct mm *mm, uint8_t sizebits, genpaddr_t minbase,
704 if (minbase < mm->base ||
705 maxlimit > mm->base + UNBITS_GENPA(mm->sizebits)) {
709 if (mm->root == NULL) {
719 err = find_node(mm, false, sizebits, minbase, maxlimit, mm->root, mm->base,
720 mm->sizebits, &nodebase, &nodesizebits, &node);
731 err = chunk_node(mm, sizebits, minbase, maxlimit, node, &nodebase,
759 * \param mm Memory manager instance
764 errval_t mm_realloc_range(struct mm *mm, uint8_t sizebits, genpaddr_t base,
768 if (base < mm->base ||
769 base + UNBITS_GENPA(sizebits) > mm->base + UNBITS_GENPA(mm->sizebits)) {
777 if (mm->root == NULL) {
787 err = find_node(mm, true, sizebits, base, base + UNBITS_GENPA(sizebits),
788 mm->root, mm->base, mm->sizebits, &nodebase, &nodesizebits,
808 err = chunk_node(mm, sizebits, base, base + UNBITS_GENPA(sizebits), node,
831 * \param mm Memory manager instance
836 errval_t mm_free(struct mm *mm, struct capref cap, genpaddr_t base,
846 err = find_node(mm, true, sizebits, base, base + UNBITS_GENPA(sizebits),
847 mm->root, mm->base, mm->sizebits, &nodebase, &nodesizebits,
863 err = chunk_node(mm, sizebits, base, base + UNBITS_GENPA(sizebits), node,
881 * \param mm Memory manager instance
888 size_t mm_relinquish_all(struct mm *mm, struct mem_cap *ret, size_t retlen)
902 * \param mm Memory manager instance
911 size_t mm_relinquish_range(struct mm *mm, genpaddr_t base, genpaddr_t limit,