From 66ea60c1f1c9f7ff7c7b8e2d764e5976ece6d089 Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 25 Sep 2006 14:31:09 +0000 Subject: [PATCH] - fixes about memory debug patch. --- lustre/include/obd_support.h | 21 ++++++++++++++------- lustre/lvfs/lvfs_linux.c | 29 +++++++++++++++++------------ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/lustre/include/obd_support.h b/lustre/include/obd_support.h index a424098..2ec7f9b 100644 --- a/lustre/include/obd_support.h +++ b/lustre/include/obd_support.h @@ -263,8 +263,9 @@ extern atomic_t libcfs_kmemory; #if defined (CONFIG_DEBUG_MEMORY) && defined(__KERNEL__) -#define OBD_MT_WRONG_SIZE (1 << 0) -#define OBD_MT_LOC_LEN 128 +#define OBD_MT_WRONG_SIZE (1 << 0) +#define OBD_MT_ALREADY_FREED (1 << 1) +#define OBD_MT_LOC_LEN 128 struct obd_mem_track { struct hlist_node mt_hash; @@ -338,10 +339,16 @@ __put_mem_track(void *ptr, int size, return 0; } else { if (mt->mt_size != size) { - mt->mt_flags |= OBD_MT_WRONG_SIZE; - CWARN("Freeing memory chunk (at 0x%p) of different size " - "than allocated (%d != %d) at %s:%d, allocated at %s\n", - ptr, mt->mt_size, size, file, line, mt->mt_loc); + if (!(mt->mt_flags & OBD_MT_ALREADY_FREED)) { + mt->mt_flags |= (OBD_MT_WRONG_SIZE | + OBD_MT_ALREADY_FREED); + + CWARN("Freeing memory chunk (at 0x%p) of " + "different size than allocated " + "(%d != %d) at %s:%d, allocated at %s\n", + ptr, mt->mt_size, size, file, line, + mt->mt_loc); + } } else { __free_mem_track(mt); } @@ -505,7 +512,7 @@ do { \ LASSERT(ptr); \ CDEBUG(D_MALLOC, "slab-freed '" #ptr "': %d at %p (tot %d).\n", \ (int)(size), ptr, atomic_read(&obd_memory)); \ - get_mem_track((ptr), (size), __FILE__, __LINE__); \ + put_mem_track((ptr), (size), __FILE__, __LINE__); \ atomic_sub(size, &obd_memory); \ POISON(ptr, 0x5a, size); \ cfs_mem_cache_free(slab, ptr); \ diff --git a/lustre/lvfs/lvfs_linux.c b/lustre/lvfs/lvfs_linux.c index fe1264f..2916282c 100644 --- a/lustre/lvfs/lvfs_linux.c +++ b/lustre/lvfs/lvfs_linux.c @@ -586,6 +586,7 @@ void lvfs_memdbg_show(void) struct hlist_node *node = NULL; struct hlist_head *head; struct obd_mem_track *mt; + int header = 0; #endif int leaked; @@ -596,23 +597,27 @@ void lvfs_memdbg_show(void) leaked = atomic_read(&obd_memory); if (leaked > 0) { - CWARN("memory leaks detected (max %d, leaked %d)\n", + CWARN("Memory leaks detected (max %d, leaked %d)\n", obd_memmax, leaked); - + } + #if defined (CONFIG_DEBUG_MEMORY) && defined(__KERNEL__) - spin_lock(&obd_memlist_lock); - for (i = 0, head = obd_memtable; i < obd_memtable_size; i++, head++) { - hlist_for_each(node, head) { - mt = hlist_entry(node, struct obd_mem_track, mt_hash); - CWARN(" [%s] ptr: 0x%p, size: %d, src at \"%s\"\n", - ((mt->mt_flags & OBD_MT_WRONG_SIZE) ? - "wrong ck size" : "leaked memory"), - mt->mt_ptr, mt->mt_size, mt->mt_loc); + spin_lock(&obd_memlist_lock); + for (i = 0, head = obd_memtable; i < obd_memtable_size; i++, head++) { + hlist_for_each(node, head) { + if (header == 0) { + CWARN("Abnormal memory activities:\n"); + header = 1; } + mt = hlist_entry(node, struct obd_mem_track, mt_hash); + CWARN(" [%s] ptr: 0x%p, size: %d, src at \"%s\"\n", + ((mt->mt_flags & OBD_MT_WRONG_SIZE) ? + "wrong ck size" : "leaked memory"), + mt->mt_ptr, mt->mt_size, mt->mt_loc); } - spin_unlock(&obd_memlist_lock); -#endif } + spin_unlock(&obd_memlist_lock); +#endif } EXPORT_SYMBOL(lvfs_memdbg_show); -- 1.8.3.1