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

atomic (lockless) kalloc

上级 c7b284b3
#include "atomic.hh"
struct run { struct run {
struct run *next; struct run *next;
}; };
...@@ -6,9 +8,8 @@ struct kmem { ...@@ -6,9 +8,8 @@ struct kmem {
char name[MAXNAME]; char name[MAXNAME];
u64 size; u64 size;
u64 ninit; u64 ninit;
struct spinlock lock; std::atomic<run*> freelist;
struct run *freelist; std::atomic<u64> nfree;
u64 nfree;
} __mpalign__; } __mpalign__;
enum { enum {
......
...@@ -127,14 +127,13 @@ kfree_pool(struct kmem *m, char *v) ...@@ -127,14 +127,13 @@ kfree_pool(struct kmem *m, char *v)
if (ALLOC_MEMSET && kinited && m->size <= 16384) if (ALLOC_MEMSET && kinited && m->size <= 16384)
memset(v, 1, m->size); memset(v, 1, m->size);
acquire(&m->lock);
r = (struct run*)v; r = (struct run*)v;
r->next = m->freelist; r->next = m->freelist;
m->freelist = r; while (!cmpxch_update(&m->freelist, &r->next, r))
; /* spin */
m->nfree++; m->nfree++;
if (kinited) if (kinited)
mtunlabel(mtrace_label_block, r); mtunlabel(mtrace_label_block, r);
release(&m->lock);
} }
static void __attribute__((unused)) static void __attribute__((unused))
...@@ -143,9 +142,9 @@ kmemprint(void) ...@@ -143,9 +142,9 @@ kmemprint(void)
cprintf("free pages: [ "); cprintf("free pages: [ ");
for (u32 i = 0; i < NCPU; i++) for (u32 i = 0; i < NCPU; i++)
if (i == mycpu()->id) if (i == mycpu()->id)
cprintf("<%lu> ", kmems[i].nfree); cprintf("<%lu> ", kmems[i].nfree.load());
else else
cprintf("%lu ", kmems[i].nfree); cprintf("%lu ", kmems[i].nfree.load());
cprintf("]\n"); cprintf("]\n");
} }
...@@ -155,17 +154,21 @@ kalloc_pool(struct kmem *km) ...@@ -155,17 +154,21 @@ kalloc_pool(struct kmem *km)
struct run *r = 0; struct run *r = 0;
struct kmem *m; struct kmem *m;
scoped_gc_epoch gc;
u32 startcpu = mycpu()->id; u32 startcpu = mycpu()->id;
for (u32 i = 0; r == 0 && i < NCPU; i++) { for (u32 i = 0; r == 0 && i < NCPU; i++) {
int cn = (i + startcpu) % NCPU; int cn = (i + startcpu) % NCPU;
m = &km[cn]; m = &km[cn];
acquire(&m->lock);
r = m->freelist; r = m->freelist;
while (r && !cmpxch(&m->freelist, r, r->next))
; /* spin */
if (r) { if (r) {
m->freelist = r->next; m->freelist = r->next;
m->nfree--; m->nfree--;
} }
release(&m->lock);
} }
if (r == 0) { if (r == 0) {
...@@ -226,15 +229,12 @@ initkalloc(u64 mbaddr) ...@@ -226,15 +229,12 @@ initkalloc(u64 mbaddr)
for (int c = 0; c < NCPU; c++) { for (int c = 0; c < NCPU; c++) {
kmems[c].name[0] = (char) c + '0'; kmems[c].name[0] = (char) c + '0';
safestrcpy(kmems[c].name+1, "kmem", MAXNAME-1); safestrcpy(kmems[c].name+1, "kmem", MAXNAME-1);
initlock(&kmems[c].lock, kmems[c].name, LOCKSTAT_KALLOC);
kmems[c].size = PGSIZE; kmems[c].size = PGSIZE;
} }
for (int i = 0; i < slab_type_max; i++) { for (int i = 0; i < slab_type_max; i++) {
for (int c = 0; c < NCPU; c++) { for (int c = 0; c < NCPU; c++) {
slabmem[i][c].name[0] = (char) c + '0'; slabmem[i][c].name[0] = (char) c + '0';
initlock(&slabmem[i][c].lock,
slabmem[i][c].name, LOCKSTAT_KALLOC);
} }
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论