vmap->decref() in ~proc, instead of in finishproc

上级 ebea9405
#define KBASE 0xFFFFFF0000000000ull #define KBASE 0xFFFFFF0000000000ull
#define KCODE 0xFFFFFFFFC0000000ull #define KCODE 0xFFFFFFFFC0000000ull
#define KSHARED 0xFFFFF00000000000ull #define KSHARED 0xFFFFF00000000000ull
#define USERWQLEN 0xFFFFF00100000000ull #define USERWQ 0xFFFFF00100000000ull
#define USERTOP 0x0000800000000000ull #define USERTOP 0x0000800000000000ull
struct padded_length {
volatile u64 v_ __mpalign__;;
__padout__;
};
#if defined (XV6_KERNEL)
int uwq_trywork(void);
#endif
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#define VM_CRANGE 1 #define VM_CRANGE 1
#define VM_RADIX 0 #define VM_RADIX 0
class wq; struct padded_length;
using std::atomic; using std::atomic;
...@@ -97,6 +97,6 @@ struct vmap { ...@@ -97,6 +97,6 @@ struct vmap {
private: private:
int pagefault_wcow(vma *m); int pagefault_wcow(vma *m);
wq *const uwq_; padded_length* const uwq_len_;
struct spinlock brklock_; struct spinlock brklock_;
}; };
...@@ -37,7 +37,7 @@ allocklen(unsigned long nbytes) ...@@ -37,7 +37,7 @@ allocklen(unsigned long nbytes)
if (nbytes > USERWQSIZE) if (nbytes > USERWQSIZE)
die("allocklen: too large"); die("allocklen: too large");
alloced = true; alloced = true;
return (padded_length*)USERWQLEN; return (padded_length*)USERWQ;
} }
static inline void static inline void
......
...@@ -42,6 +42,7 @@ OBJS = \ ...@@ -42,6 +42,7 @@ OBJS = \
sysfile.o \ sysfile.o \
sysproc.o \ sysproc.o \
uart.o \ uart.o \
uwq.o \
vm.o \ vm.o \
trap.o \ trap.o \
trapasm.o \ trapasm.o \
......
...@@ -100,8 +100,8 @@ setupuvm(pgmap *pml4, char *kshared, char *uwq) ...@@ -100,8 +100,8 @@ setupuvm(pgmap *pml4, char *kshared, char *uwq)
char *uvm; char *uvm;
size_t size; size_t size;
} todo[] = { } todo[] = {
{ kshared, (char*)KSHARED, KSHAREDSIZE }, { kshared, (char*)KSHARED, KSHAREDSIZE },
{ uwq, (char*)USERWQLEN, PGROUNDUP(wq_size()) } { uwq, (char*)USERWQ, USERWQSIZE }
}; };
for (int i = 0; i < NELEM(todo); i++) { for (int i = 0; i < NELEM(todo); i++) {
......
...@@ -279,7 +279,7 @@ initkalloc(u64 mbaddr) ...@@ -279,7 +279,7 @@ initkalloc(u64 mbaddr)
slabmem[slab_wq][c].ninit = NCPU; slabmem[slab_wq][c].ninit = NCPU;
strncpy(slabmem[slab_userwq][c].name, " uwq", MAXNAME); strncpy(slabmem[slab_userwq][c].name, " uwq", MAXNAME);
slabmem[slab_userwq][c].size = PGROUNDUP(wq_size()); slabmem[slab_userwq][c].size = USERWQSIZE;
slabmem[slab_userwq][c].ninit = CPUKSTACKS; slabmem[slab_userwq][c].ninit = CPUKSTACKS;
for (int i = 0; i < slab_type_max; i++) { for (int i = 0; i < slab_type_max; i++) {
......
...@@ -55,6 +55,9 @@ proc::proc(int npid) : ...@@ -55,6 +55,9 @@ proc::proc(int npid) :
proc::~proc(void) proc::~proc(void)
{ {
if (vmap != nullptr)
vmap->decref();
destroylock(&lock); destroylock(&lock);
destroycondvar(&cv); destroycondvar(&cv);
} }
...@@ -413,8 +416,6 @@ finishproc(struct proc *p) ...@@ -413,8 +416,6 @@ finishproc(struct proc *p)
{ {
ksfree(slab_stack, p->kstack); ksfree(slab_stack, p->kstack);
p->kstack = 0; p->kstack = 0;
if (p->vmap != nullptr)
p->vmap->decref();
if (!xnspid->remove(p->pid, &p)) if (!xnspid->remove(p->pid, &p))
panic("wait: ns_remove"); panic("wait: ns_remove");
p->pid = 0; p->pid = 0;
......
#include "types.h"
#include "kernel.hh"
#include "uwq.hh"
int
uwq_trywork(void)
{
return 0;
}
...@@ -146,7 +146,7 @@ vmap::vmap() : ...@@ -146,7 +146,7 @@ vmap::vmap() :
rx(PGSHIFT), rx(PGSHIFT),
#endif #endif
ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)), ref(1), pml4(setupkvm()), kshared((char*) ksalloc(slab_kshared)),
brk_(0), uwq_((wq*) ksalloc(slab_userwq)) brk_(0), uwq_len_((padded_length*) ksalloc(slab_userwq))
{ {
initlock(&brklock_, "brk_lock", LOCKSTAT_VM); initlock(&brklock_, "brk_lock", LOCKSTAT_VM);
if (pml4 == 0) { if (pml4 == 0) {
...@@ -159,12 +159,12 @@ vmap::vmap() : ...@@ -159,12 +159,12 @@ vmap::vmap() :
goto err; goto err;
} }
if (uwq_ == nullptr) { if (uwq_len_ == nullptr) {
cprintf("vmap::vmap: userwq out of memory\n"); cprintf("vmap::vmap: userwq out of memory\n");
goto err; goto err;
} }
if (setupuvm(pml4, kshared, (char*)uwq_)) { if (setupuvm(pml4, kshared, (char*)uwq_len_)) {
cprintf("vmap::vmap: setupkshared out of memory\n"); cprintf("vmap::vmap: setupkshared out of memory\n");
goto err; goto err;
} }
...@@ -174,8 +174,8 @@ vmap::vmap() : ...@@ -174,8 +174,8 @@ vmap::vmap() :
err: err:
if (kshared) if (kshared)
ksfree(slab_kshared, kshared); ksfree(slab_kshared, kshared);
if (uwq_) if (uwq_len_)
ksfree(slab_userwq, uwq_); ksfree(slab_userwq, uwq_len_);
if (pml4) if (pml4)
freevm(pml4); freevm(pml4);
} }
...@@ -184,8 +184,8 @@ vmap::~vmap() ...@@ -184,8 +184,8 @@ vmap::~vmap()
{ {
if (kshared) if (kshared)
ksfree(slab_kshared, kshared); ksfree(slab_kshared, kshared);
if (uwq_) if (uwq_len_)
ksfree(slab_userwq, uwq_); ksfree(slab_userwq, uwq_len_);
if (pml4) if (pml4)
freevm(pml4); freevm(pml4);
destroylock(&brklock_); destroylock(&brklock_);
......
...@@ -85,14 +85,6 @@ exitwq(void) ...@@ -85,14 +85,6 @@ exitwq(void)
wqarch_exit(); wqarch_exit();
} }
#if defined(XV6_KERNEL)
int
uwq_trywork(void)
{
return 0;
}
#endif
// //
// wq // wq
// //
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论