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

release crange locks before tlbflush

上级 8284cf8d
...@@ -266,47 +266,57 @@ vmap::lookup(uptr start, uptr len) ...@@ -266,47 +266,57 @@ vmap::lookup(uptr start, uptr len)
int int
vmap::insert(vmnode *n, uptr vma_start) vmap::insert(vmnode *n, uptr vma_start)
{ {
u64 len = n->npages * PGSIZE; vma *e;
{
// new scope to release the search lock before tlbflush
u64 len = n->npages * PGSIZE;
auto span = cr.search_lock(vma_start, len);
for (auto r: span) {
cprintf("vmap::insert: overlap 0x%lx @ 0x%lx\n", r->size, r->key);
return -1;
}
auto span = cr.search_lock(vma_start, len); // XXX handle overlaps
for (auto e: span) {
cprintf("vmap::insert: overlap 0x%lx @ 0x%lx\n", e->size, e->key);
return -1;
}
// XXX handle overlaps e = new vma();
if (e == 0) {
cprintf("vmap::insert: out of vmas\n");
return -1;
}
vma *e = new vma(); e->vma_start = vma_start;
if (e == 0) { e->vma_end = vma_start + len;
cprintf("vmap::insert: out of vmas\n"); e->n = n;
return -1; n->ref++;
span.replace(new range(&cr, vma_start, len, e, 0));
} }
e->vma_start = vma_start;
e->vma_end = vma_start + len;
e->n = n;
n->ref++;
span.replace(new range(&cr, vma_start, len, e, 0));
updatepages(pml4, (void*) e->vma_start, (void*) (e->vma_end-1), 0); updatepages(pml4, (void*) e->vma_start, (void*) (e->vma_end-1), 0);
tlbflush();
return 0; return 0;
} }
int int
vmap::remove(uptr vma_start, uptr len) vmap::remove(uptr vma_start, uptr len)
{ {
uptr vma_end = vma_start + len; {
// new scope to release the search lock before tlbflush
auto span = cr.search_lock(vma_start, len); uptr vma_end = vma_start + len;
for (auto e: span) {
if (e->key < vma_start || e->key + e->size > vma_end) { auto span = cr.search_lock(vma_start, len);
cprintf("vmap::remove: partial unmap not supported\n"); for (auto r: span) {
return -1; if (r->key < vma_start || r->key + r->size > vma_end) {
cprintf("vmap::remove: partial unmap not supported\n");
return -1;
}
} }
}
// XXX handle partial unmap // XXX handle partial unmap
span.replace(0);
}
span.replace(0);
updatepages(pml4, (void*) vma_start, (void*) (vma_start + len - 1), 0); updatepages(pml4, (void*) vma_start, (void*) (vma_start + len - 1), 0);
tlbflush(); tlbflush();
return 0; return 0;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论