Serialize vmap::brk_ updates with a spinlock

上级 26e69730
...@@ -86,7 +86,7 @@ struct vmap { ...@@ -86,7 +86,7 @@ struct vmap {
int pagefault(uptr va, u32 err); int pagefault(uptr va, u32 err);
int copyout(uptr va, void *p, u64 len); int copyout(uptr va, void *p, u64 len);
int sbrk(int n); int sbrk(ssize_t n, uptr *addr);
NEW_DELETE_OPS(vmap) NEW_DELETE_OPS(vmap)
...@@ -94,4 +94,5 @@ struct vmap { ...@@ -94,4 +94,5 @@ struct vmap {
private: private:
int pagefault_wcow(vma *m); int pagefault_wcow(vma *m);
struct spinlock brklock_;
}; };
...@@ -46,8 +46,7 @@ sys_sbrk(int n) ...@@ -46,8 +46,7 @@ sys_sbrk(int n)
{ {
uptr addr; uptr addr;
addr = myproc()->vmap->brk_; if(myproc()->vmap->sbrk(n, &addr) < 0)
if(myproc()->vmap->sbrk(n) < 0)
return -1; return -1;
return addr; return addr;
} }
......
...@@ -148,6 +148,7 @@ vmap::vmap() : ...@@ -148,6 +148,7 @@ vmap::vmap() :
ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)), ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)),
brk_(0) brk_(0)
{ {
initlock(&brklock_, "brk_lock", LOCKSTAT_VM);
if (pml4 == 0) { if (pml4 == 0) {
cprintf("vmap_alloc: setupkvm out of memory\n"); cprintf("vmap_alloc: setupkvm out of memory\n");
goto err; goto err;
...@@ -587,9 +588,11 @@ vmap::copyout(uptr va, void *p, u64 len) ...@@ -587,9 +588,11 @@ vmap::copyout(uptr va, void *p, u64 len)
// Shrinking just decreases proc->brk; doesn't deallocate. // Shrinking just decreases proc->brk; doesn't deallocate.
// Return 0 on success, -1 on failure. // Return 0 on success, -1 on failure.
int int
vmap::sbrk(int n) vmap::sbrk(ssize_t n, uptr *addr)
{ {
scoped_acquire xlock(&brklock_);
auto curbrk = brk_; auto curbrk = brk_;
*addr = curbrk;
if(n < 0 && 0 - n <= curbrk){ if(n < 0 && 0 - n <= curbrk){
brk_ += n; brk_ += n;
...@@ -626,7 +629,7 @@ vmap::sbrk(int n) ...@@ -626,7 +629,7 @@ vmap::sbrk(int n)
prev = e; prev = e;
#endif #endif
} else { } else {
cprintf("growproc: overlap with existing mapping; brk %lx n %d\n", cprintf("growproc: overlap with existing mapping; brk %lx n %ld\n",
curbrk, n); curbrk, n);
return -1; return -1;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论