提交 2cad69c2 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

lazy tlb shootdown: only shoot down when a subsequent map reuses virtual addrs

上级 570214f8
......@@ -85,6 +85,7 @@ struct proc : public rcu_freed {
LIST_ENTRY(proc) cv_waiters; // Linked list of processes waiting for oncv
LIST_ENTRY(proc) cv_sleep; // Linked list of processes sleeping on a cv
u64 user_fs_;
u64 unmap_tlbreq_;
static proc* alloc();
void set_state(procstate_t s);
......
......@@ -41,7 +41,7 @@ proc::proc(int npid) :
pid(npid), parent(0), tf(0), context(0), killed(0),
ftable(0), cwd(0), tsc(0), curcycles(0), cpuid(0), epoch(0),
cpu_pin(0), runq(0), oncv(0), cv_wakeup(0),
user_fs_(0), state_(EMBRYO)
user_fs_(0), unmap_tlbreq_(0), state_(EMBRYO)
{
snprintf(lockname, sizeof(lockname), "cv:proc:%d", pid);
initlock(&lock, lockname+3, LOCKSTAT_PROC);
......
......@@ -422,6 +422,8 @@ vmap::insert(vmnode *n, uptr vma_start, int dotlb)
});
if (needtlb && dotlb)
tlbflush();
else
tlbflush(myproc()->unmap_tlbreq_);
return 0;
}
......@@ -470,8 +472,12 @@ vmap::remove(uptr vma_start, uptr len)
}
}
});
if (needtlb)
tlbflush();
if (needtlb) {
// eager tlb shootdown
//tlbflush();
// lazy tlb shootdown
myproc()->unmap_tlbreq_ = tlbflush_req++;
}
return 0;
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论