Whamcloud - gitweb
- fixes about memory debug patch.
authoryury <yury>
Mon, 25 Sep 2006 14:31:09 +0000 (14:31 +0000)
committeryury <yury>
Mon, 25 Sep 2006 14:31:09 +0000 (14:31 +0000)
lustre/include/obd_support.h
lustre/lvfs/lvfs_linux.c

index a424098..2ec7f9b 100644 (file)
@@ -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);                                        \
index fe1264f..2916282 100644 (file)
@@ -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);