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

constify vma::n

上级 35a7a560
...@@ -36,11 +36,11 @@ struct vma : public range { ...@@ -36,11 +36,11 @@ struct vma : public range {
const uptr vma_start; // start of mapping const uptr vma_start; // start of mapping
const uptr vma_end; // one past the last byte const uptr vma_end; // one past the last byte
const enum vmatype va_type; const enum vmatype va_type;
struct vmnode *n; struct vmnode * const n;
struct spinlock lock; // serialize fault/unmap struct spinlock lock; // serialize fault/unmap
char lockname[16]; char lockname[16];
vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype); vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype, vmnode *vmn);
~vma(); ~vma();
virtual void do_gc() { delete this; } virtual void do_gc() { delete this; }
......
...@@ -119,17 +119,19 @@ vmnode::load(inode *iparg, u64 offarg, u64 szarg) ...@@ -119,17 +119,19 @@ vmnode::load(inode *iparg, u64 offarg, u64 szarg)
* vma * vma
*/ */
vma::vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype) vma::vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype, vmnode *vmn)
: range(&vmap->cr, start, end-start), : range(&vmap->cr, start, end-start),
vma_start(start), vma_end(end), va_type(vtype), n(0) vma_start(start), vma_end(end), va_type(vtype), n(vmn)
{ {
if (n)
n->ref++;
snprintf(lockname, sizeof(lockname), "vma:%p", this); snprintf(lockname, sizeof(lockname), "vma:%p", this);
initlock(&lock, lockname, LOCKSTAT_VM); initlock(&lock, lockname, LOCKSTAT_VM);
} }
vma::~vma() vma::~vma()
{ {
if(n) if (n)
n->decref(); n->decref();
destroylock(&lock); destroylock(&lock);
} }
...@@ -215,19 +217,14 @@ vmap::copy(int share) ...@@ -215,19 +217,14 @@ vmap::copy(int share)
vma *e = (vma *) r; vma *e = (vma *) r;
scoped_acquire sae(&e->lock); scoped_acquire sae(&e->lock);
struct vma *ne = new vma(nm, e->vma_start, e->vma_end, share ? COW : PRIVATE); struct vma *ne;
if (ne == 0)
goto err;
if (share) { if (share) {
ne->n = e->n; ne = new vma(nm, e->vma_start, e->vma_end, COW, e->n);
// if the original vma wasn't COW, replace it with a COW vma // if the original vma wasn't COW, replace it with a COW vma
if (e->va_type != COW) { if (e->va_type != COW) {
vma *repl = new vma(this, e->vma_start, e->vma_end, COW); vma *repl = new vma(this, e->vma_start, e->vma_end, COW, e->n);
repl->n = e->n;
repl->n->ref++;
replace_vma(e, repl); replace_vma(e, repl);
updatepages(pml4, e->vma_start, e->vma_end, [](atomic<pme_t>* p) { updatepages(pml4, e->vma_start, e->vma_end, [](atomic<pme_t>* p) {
for (;;) { for (;;) {
...@@ -241,13 +238,17 @@ vmap::copy(int share) ...@@ -241,13 +238,17 @@ vmap::copy(int share)
}); });
} }
} else { } else {
ne->n = e->n->copy(); ne = new vma(nm, e->vma_start, e->vma_end, PRIVATE, e->n->copy());
} }
if (ne->n == 0) if (ne == 0)
goto err; goto err;
ne->n->ref++; if (ne->n == 0) {
delete ne;
goto err;
}
auto span = nm->cr.search_lock(ne->vma_start, ne->vma_end - ne->vma_start); auto span = nm->cr.search_lock(ne->vma_start, ne->vma_end - ne->vma_start);
for (auto x __attribute__((unused)): span) for (auto x __attribute__((unused)): span)
assert(0); /* span must be empty */ assert(0); /* span must be empty */
...@@ -307,14 +308,12 @@ vmap::insert(vmnode *n, uptr vma_start) ...@@ -307,14 +308,12 @@ vmap::insert(vmnode *n, uptr vma_start)
// XXX handle overlaps // XXX handle overlaps
e = new vma(this, vma_start, vma_start+len, PRIVATE); e = new vma(this, vma_start, vma_start+len, PRIVATE, n);
if (e == 0) { if (e == 0) {
cprintf("vmap::insert: out of vmas\n"); cprintf("vmap::insert: out of vmas\n");
return -1; return -1;
} }
e->n = n;
n->ref++;
span.replace(e); span.replace(e);
} }
...@@ -396,9 +395,7 @@ vmap::pagefault_wcow(vma *m) ...@@ -396,9 +395,7 @@ vmap::pagefault_wcow(vma *m)
return -1; return -1;
} }
vma *repl = new vma(this, m->vma_start, m->vma_end, PRIVATE); vma *repl = new vma(this, m->vma_start, m->vma_end, PRIVATE, nodecopy);
repl->n = nodecopy;
nodecopy->ref = 1;
replace_vma(m, repl); replace_vma(m, repl);
updatepages(pml4, m->vma_start, m->vma_end, [](atomic<pme_t> *p) { updatepages(pml4, m->vma_start, m->vma_end, [](atomic<pme_t> *p) {
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论