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

^F to print kmem stats

上级 64d15277
...@@ -124,6 +124,7 @@ int kmalign(void **p, int align, u64 size); ...@@ -124,6 +124,7 @@ int kmalign(void **p, int align, u64 size);
void kmalignfree(void *, int align, u64 size); void kmalignfree(void *, int align, u64 size);
void verifyfree(char *ptr, u64 nbytes); void verifyfree(char *ptr, u64 nbytes);
void kminit(void); void kminit(void);
void kmemprint(void);
// kbd.c // kbd.c
void kbdintr(void); void kbdintr(void);
......
...@@ -282,6 +282,9 @@ consoleintr(int (*getc)(void)) ...@@ -282,6 +282,9 @@ consoleintr(int (*getc)(void))
profenable = 0; profenable = 0;
cprintf("prof disabled\n"); cprintf("prof disabled\n");
break; break;
case C('F'): // kmem stats
kmemprint();
break;
default: default:
if(c != 0 && input.e-input.r < INPUT_BUF){ if(c != 0 && input.e-input.r < INPUT_BUF){
c = (c == '\r') ? '\n' : c; c = (c == '\r') ? '\n' : c;
......
...@@ -136,18 +136,26 @@ kfree_pool(struct kmem *m, char *v) ...@@ -136,18 +136,26 @@ kfree_pool(struct kmem *m, char *v)
mtunlabel(mtrace_label_block, r); mtunlabel(mtrace_label_block, r);
} }
static void __attribute__((unused)) static void
kmemprint(void) kmemprint_pool(struct kmem *km)
{ {
cprintf("free pages: [ "); cprintf("pool %s: [ ", &km[0].name[1]);
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.load()); cprintf("<%lu> ", km[i].nfree.load());
else else
cprintf("%lu ", kmems[i].nfree.load()); cprintf("%lu ", km[i].nfree.load());
cprintf("]\n"); cprintf("]\n");
} }
void
kmemprint()
{
kmemprint_pool(kmems);
for (int i = 0; i < slab_type_max; i++)
kmemprint_pool(slabmem[i]);
}
static char* static char*
kalloc_pool(struct kmem *km) kalloc_pool(struct kmem *km)
{ {
...@@ -242,15 +250,15 @@ initkalloc(u64 mbaddr) ...@@ -242,15 +250,15 @@ initkalloc(u64 mbaddr)
k = (((uptr)p) - KBASE); k = (((uptr)p) - KBASE);
for (int c = 0; c < NCPU; c++) { for (int c = 0; c < NCPU; c++) {
// Fill slab allocators // Fill slab allocators
strncpy(slabmem[slab_stack][c].name, " kstack", MAXNAME); strncpy(slabmem[slab_stack][c].name, " kstack", MAXNAME);
slabmem[slab_stack][c].size = KSTACKSIZE; slabmem[slab_stack][c].size = KSTACKSIZE;
slabmem[slab_stack][c].ninit = CPUKSTACKS; slabmem[slab_stack][c].ninit = CPUKSTACKS;
strncpy(slabmem[slab_perf][c].name, " kperf", MAXNAME); strncpy(slabmem[slab_perf][c].name, " kperf", MAXNAME);
slabmem[slab_perf][c].size = PERFSIZE; slabmem[slab_perf][c].size = PERFSIZE;
slabmem[slab_perf][c].ninit = 1; slabmem[slab_perf][c].ninit = 1;
strncpy(slabmem[slab_kshared][c].name, " kshared", MAXNAME); strncpy(slabmem[slab_kshared][c].name, " kshared", MAXNAME);
slabmem[slab_kshared][c].size = KSHAREDSIZE; slabmem[slab_kshared][c].size = KSHAREDSIZE;
slabmem[slab_kshared][c].ninit = CPUKSTACKS; slabmem[slab_kshared][c].ninit = CPUKSTACKS;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论