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

only do tlbflush if we zeroed some tlb entries

上级 59bc213f
...@@ -300,16 +300,19 @@ vmap::insert(vmnode *n, uptr vma_start, int dotlb) ...@@ -300,16 +300,19 @@ vmap::insert(vmnode *n, uptr vma_start, int dotlb)
span.replace(e); span.replace(e);
} }
updatepages(pml4, e->vma_start, e->vma_end, [](atomic<pme_t> *p) { bool needtlb = false;
updatepages(pml4, e->vma_start, e->vma_end, [&needtlb](atomic<pme_t> *p) {
for (;;) { for (;;) {
pme_t v = p->load(); pme_t v = p->load();
if (v & PTE_LOCK) if (v & PTE_LOCK)
continue; continue;
if (cmpxch(p, v, (pme_t) 0)) if (cmpxch(p, v, (pme_t) 0))
break; break;
if (v != 0)
needtlb = true;
} }
}); });
if(dotlb) if (needtlb && dotlb)
tlbflush(); tlbflush();
return 0; return 0;
} }
...@@ -335,16 +338,20 @@ vmap::remove(uptr vma_start, uptr len) ...@@ -335,16 +338,20 @@ vmap::remove(uptr vma_start, uptr len)
span.replace(0); span.replace(0);
} }
updatepages(pml4, vma_start, vma_start + len, [](atomic<pme_t> *p) { bool needtlb = false;
updatepages(pml4, vma_start, vma_start + len, [&needtlb](atomic<pme_t> *p) {
for (;;) { for (;;) {
pme_t v = p->load(); pme_t v = p->load();
if (v & PTE_LOCK) if (v & PTE_LOCK)
continue; continue;
if (cmpxch(p, v, (pme_t) 0)) if (cmpxch(p, v, (pme_t) 0))
break; break;
if (v != 0)
needtlb = true;
} }
}); });
tlbflush(); if (needtlb)
tlbflush();
return 0; return 0;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论