提交 8f783790 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

vmap methods

上级 fed708d4
......@@ -230,7 +230,7 @@ exec(char *path, char **argv)
myproc()->tf->rip = elf.entry; // main
switchuvm(myproc());
vmap_decref(oldvmap);
oldvmap->decref();
gc_end_epoch();
prof_end(exec_prof);
......@@ -239,7 +239,7 @@ exec(char *path, char **argv)
bad:
cprintf("exec failed\n");
if(vmap)
vmap_decref(vmap);
vmap->decref();
if(vmn)
vmn_free(vmn);
gc_end_epoch();
......
......@@ -259,11 +259,8 @@ void vmn_free(struct vmnode *);
void switchuvm(struct proc*);
void switchkvm(void);
int pagefault(struct vmap *, uptr, u32);
void vmap_decref(struct vmap *);
int vmn_load(struct vmnode *, struct inode*, u64, u64);
int vmap_remove(struct vmap *, uptr, u64);
void updatepages(pml4e_t*, void*, void*, int);
struct vmap * vmap_copy(struct vmap *, int);
// wq.c
int wq_trywork(void);
......
......@@ -571,7 +571,7 @@ fork(int flags)
if(flags == 0) {
// Copy process state from p.
if((np->vmap = vmap_copy(myproc()->vmap, cow)) == 0){
if((np->vmap = myproc()->vmap->copy(cow)) == 0){
ksfree(slab_stack, np->kstack);
np->kstack = 0;
np->state = UNUSED;
......@@ -635,7 +635,7 @@ wait(void)
release(&myproc()->lock);
ksfree(slab_stack, p->kstack);
p->kstack = 0;
vmap_decref(p->vmap);
p->vmap->decref();
p->state = UNUSED;
if (!xnspid->remove(p->pid, &p))
panic("wait: ns_remove");
......
......@@ -132,7 +132,7 @@ sys_unmap(void)
return -1;
if (argint64(1, &len) < 0)
return -1;
if (vmap_remove(myproc()->vmap, PGROUNDDOWN(addr), PGROUNDUP(len)) < 0)
if (myproc()->vmap->remove(PGROUNDDOWN(addr), PGROUNDUP(len)) < 0)
return -1;
updatepages(myproc()->vmap->pml4,
......
......@@ -82,10 +82,10 @@ vmn_allocpg(u64 npg)
}
void
vmap_decref(struct vmap *m)
vmap::decref()
{
if(--m->ref == 0)
delete m;
if (--ref == 0)
delete this;
}
vmap::vmap()
......@@ -377,15 +377,15 @@ vmap::insert(vmnode *n, uptr va_start)
return 0;
}
struct vmap *
vmap_copy(struct vmap *m, int share)
vmap*
vmap::copy(int share)
{
struct vmap *nm = vmap_alloc();
if(nm == 0)
return 0;
scoped_acquire sa(&m->lock);
for (range *r: m->cr) {
scoped_acquire sa(&lock);
for (range *r: cr) {
struct vma *e = (struct vma *) r->value;
struct vma *ne = new vma();
if (ne == 0)
......@@ -396,16 +396,16 @@ vmap_copy(struct vmap *m, int share)
if (share) {
ne->n = e->n;
ne->va_type = COW;
acquire(&e->lock);
scoped_acquire sae(&e->lock);
e->va_type = COW;
updatepages(m->pml4, (void *) (e->va_start), (void *) (e->va_end), PTE_COW);
release(&e->lock);
updatepages(pml4, (void *) (e->va_start), (void *) (e->va_end), PTE_COW);
} else {
ne->n = vmn_copy(e->n);
ne->va_type = e->va_type;
}
if(ne->n == 0)
if (ne->n == 0)
goto err;
ne->n->ref++;
......@@ -413,7 +413,7 @@ vmap_copy(struct vmap *m, int share)
}
if (share)
lcr3(v2p(m->pml4)); // Reload hardware page table
lcr3(v2p(pml4)); // Reload hardware page table
return nm;
......@@ -423,21 +423,19 @@ vmap_copy(struct vmap *m, int share)
}
int
vmap_remove(struct vmap *m, uptr va_start, u64 len)
vmap::remove(uptr va_start, uptr len)
{
acquire(&m->lock);
scoped_acquire sa(&lock);
uptr va_end = va_start + len;
struct range *r = m->cr.search(va_start, len);
struct range *r = cr.search(va_start, len);
if (r == 0)
panic("no vma?");
struct vma *e = (struct vma *) r->value;
if(e->va_start != va_start || e->va_end != va_end) {
cprintf("vmap_remove: partial unmap unsupported\n");
release(&m->lock);
return -1;
}
m->cr.del(va_start, len);
cr.del(va_start, len);
gc_delayed(e);
release(&m->lock);
return 0;
}
......@@ -50,6 +50,9 @@ struct vmap {
vmap();
~vmap();
void decref();
vmap* copy(int share);
vma* lookup(uptr start, uptr len);
int insert(vmnode *n, uptr va_start);
int remove(uptr start, uptr len);
};
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论