Make vma::insert find unmapped_areas of vma_start == 0.

This code is inefficient, it doesn't guarantee to find an unmapped area if one exists, and it only works for crange.
上级 931c2709
......@@ -88,7 +88,7 @@ struct vmap {
vmap* copy(int share);
vma* lookup(uptr start, uptr len);
int insert(vmnode *n, uptr va_start, int dotlb);
long insert(vmnode *n, uptr va_start, int dotlb);
int remove(uptr start, uptr len);
int pagefault(uptr va, u32 err);
......@@ -104,6 +104,7 @@ private:
~vmap();
NEW_DELETE_OPS(vmap)
int pagefault_wcow(vma *m);
uptr unmapped_area(size_t n);
struct spinlock brklock_;
};
......@@ -99,12 +99,13 @@ sys_map(uptr addr, u64 len)
if (vmn == 0)
return -1;
if (myproc()->vmap->insert(vmn, PGROUNDDOWN(addr), 1) < 0) {
long r = myproc()->vmap->insert(vmn, PGROUNDDOWN(addr), 1);
if (r < 0) {
delete vmn;
return -1;
}
return 0;
return r;
}
long
......
......@@ -362,13 +362,23 @@ vmap::lookup(uptr start, uptr len)
return 0;
}
int
long
vmap::insert(vmnode *n, uptr vma_start, int dotlb)
{
ANON_REGION("vmap::insert", &perfgroup);
vma *e;
bool replaced = false;
bool fixed = (vma_start != 0);
again:
if (!fixed) {
vma_start = unmapped_area(n->npages);
if (vma_start == 0) {
cprintf("vmap::insert: no unmapped areas\n");
return -1;
}
}
{
// new scope to release the search lock before tlbflush
......@@ -384,6 +394,9 @@ vmap::insert(vmnode *n, uptr vma_start, int dotlb)
if (!r)
continue;
#endif
if (!fixed)
goto again;
vma *rvma = (vma*) r;
cprintf("vmap::insert: overlap with %p: 0x%lx--0x%lx\n",
rvma, rvma->vma_start, rvma->vma_end);
......@@ -426,7 +439,8 @@ vmap::insert(vmnode *n, uptr vma_start, int dotlb)
else
if (tlb_lazy)
tlbflush(myproc()->unmap_tlbreq_);
return 0;
return vma_start;
}
int
......@@ -709,3 +723,19 @@ vmap::sbrk(ssize_t n, uptr *addr)
brk_ += n;
return 0;
}
uptr
vmap::unmapped_area(size_t npages)
{
size_t n = npages*PGSIZE;
uptr addr = 0x1000;
while (addr < USERTOP) {
auto x = cr.search(addr, n);
if (x == nullptr)
return addr;
vma* a = (vma*) x;
addr = a->vma_end;
}
return 0;
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论