#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;
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);
}
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); \
struct hlist_node *node = NULL;
struct hlist_head *head;
struct obd_mem_track *mt;
+ int header = 0;
#endif
int leaked;
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);