提交 5f7694ab 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

forkexectree can run for a long time now, although it still eventually crashes

上级 2b285c52
...@@ -37,6 +37,6 @@ class scoped_gc_epoch { ...@@ -37,6 +37,6 @@ class scoped_gc_epoch {
void initgc(void); void initgc(void);
void initprocgc(struct proc *); void initprocgc(struct proc *);
void gc_start(void);
void gc_delayed(rcu_freed *); void gc_delayed(rcu_freed *);
void gc_wakeup(void);
...@@ -203,6 +203,12 @@ void gc_dumpstat(void) ...@@ -203,6 +203,12 @@ void gc_dumpstat(void)
} }
} }
void
gc_wakeup(void)
{
for (int i = 0; i < NCPU; i++)
cv_wakeup(&gc_state[i].cv);
}
static void static void
gc_worker(void *x) gc_worker(void *x)
......
...@@ -72,7 +72,11 @@ initpg(void) ...@@ -72,7 +72,11 @@ initpg(void)
while (va < KBASEEND) { while (va < KBASEEND) {
auto pdp = descend(&kpml4, va, 0, 1, 3); auto pdp = descend(&kpml4, va, 0, 1, 3);
assert(pdp);
auto pd = descend(pdp, va, 0, 1, 2); auto pd = descend(pdp, va, 0, 1, 2);
assert(pd);
atomic<pme_t> *sp = &pd->e[PX(1,va)]; atomic<pme_t> *sp = &pd->e[PX(1,va)];
u64 flags = PTE_W | PTE_P | PTE_PS | PTE_NX; u64 flags = PTE_W | PTE_P | PTE_PS | PTE_NX;
*sp = pa | flags; *sp = pa | flags;
......
...@@ -98,6 +98,7 @@ syscall(u64 a0, u64 a1, u64 a2, u64 a3, u64 a4, u64 num) ...@@ -98,6 +98,7 @@ syscall(u64 a0, u64 a1, u64 a2, u64 a3, u64 a4, u64 num)
} }
} catch (retryable& e) { } catch (retryable& e) {
cprintf("%d: syscall retry\n", myproc()->pid); cprintf("%d: syscall retry\n", myproc()->pid);
gc_wakeup();
yield(); yield();
} }
} }
......
...@@ -225,6 +225,7 @@ vmap::vmap() : ...@@ -225,6 +225,7 @@ vmap::vmap() :
ksfree(slab_kshared, kshared); ksfree(slab_kshared, kshared);
if (pml4) if (pml4)
freevm(pml4); freevm(pml4);
throw std::bad_alloc();
} }
vmap::~vmap() vmap::~vmap()
...@@ -647,6 +648,8 @@ pagefault(struct vmap *vmap, uptr va, u32 err) ...@@ -647,6 +648,8 @@ pagefault(struct vmap *vmap, uptr va, u32 err)
return vmap->pagefault(va, err); return vmap->pagefault(va, err);
} catch (retryable& e) { } catch (retryable& e) {
cprintf("%d: pagefault retry\n", myproc()->pid); cprintf("%d: pagefault retry\n", myproc()->pid);
gc_wakeup();
yield();
} }
} }
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论