From da7421e8eec567e74d2d12cf249f09a546f3d7d1 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Fri, 7 Jul 2017 07:46:50 +0900 Subject: [PATCH] memdebug: more detailed error report --- kernel/mem.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/kernel/mem.c b/kernel/mem.c index 97f3cbf3..4e0a2e8a 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -258,6 +258,15 @@ void _ihk_mc_free_pages(void *ptr, int npages, char *file, int line) } if (addr_entry) { + if (npages > addr_entry->npages) { + kprintf("%s: ERROR: trying to deallocate %d pages" + " for a %d pages allocation at %s:%d\n", + __FUNCTION__, + npages, addr_entry->npages, + file, line); + panic("invalid deallocation"); + } + if (addr_entry->npages > npages) { addr_entry->addr += (npages * PAGE_SIZE); addr_entry->npages -= npages; @@ -300,9 +309,9 @@ void _ihk_mc_free_pages(void *ptr, int npages, char *file, int line) /* Still not? Invalid deallocation */ if (!addr_entry) { - kprintf("%s: ERROR: invalid deallocation @ %s:%d\n", - __FUNCTION__, file, line); - panic("invalid deallocation"); + kprintf("%s: ERROR: invalid deallocation for addr: 0x%lx @ %s:%d\n", + __FUNCTION__, ptr, file, line); + panic("panic: invalid deallocation"); } dkprintf("%s: found covering addr_entry: 0x%lx:%d\n", __FUNCTION__, @@ -1719,6 +1728,10 @@ void _kfree(void *ptr, char *file, int line) struct kmalloc_track_addr_entry *addr_entry_iter, *addr_entry = NULL; int hash; + if (!ptr) { + return; + } + if (!memdebug) { goto out; } @@ -1739,7 +1752,8 @@ void _kfree(void *ptr, char *file, int line) ihk_mc_spinlock_unlock(&kmalloc_addr_hash_locks[hash], irqflags); if (!addr_entry) { - kprintf("%s: ERROR: kfree()ing invalid pointer\n", __FUNCTION__); + kprintf("%s: ERROR: kfree()ing invalid pointer at %s:%d\n", + __FUNCTION__, file, line); panic("panic"); }