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

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