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

allow rcu in scheduler kthread

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