提交 1403faf4 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

Pull proclock apart: condition vars, per process lock, runq lock

Passes forktest w. 2 CPUs
上级 3bf5e592
差异被折叠。
......@@ -45,6 +45,7 @@ struct proc {
struct file *ofile[NOFILE]; // Open files
struct inode *cwd; // Current directory
char name[16]; // Process name (debugging)
struct spinlock lock;
struct proc *next;
};
......@@ -69,6 +70,18 @@ struct cpu {
struct proc *proc; // The currently-running process.
struct ptable *ptable; // The per-core proc table
struct kmem *kmem; // The per-core proc table
struct runq *runq; // The per-core proc table
};
struct condvar {
void *chan; // If non-zero, sleeping on chan
struct proc *waiters;
};
struct runq {
char name[MAXNAME];
struct spinlock lock;
struct proc *runq;
};
struct ptable {
......@@ -80,6 +93,7 @@ struct ptable {
extern struct ptable ptables[NCPU];
extern struct cpu cpus[NCPU];
extern struct runq runqs[NCPU];
extern int ncpu;
// Per-CPU variables, holding pointers to the
......@@ -94,3 +108,4 @@ extern struct cpu *cpu asm("%gs:0"); // &cpus[cpunum()]
extern struct proc *proc asm("%gs:4"); // cpus[cpunum()].proc
extern struct ptable *ptable asm("%gs:8"); // &ptables[cpunum()]
extern struct kmem *kmem asm("%gs:12"); // &kmems[cpunum()]
extern struct runq *runq asm("%gs:16"); // &runqs[cpunum()]
......@@ -24,8 +24,10 @@ void
acquire(struct spinlock *lk)
{
pushcli(); // disable interrupts to avoid deadlock.
if(holding(lk))
if(holding(lk)) {
cprintf("lock: %s\n", lk->name);
panic("acquire");
}
// The xchg is atomic.
// It also serializes, so that reads after acquire are not
......@@ -42,8 +44,10 @@ acquire(struct spinlock *lk)
void
release(struct spinlock *lk)
{
if(!holding(lk))
if(!holding(lk)) {
cprintf("lock: %s\n", lk->name);
panic("release");
}
lk->pcs[0] = 0;
lk->cpu = 0;
......
......@@ -37,8 +37,8 @@ seginit(void)
c->gdt[SEG_UCODE] = SEG(STA_X|STA_R, 0, 0xffffffff, DPL_USER);
c->gdt[SEG_UDATA] = SEG(STA_W, 0, 0xffffffff, DPL_USER);
// Map cpu, curproc, ptable, kmem
c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 16, 0);
// Map cpu, curproc, ptable, kmem, runq
c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 20, 0);
lgdt(c->gdt, sizeof(c->gdt));
loadgs(SEG_KCPU << 3);
......@@ -48,6 +48,7 @@ seginit(void)
proc = 0;
ptable = &ptables[cpunum()];
kmem = &kmems[cpunum()];
runq = &runqs[cpunum()];
}
// Return the address of the PTE in page table pgdir
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论