// 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;
}
예제 #2
0
파일: cbuf.c 프로젝트: asweeney86/Composite
//  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;
}
예제 #3
0
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;
}
예제 #4
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;
}
예제 #5
0
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);
}