radix tree test suite: Introduce kmalloc_verbose
authorMatthew Wilcox <mawilcox@microsoft.com>
Sat, 24 Dec 2016 12:49:18 +0000 (07:49 -0500)
committerMatthew Wilcox <mawilcox@microsoft.com>
Tue, 14 Feb 2017 02:44:03 +0000 (21:44 -0500)
To help track down where memory leaks may be, add the ability to turn
on/off printing allocations, frees and delayed frees.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
tools/testing/radix-tree/linux.c
tools/testing/radix-tree/linux/radix-tree.h

index 93f0661..3e4f9f3 100644 (file)
@@ -13,6 +13,7 @@
 
 int nr_allocated;
 int preempt_count;
+int kmalloc_verbose;
 
 struct kmem_cache {
        pthread_mutex_t lock;
@@ -44,6 +45,8 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
        }
 
        uatomic_inc(&nr_allocated);
+       if (kmalloc_verbose)
+               printf("Allocating %p from slab\n", node);
        return node;
 }
 
@@ -51,6 +54,8 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
 {
        assert(objp);
        uatomic_dec(&nr_allocated);
+       if (kmalloc_verbose)
+               printf("Freeing %p to slab\n", objp);
        pthread_mutex_lock(&cachep->lock);
        if (cachep->nr_objs > 10) {
                memset(objp, POISON_FREE, cachep->size);
@@ -68,6 +73,8 @@ void *kmalloc(size_t size, gfp_t gfp)
 {
        void *ret = malloc(size);
        uatomic_inc(&nr_allocated);
+       if (kmalloc_verbose)
+               printf("Allocating %p from malloc\n", ret);
        return ret;
 }
 
@@ -76,6 +83,8 @@ void kfree(void *p)
        if (!p)
                return;
        uatomic_dec(&nr_allocated);
+       if (kmalloc_verbose)
+               printf("Freeing %p to malloc\n", p);
        free(p);
 }
 
index ce694dd..f4d8532 100644 (file)
@@ -1 +1,18 @@
+#ifndef _TEST_RADIX_TREE_H
+#define _TEST_RADIX_TREE_H
 #include "../../../../include/linux/radix-tree.h"
+
+extern int kmalloc_verbose;
+
+static inline void trace_call_rcu(struct rcu_head *head,
+               void (*func)(struct rcu_head *head))
+{
+       if (kmalloc_verbose)
+               printf("Delaying free of %p to slab\n", (char *)head -
+                               offsetof(struct radix_tree_node, rcu_head));
+       call_rcu(head, func);
+}
+#undef call_rcu
+#define call_rcu(x, y) trace_call_rcu(x, y)
+
+#endif /* _TEST_RADIX_TREE_H */