Debugging helper: kmalloc_refcnt()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 26 Jun 2014 00:37:16 +0000 (17:37 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 26 Jun 2014 00:37:16 +0000 (17:37 -0700)
kern/include/kmalloc.h
kern/src/kmalloc.c

index 794a9ad..03d7c55 100644 (file)
@@ -22,6 +22,7 @@ void* (DALLOC(size) kzmalloc)(size_t size, int flags);
 void *kmalloc_align(size_t size, int flags, size_t align);
 void *kzmalloc_align(size_t size, int flags, size_t align);
 void *krealloc(void *buf, size_t size, int flags);
+int kmalloc_refcnt(void *buf);
 void kmalloc_incref(void *buf);
 void kfree(void *buf);
 void kmalloc_canary_check(char *str);
index b6910c4..3f9ebbf 100644 (file)
@@ -139,6 +139,7 @@ static struct kmalloc_tag *__get_km_tag(void *buf)
                printk("__get_km_tag bad canary: %08lx, expected %08lx\n", tag->canary,
                       KMALLOC_CANARY);
                hexdump((void *)(buf - sizeof(struct kmalloc_tag)), 256);
+               panic("Bad canary");
        }
        return tag;
 }
@@ -212,6 +213,13 @@ void kmalloc_incref(void *buf)
        kref_get(&__get_km_tag(buf)->kref, 1);
 }
 
+int kmalloc_refcnt(void *buf)
+{
+       void *orig_buf = __get_unaligned_orig_buf(buf);
+       buf = orig_buf ? orig_buf : buf;
+       return kref_refcnt(&__get_km_tag(buf)->kref);
+}
+
 static void __kfree_release(struct kref *kref)
 {
        struct kmalloc_tag *tag = container_of(kref, struct kmalloc_tag, kref);