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

minor stuff

上级 cf624484
...@@ -5,7 +5,6 @@ extern "C" { ...@@ -5,7 +5,6 @@ extern "C" {
} }
#include "atomic.hh" #include "atomic.hh"
#include "hwvm.hh"
#include <stdarg.h> #include <stdarg.h>
#define KBASE 0xFFFFFF0000000000ull #define KBASE 0xFFFFFF0000000000ull
......
...@@ -401,7 +401,6 @@ vmap::pagefault(uptr va, u32 err) ...@@ -401,7 +401,6 @@ vmap::pagefault(uptr va, u32 err)
atomic<pme_t> *pte = walkpgdir(pml4, va, 1); atomic<pme_t> *pte = walkpgdir(pml4, va, 1);
retry: retry:
(void) 0;
pme_t ptev = pte->load(); pme_t ptev = pte->load();
// optimize checks of args to syscals // optimize checks of args to syscals
...@@ -410,6 +409,11 @@ vmap::pagefault(uptr va, u32 err) ...@@ -410,6 +409,11 @@ vmap::pagefault(uptr va, u32 err)
return 0; return 0;
} }
if (ptev & PTE_LOCK) {
// locked, might as well wait for the other pagefaulting core..
goto retry;
}
scoped_gc_epoch gc; scoped_gc_epoch gc;
vma *m = lookup(va, 1); vma *m = lookup(va, 1);
if (m == 0) if (m == 0)
...@@ -431,7 +435,7 @@ vmap::pagefault(uptr va, u32 err) ...@@ -431,7 +435,7 @@ vmap::pagefault(uptr va, u32 err)
needflush = true; needflush = true;
} }
if ((ptev & PTE_LOCK) || !cmpxch(pte, ptev, ptev | PTE_LOCK)) if (!cmpxch(pte, ptev, ptev | PTE_LOCK))
goto retry; goto retry;
// XXX check if vma has been deleted, and if so, unlock & goto retry // XXX check if vma has been deleted, and if so, unlock & goto retry
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论