// arg is the src_spd int __sg_mman_release_page(spdid_t spd, vaddr_t addr, int arg) { int ret = 0; ret = mman_release_page(spd, addr, arg); /* printc("mem_normal: ser side release_page %p\n", (void *)addr); */ /* /\* #ifdef REFLECTION *\/ */ /* cos_sched_lock_take(); */ /* struct rec_data_spd *rd; */ /* rd = rdspd_lookup(arg); */ /* assert(rd); */ /* struct rec_data_page *rd_page; */ /* /\* rd_page = rdpage_lookup(addr); *\/ */ /* /\* assert(rd_page); *\/ */ /* // remove from list and from cvect */ /* /\* REM_LIST(rd_page, next, prev); *\/ */ /* /\* rdpage_dealloc(rd_page); *\/ */ /* rd_page = FIRST_LIST(&rd->pages, next, prev); */ /* assert(rd_page); */ /* REM_LIST(rd_page, next, prev); */ /* /\* printc("mem_normal release: pages %p @ %p\n", (void *)rd_page->addr, (void *)rd_page); *\/ */ /* /\* printc("mem_normal release: ser side removing from list\n"); *\/ */ /* cos_sched_lock_release(); */ /* /\* #endif *\/ */ return ret; }
// all cbufs that created for this component void mgr_map_client_mem(struct cos_cbuf_item *cci, struct spd_tmem_info *sti) { char *l_addr, *d_addr; spdid_t d_spdid; // struct cb_desc *d; assert(sti && cci); assert(EMPTY_LIST(cci, next, prev)); d_spdid = sti->spdid; /* TODO: multiple pages cbuf! */ d_addr = valloc_alloc(cos_spd_id(), sti->spdid, 1); l_addr = cci->desc.addr; //initialized in cos_init() assert(d_addr && l_addr); /* ...map it into the requesting component */ if (unlikely(!mman_alias_page(cos_spd_id(), (vaddr_t)l_addr, d_spdid, (vaddr_t)d_addr))) goto err; /* DOUT("<<<MAPPED>>> mgr addr %p client addr %p\n ",l_addr, d_addr); */ cci->desc.owner.addr = (vaddr_t)d_addr; cci->parent_spdid = d_spdid; assert(cci->desc.cbid == 0); // add the cbuf to shared vect here? now we do it in the client. // and l_addr and d_addr has been assinged done: return; err: DOUT("Cbuf mgr: Cannot alias page to client!\n"); mman_release_page(cos_spd_id(), (vaddr_t)l_addr, 0); /* valloc_free(cos_spd_id(), cos_spd_id(), l_addr, 1); */ valloc_free(cos_spd_id(), d_spdid, (void *)d_addr, 1); goto done; }
int stkmgr_stack_close(spdid_t d_spdid, vaddr_t d_addr) { /* the memory manager will ensure that both we and the * destination own this page */ mman_release_page(d_spdid, d_addr, 0); return 0; }
int cbuf_unmap_at(spdid_t s_spd, unsigned int cbid, spdid_t d_spd, vaddr_t d_addr) { struct cbuf_info *cbi; int ret = 0, err = 0; u32_t off; assert(d_addr); CBUF_TAKE(); cbi = cmap_lookup(&cbufs, cbid); if (unlikely(!cbi)) ERR_THROW(-EINVAL, done); if (unlikely(cbi->owner.spdid != s_spd)) ERR_THROW(-EPERM, done); assert(cbi->size == round_to_page(cbi->size)); /* unmap pages in only the d_spd client */ for (off = 0 ; off < cbi->size ; off += PAGE_SIZE) err |= mman_release_page(d_spd, d_addr + off, 0); err |= valloc_free(s_spd, d_spd, (void*)d_addr, cbi->size/PAGE_SIZE); if (unlikely(err)) ERR_THROW(-EFAULT, done); assert(!err); done: CBUF_RELEASE(); return ret; }
static void unmap_stack(spdid_t spdid, unsigned long *stack) { //stkmgr_stack_close(spdid, (vaddr_t)stack); mman_release_page(cos_spd_id(), (vaddr_t)stack, 0); }