提交 bf9656f1 创建 作者: Austin Clements's avatar Austin Clements

Switch kalloc to use percpu instead of hand-coded CPU arrays

上级 2743888d
#include "atomic.hh" #include "atomic.hh"
#include "percpu.hh"
template<class T> template<class T>
struct vptr64 { struct vptr64 {
...@@ -59,7 +60,7 @@ struct kmem { ...@@ -59,7 +60,7 @@ struct kmem {
run* alloc(const char* name); run* alloc(const char* name);
void free(run* r); void free(run* r);
} __mpalign__; };
enum { enum {
slab_stack, slab_stack,
...@@ -70,5 +71,5 @@ enum { ...@@ -70,5 +71,5 @@ enum {
slab_type_max slab_type_max
}; };
extern struct kmem kmems[NCPU]; extern percpu<kmem> kmems;
extern struct kmem slabmem[slab_type_max][NCPU]; extern percpu<kmem> slabmem[slab_type_max];
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
static struct Mbmem mem[128]; static struct Mbmem mem[128];
static u64 nmem; static u64 nmem;
static u64 membytes; static u64 membytes;
struct kmem kmems[NCPU]; percpu<kmem> kmems;
struct kmem slabmem[slab_type_max][NCPU]; percpu<kmem> slabmem[slab_type_max];
extern char end[]; // first address after kernel loaded from ELF file extern char end[]; // first address after kernel loaded from ELF file
char *newend; char *newend;
...@@ -170,7 +170,7 @@ kfree_pool(struct kmem *m, char *v) ...@@ -170,7 +170,7 @@ kfree_pool(struct kmem *m, char *v)
} }
static void static void
kmemprint_pool(struct kmem *km) kmemprint_pool(const percpu<kmem> &km)
{ {
cprintf("pool %s: [ ", &km[0].name[1]); cprintf("pool %s: [ ", &km[0].name[1]);
for (u32 i = 0; i < NCPU; i++) for (u32 i = 0; i < NCPU; i++)
...@@ -191,7 +191,7 @@ kmemprint() ...@@ -191,7 +191,7 @@ kmemprint()
static char* static char*
kalloc_pool(struct kmem *km, const char *name) kalloc_pool(const percpu<kmem> &km, const char *name)
{ {
struct run *r = 0; struct run *r = 0;
struct kmem *m; struct kmem *m;
...@@ -228,7 +228,7 @@ kalloc(const char *name) ...@@ -228,7 +228,7 @@ kalloc(const char *name)
void * void *
ksalloc(int slab) ksalloc(int slab)
{ {
return kalloc_pool(slabmem[slab], slabmem[slab][mycpuid()].name); return kalloc_pool(slabmem[slab], slabmem[slab]->name);
} }
void void
...@@ -321,5 +321,5 @@ kfree(void *v) ...@@ -321,5 +321,5 @@ kfree(void *v)
void void
ksfree(int slab, void *v) ksfree(int slab, void *v)
{ {
kfree_pool(&slabmem[slab][mycpuid()], (char*) v); kfree_pool(slabmem[slab].get(), (char*) v);
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论