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

cannot assume kmem refers to same ptr, unless interrupts are disabled

上级 db4ad0cd
...@@ -22,7 +22,10 @@ kmemprint(void) ...@@ -22,7 +22,10 @@ kmemprint(void)
{ {
cprintf("free pages: [ "); cprintf("free pages: [ ");
for (uint i = 0; i < NCPU; i++) for (uint i = 0; i < NCPU; i++)
cprintf("%d ", kmems[i].nfree); if (i == cpunum())
cprintf("<%d> ", kmems[i].nfree);
else
cprintf("%d ", kmems[i].nfree);
cprintf("]\n"); cprintf("]\n");
} }
...@@ -59,11 +62,12 @@ kfree(char *v) ...@@ -59,11 +62,12 @@ kfree(char *v)
// Fill with junk to catch dangling refs. // Fill with junk to catch dangling refs.
memset(v, 1, PGSIZE); memset(v, 1, PGSIZE);
acquire(&kmem->lock); struct kmem *m = kmem;
acquire(&m->lock);
r = (struct run*)v; r = (struct run*)v;
r->next = kmem->freelist; r->next = m->freelist;
kmem->freelist = r; m->freelist = r;
kmem->nfree++; m->nfree++;
mtrace_label_register(mtrace_label_block, mtrace_label_register(mtrace_label_block,
r, r,
0, 0,
...@@ -71,7 +75,7 @@ kfree(char *v) ...@@ -71,7 +75,7 @@ kfree(char *v)
0, 0,
RET_EIP()); RET_EIP());
release(&kmem->lock); release(&m->lock);
} }
// Allocate one 4096-byte page of physical memory. // Allocate one 4096-byte page of physical memory.
...@@ -84,8 +88,10 @@ kalloc(void) ...@@ -84,8 +88,10 @@ kalloc(void)
// cprintf("%d: kalloc 0x%x 0x%x 0x%x 0x%x 0%x\n", cpu->id, kmem, &kmems[cpu->id], kmem->freelist, PHYSTOP, kmems[1].freelist); // cprintf("%d: kalloc 0x%x 0x%x 0x%x 0x%x 0%x\n", cpu->id, kmem, &kmems[cpu->id], kmem->freelist, PHYSTOP, kmems[1].freelist);
uint startcpu = cpunum();
for (uint i = 0; r == 0 && i < NCPU; i++) { for (uint i = 0; r == 0 && i < NCPU; i++) {
struct kmem *m = &kmems[(i + cpunum()) % NCPU]; int cn = (i + startcpu) % NCPU;
struct kmem *m = &kmems[cn];
acquire(&m->lock); acquire(&m->lock);
r = m->freelist; r = m->freelist;
if (r) { if (r) {
......
...@@ -8,6 +8,6 @@ ...@@ -8,6 +8,6 @@
#define NDEV 10 // maximum major device number #define NDEV 10 // maximum major device number
#define ROOTDEV 1 // device number of file system root disk #define ROOTDEV 1 // device number of file system root disk
#define USERTOP 0xA0000 // end of user address space #define USERTOP 0xA0000 // end of user address space
#define PHYSTOP 0x1000000 // use phys mem up to here as free pool #define PHYSTOP 0x10000000 // use phys mem up to here as free pool
#define MAXARG 32 // max exec arguments #define MAXARG 32 // max exec arguments
#define MAXNAME 16 // max string names #define MAXNAME 16 // max string names
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论