提交 09832e32 创建 作者: Austin Clements's avatar Austin Clements

Name both the crange and radix VMA set 'vmas'

Both have intentionally similar APIs, so this takes advantage of design polymorphism to collapse a lot of previously conditional code.
上级 71917ae5
...@@ -72,11 +72,11 @@ struct vma ...@@ -72,11 +72,11 @@ struct vma
// The elements of e[] are not ordered by address. // The elements of e[] are not ordered by address.
struct vmap { struct vmap {
#if VM_CRANGE #if VM_CRANGE
struct crange cr; struct crange vmas;
#endif #endif
#if VM_RADIX #if VM_RADIX
struct radix rx; struct radix vmas;
#endif #endif
static vmap* alloc(); static vmap* alloc();
......
...@@ -168,7 +168,7 @@ vmnode::loadall() ...@@ -168,7 +168,7 @@ vmnode::loadall()
vma::vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype, vmnode *vmn) : vma::vma(vmap *vmap, uptr start, uptr end, enum vmatype vtype, vmnode *vmn) :
#if VM_CRANGE #if VM_CRANGE
range(&vmap->cr, start, end-start), range(&vmap->vmas, start, end-start),
#endif #endif
vma_start(start), vma_end(end), va_type(vtype), n(vmn) vma_start(start), vma_end(end), va_type(vtype), n(vmn)
{ {
...@@ -194,10 +194,10 @@ vmap::alloc(void) ...@@ -194,10 +194,10 @@ vmap::alloc(void)
vmap::vmap() : vmap::vmap() :
#if VM_CRANGE #if VM_CRANGE
cr(10), vmas(10),
#endif #endif
#if VM_RADIX #if VM_RADIX
rx(PGSHIFT), vmas(PGSHIFT),
#endif #endif
ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)), ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)),
brk_(0) brk_(0)
...@@ -253,12 +253,7 @@ vmap::incref() ...@@ -253,12 +253,7 @@ vmap::incref()
bool bool
vmap::replace_vma(vma *a, vma *b) vmap::replace_vma(vma *a, vma *b)
{ {
#if VM_CRANGE auto span = vmas.search_lock(a->vma_start, a->vma_end - a->vma_start);
auto span = cr.search_lock(a->vma_start, a->vma_end - a->vma_start);
#endif
#if VM_RADIX
auto span = rx.search_lock(a->vma_start, a->vma_end - a->vma_start);
#endif
if (a->deleted()) if (a->deleted())
return false; return false;
for (auto e: span) for (auto e: span)
...@@ -279,12 +274,11 @@ vmap::copy(int share) ...@@ -279,12 +274,11 @@ vmap::copy(int share)
{ {
vmap *nm = new vmap(); vmap *nm = new vmap();
#if VM_CRANGE
for (auto r: cr) {
#endif
#if VM_RADIX #if VM_RADIX
void *last = 0; void *last = 0;
for (auto r: rx) { #endif
for (auto r: vmas) {
#if VM_RADIX
if (!r || r == last) if (!r || r == last)
continue; continue;
last = r; last = r;
...@@ -318,12 +312,7 @@ vmap::copy(int share) ...@@ -318,12 +312,7 @@ vmap::copy(int share)
ne = new vma(nm, e->vma_start, e->vma_end, PRIVATE, e->n->copy()); ne = new vma(nm, e->vma_start, e->vma_end, PRIVATE, e->n->copy());
} }
#if VM_CRANGE auto span = nm->vmas.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);
#endif
#if VM_RADIX
auto span = nm->rx.search_lock(ne->vma_start, ne->vma_end - ne->vma_start);
#endif
for (auto x: span) { for (auto x: span) {
#if VM_RADIX #if VM_RADIX
if (!x) if (!x)
...@@ -367,11 +356,11 @@ vmap::lookup(uptr start, uptr len) ...@@ -367,11 +356,11 @@ vmap::lookup(uptr start, uptr len)
panic("vmap::lookup bad len"); panic("vmap::lookup bad len");
#if VM_CRANGE #if VM_CRANGE
auto r = cr.search(start, len); auto r = vmas.search(start, len);
#endif #endif
#if VM_RADIX #if VM_RADIX
assert(len <= PGSIZE); assert(len <= PGSIZE);
auto r = rx.search(start); auto r = vmas.search(start);
#endif #endif
if (r != 0) { if (r != 0) {
vma *e = (vma *) r; vma *e = (vma *) r;
...@@ -405,12 +394,7 @@ again: ...@@ -405,12 +394,7 @@ again:
{ {
// new scope to release the search lock before tlbflush // new scope to release the search lock before tlbflush
u64 len = n->npages * PGSIZE; u64 len = n->npages * PGSIZE;
#if VM_CRANGE auto span = vmas.search_lock(vma_start, len);
auto span = cr.search_lock(vma_start, len);
#endif
#if VM_RADIX
auto span = rx.search_lock(vma_start, len);
#endif
for (auto r: span) { for (auto r: span) {
#if VM_RADIX #if VM_RADIX
if (!r) if (!r)
...@@ -474,12 +458,7 @@ vmap::remove(uptr vma_start, uptr len) ...@@ -474,12 +458,7 @@ vmap::remove(uptr vma_start, uptr len)
// new scope to release the search lock before tlbflush // new scope to release the search lock before tlbflush
uptr vma_end = vma_start + len; uptr vma_end = vma_start + len;
#if VM_CRANGE auto span = vmas.search_lock(vma_start, len);
auto span = cr.search_lock(vma_start, len);
#endif
#if VM_RADIX
auto span = rx.search_lock(vma_start, len);
#endif
for (auto r: span) { for (auto r: span) {
vma *rvma = (vma*) r; vma *rvma = (vma*) r;
if (rvma->vma_start < vma_start || rvma->vma_end > vma_end) { if (rvma->vma_start < vma_start || rvma->vma_end > vma_end) {
...@@ -756,17 +735,13 @@ vmap::sbrk(ssize_t n, uptr *addr) ...@@ -756,17 +735,13 @@ vmap::sbrk(ssize_t n, uptr *addr)
s64 newn = PGROUNDUP(n + curbrk - newstart); s64 newn = PGROUNDUP(n + curbrk - newstart);
#if VM_CRANGE #if VM_CRANGE
range *prev = 0; range *prev = 0;
auto span = cr.search_lock(newstart, newn + PGSIZE);
#endif #endif
#if VM_RADIX #if VM_RADIX
auto span = rx.search_lock(newstart, newn + PGSIZE); void *last = 0;
#endif #endif
#if VM_CRANGE auto span = vmas.search_lock(newstart, newn + PGSIZE);
for (auto r: span) { for (auto r: span) {
#endif
#if VM_RADIX #if VM_RADIX
void *last = 0;
for (auto r: span) {
if (!r || r == last) if (!r || r == last)
continue; continue;
last = r; last = r;
...@@ -824,7 +799,7 @@ vmap::unmapped_area(size_t npages) ...@@ -824,7 +799,7 @@ vmap::unmapped_area(size_t npages)
while (addr < USERTOP) { while (addr < USERTOP) {
#if VM_CRANGE #if VM_CRANGE
auto x = cr.search(addr, n); auto x = vmas.search(addr, n);
if (x == nullptr) if (x == nullptr)
return addr; return addr;
vma* a = (vma*) x; vma* a = (vma*) x;
...@@ -834,7 +809,7 @@ vmap::unmapped_area(size_t npages) ...@@ -834,7 +809,7 @@ vmap::unmapped_area(size_t npages)
#if VM_RADIX #if VM_RADIX
bool overlap = false; bool overlap = false;
for (uptr ax = addr; ax < addr+n; ax += PGSIZE) { for (uptr ax = addr; ax < addr+n; ax += PGSIZE) {
auto x = rx.search(ax); auto x = vmas.search(ax);
if (x != nullptr) { if (x != nullptr) {
overlap = true; overlap = true;
vma* a = (vma*) x; vma* a = (vma*) x;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论