Add mtrace instrumentation to kmalloc and kmfree

上级 3672d2b0
...@@ -18,6 +18,8 @@ void kminit(void); ...@@ -18,6 +18,8 @@ void kminit(void);
struct kmem kmems[NCPU]; struct kmem kmems[NCPU];
extern char end[]; // first address after kernel loaded from ELF file extern char end[]; // first address after kernel loaded from ELF file
static int kinited;
static void __attribute__((unused)) static void __attribute__((unused))
kmemprint(void) kmemprint(void)
{ {
...@@ -46,6 +48,7 @@ kinit(void) ...@@ -46,6 +48,7 @@ kinit(void)
for(; p + PGSIZE <= (char*)PHYSTOP; p += PGSIZE) for(; p + PGSIZE <= (char*)PHYSTOP; p += PGSIZE)
kfree(p); kfree(p);
kminit(); kminit();
kinited = 1;
} }
//PAGEBREAK: 21 //PAGEBREAK: 21
...@@ -70,13 +73,14 @@ kfree(char *v) ...@@ -70,13 +73,14 @@ kfree(char *v)
r->next = m->freelist; r->next = m->freelist;
m->freelist = r; m->freelist = r;
m->nfree++; m->nfree++;
mtrace_label_register(mtrace_label_block, if (kinited)
r, mtrace_label_register(mtrace_label_block,
0, r,
0, 0,
0, 0,
RET_EIP()); 0,
RET_EIP());
release(&m->lock); release(&m->lock);
} }
...@@ -180,6 +184,12 @@ kmfree(void *ap) ...@@ -180,6 +184,12 @@ kmfree(void *ap)
{ {
acquire(&freelists[cpu->id].lock); acquire(&freelists[cpu->id].lock);
domfree(ap); domfree(ap);
mtrace_label_register(mtrace_label_heap,
ap,
0,
0,
0,
RET_EIP());
release(&freelists[cpu->id].lock); release(&freelists[cpu->id].lock);
} }
...@@ -235,5 +245,13 @@ kmalloc(uint nbytes) ...@@ -235,5 +245,13 @@ kmalloc(uint nbytes)
break; break;
} }
release(&freelists[cpu->id].lock); release(&freelists[cpu->id].lock);
if (r)
mtrace_label_register(mtrace_label_heap,
r,
nbytes,
"kmalloc",
sizeof("kmalloc"),
RET_EIP());
return r; return r;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论