Changes pde_t* -> pgdir_t
[akaros.git] / kern / src / kmalloc.c
index b6910c4..d1d14f6 100644 (file)
@@ -107,6 +107,7 @@ void *kmalloc_align(size_t size, int flags, size_t align)
        /* must fit in the space reserved for the offset amount, which is at most
         * 'align'. */
        assert(align < (1 << (32 - KMALLOC_ALIGN_SHIFT)));
+       assert(IS_PWR2(align));
        addr = kmalloc(size + align, flags);
        if (!addr)
                return 0;
@@ -136,9 +137,10 @@ static struct kmalloc_tag *__get_km_tag(void *buf)
        struct kmalloc_tag *tag = (struct kmalloc_tag*)(buf -
                                                    sizeof(struct kmalloc_tag));
        if (tag->canary != KMALLOC_CANARY){
-               printk("__get_km_tag bad canary: %08lx, expected %08lx\n", tag->canary,
-                      KMALLOC_CANARY);
+               printk("__get_km_tag bad canary: %08lx@%p, buf %p, expected %08lx\n",
+                      tag->canary, &tag->canary, buf, KMALLOC_CANARY);
                hexdump((void *)(buf - sizeof(struct kmalloc_tag)), 256);
+               panic("Bad canary");
        }
        return tag;
 }
@@ -212,6 +214,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);