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

allow rcu in scheduler kthread

上级 1229ed4b
......@@ -488,13 +488,17 @@ void
scheduler(void)
{
struct proc *p;
int pid;
pid = ns_allockey(nspid);
// allocate a fake PID for each scheduler thread
struct proc *schedp = allocproc();
if (!schedp)
panic("scheduler allocproc");
proc = schedp;
// Enabling mtrace calls in scheduler generates many mtrace_call_entrys.
// mtrace_call_set(1, cpu->id);
mtrace_fcall_register(pid, (unsigned long)scheduler, 0, mtrace_start);
mtrace_fcall_register(schedp->pid, (unsigned long)scheduler, 0, mtrace_start);
for(;;){
// Enable interrupts on this processor.
......@@ -524,17 +528,17 @@ scheduler(void)
p->state = RUNNING;
p->tsc = rdtsc();
mtrace_fcall_register(pid, 0, 0, mtrace_pause);
mtrace_fcall_register(schedp->pid, 0, 0, mtrace_pause);
mtrace_fcall_register(proc->pid, 0, 0, mtrace_resume);
mtrace_call_set(1, cpu->id);
swtch(&cpu->scheduler, proc->context);
mtrace_fcall_register(pid, 0, 0, mtrace_resume);
mtrace_fcall_register(schedp->pid, 0, 0, mtrace_resume);
mtrace_call_set(0, cpu->id);
switchkvm();
// Process is done running for now.
// It should have changed its p->state before coming back.
proc = 0;
proc = schedp;
release(&p->lock);
break;
}
......
......@@ -97,7 +97,7 @@ rcu_delayed(void *e, void (*dofree)(void *))
void
rcu_begin_read(void)
{
if (proc->rcu_read_depth++ == 0)
if (proc && proc->rcu_read_depth++ == 0)
proc->epoch = global_epoch;
__sync_synchronize();
}
......@@ -105,7 +105,7 @@ rcu_begin_read(void)
void
rcu_end_read(void)
{
if (--proc->rcu_read_depth == 0)
if (proc && proc->rcu_read_depth > 0 && --proc->rcu_read_depth == 0)
proc->epoch = INF;
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论