Debugging code to help me find places where I forget to call destroylock

上级 1c3d2bb6
...@@ -136,9 +136,12 @@ kfree_pool(struct kmem *m, char *v) ...@@ -136,9 +136,12 @@ kfree_pool(struct kmem *m, char *v)
if (memsize(v) == -1ull) if (memsize(v) == -1ull)
panic("kfree_pool: unknown region %p", v); panic("kfree_pool: unknown region %p", v);
// Fill with junk to catch dangling refs. if (kinited && m->size <= 16384) {
if (kinited && kalloc_memset && m->size <= 16384) verifyfree(v, m->size);
memset(v, 1, m->size); // Fill with junk to catch dangling refs.
if (kalloc_memset)
memset(v, 1, m->size);
}
acquire(&m->lock); acquire(&m->lock);
r = (struct run*)v; r = (struct run*)v;
...@@ -289,3 +292,20 @@ ksfree(slab_t slab, void *v) ...@@ -289,3 +292,20 @@ ksfree(slab_t slab, void *v)
{ {
kfree_pool(slabmem[slab], v); kfree_pool(slabmem[slab], v);
} }
void
verifyfree(char *ptr, u64 nbytes)
{
#if VERIFYFREE
char *e = ptr + nbytes;
for (; ptr < e; ptr++) {
// Search for pointers in the ptr region
u64 x = *(uptr *)ptr;
if (KBASE < x && x < KBASE+(128ull<<30)) {
struct klockstat *kls = (struct klockstat *) x;
if (kls->magic == LOCKSTAT_MAGIC)
panic("verifyunmarked: LOCKSTAT_MAGIC %p:%lu", ptr, nbytes);
}
}
#endif
}
...@@ -154,7 +154,7 @@ void* kmalloc(u64); ...@@ -154,7 +154,7 @@ void* kmalloc(u64);
void kmfree(void*); void kmfree(void*);
int kmalign(void **p, int align, u64 size); int kmalign(void **p, int align, u64 size);
void kmalignfree(void *); void kmalignfree(void *);
void verifyfree(char *ptr, u64 nbytes);
// kbd.c // kbd.c
void kbdintr(void); void kbdintr(void);
......
...@@ -102,6 +102,7 @@ kmfree(void *ap) ...@@ -102,6 +102,7 @@ kmfree(void *ap)
b = (long) h->next; b = (long) h->next;
if(b < 0 || b > KMMAX) if(b < 0 || b > KMMAX)
panic("kmfree bad bucket"); panic("kmfree bad bucket");
verifyfree(ap, 1 << b);
h->next = freelists[c].buckets[b]; h->next = freelists[c].buckets[b];
freelists[c].buckets[b] = h; freelists[c].buckets[b] = h;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论