Valgrind annotations for the slab allocator:  Malloc-like and free-like
for cache_alloc and free.  Telling Valgrind a region is free-like clears
all the valid bits, so slabs with constructors need different treatment;
tell Valgrind about slab objects when first constructed and free them
when the slab is destroyed.

Signed-off-by: Steve VanDeBogart <[EMAIL PROTECTED]>
---

Index: linux-2.6.27-rc5/mm/slab.c
===================================================================
--- linux-2.6.27-rc5.orig/mm/slab.c     2008-08-29 14:24:25.000000000 -0700
+++ linux-2.6.27-rc5/mm/slab.c  2008-08-29 14:24:42.000000000 -0700
@@ -111,6 +111,7 @@
  #include      <linux/rtmutex.h>
  #include      <linux/reciprocal_div.h>
  #include      <linux/debugobjects.h>
+#include       <linux/memcheck.h>

  #include      <asm/cacheflush.h>
  #include      <asm/tlbflush.h>
@@ -1906,6 +1907,8 @@
        int i;
        for (i = 0; i < cachep->num; i++) {
                void *objp = index_to_obj(cachep, slabp, i);
+               if (cachep->ctor)
+                       VALGRIND_FREELIKE_BLOCK(objp, 0);

                if (cachep->flags & SLAB_POISON) {
  #ifdef CONFIG_DEBUG_PAGEALLOC
@@ -1932,6 +1935,15 @@
  #else
  static void slab_destroy_debugcheck(struct kmem_cache *cachep, struct slab 
*slabp)
  {
+#ifdef CONFIG_VALGRIND_SUPPORT
+       int i;
+       if (cachep->ctor) {
+               for (i = 0; i < cachep->num; i++) {
+                       void *objp = index_to_obj(cachep, slabp, i);
+                       VALGRIND_FREELIKE_BLOCK(objp, 0);
+               }
+       }
+#endif
  }
  #endif

@@ -2635,6 +2647,9 @@

        for (i = 0; i < cachep->num; i++) {
                void *objp = index_to_obj(cachep, slabp, i);
+               if (cachep->ctor)
+                       VALGRIND_MALLOCLIKE_BLOCK(objp, cachep->buffer_size,
+                                                       0, 0);
  #if DEBUG
                /* need to poison the objs? */
                if (cachep->flags & SLAB_POISON)
@@ -3466,6 +3481,8 @@
        objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
        prefetchw(objp);

+       if (!cachep->ctor)
+               VALGRIND_MALLOCLIKE_BLOCK(objp, cachep->buffer_size, 0, 0);
        if (unlikely((flags & __GFP_ZERO) && objp))
                memset(objp, 0, obj_size(cachep));

@@ -3578,6 +3595,9 @@
  {
        struct array_cache *ac = cpu_cache_get(cachep);

+       if (!cachep->ctor)
+               VALGRIND_FREELIKE_BLOCK(objp, 0);
+
        check_irq_off();
        objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to