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

release crange locks before tlbflush

上级 8284cf8d
...@@ -266,17 +266,20 @@ vmap::lookup(uptr start, uptr len) ...@@ -266,17 +266,20 @@ 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); auto span = cr.search_lock(vma_start, len);
for (auto e: span) { for (auto r: span) {
cprintf("vmap::insert: overlap 0x%lx @ 0x%lx\n", e->size, e->key); cprintf("vmap::insert: overlap 0x%lx @ 0x%lx\n", r->size, r->key);
return -1; return -1;
} }
// XXX handle overlaps // XXX handle overlaps
vma *e = new vma(); e = new vma();
if (e == 0) { if (e == 0) {
cprintf("vmap::insert: out of vmas\n"); cprintf("vmap::insert: out of vmas\n");
return -1; return -1;
...@@ -287,18 +290,23 @@ vmap::insert(vmnode *n, uptr vma_start) ...@@ -287,18 +290,23 @@ vmap::insert(vmnode *n, uptr vma_start)
e->n = n; e->n = n;
n->ref++; n->ref++;
span.replace(new range(&cr, vma_start, len, e, 0)); 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)
{ {
{
// new scope to release the search lock before tlbflush
uptr vma_end = vma_start + len; uptr vma_end = vma_start + len;
auto span = cr.search_lock(vma_start, len); auto span = cr.search_lock(vma_start, len);
for (auto e: span) { for (auto r: span) {
if (e->key < vma_start || e->key + e->size > vma_end) { if (r->key < vma_start || r->key + r->size > vma_end) {
cprintf("vmap::remove: partial unmap not supported\n"); cprintf("vmap::remove: partial unmap not supported\n");
return -1; return -1;
} }
...@@ -307,6 +315,8 @@ vmap::remove(uptr vma_start, uptr len) ...@@ -307,6 +315,8 @@ vmap::remove(uptr vma_start, uptr len)
// 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论