diff --git a/configure.ac b/configure.ac
index 8be1e2a..d7544fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -47,6 +47,10 @@ AC_ARG_ENABLE(nouveau-experimental-api,
 	      [Enable support for nouveau's experimental API (default: disabled)]),
 	      [NOUVEAU=$enableval], [NOUVEAU=no])
 
+AC_ARG_ENABLE(valgrind,     AS_HELP_STRING([--enable-valgrind],
+                                [Build with valgrind support (default: disabled)]),
+                                [VALGRIND=$enableval], [VALGRIND=no])
+
 dnl ===========================================================================
 dnl check compiler flags
 AC_DEFUN([LIBDRM_CC_TRY_FLAG], [
@@ -131,6 +135,10 @@ if test "x$HAVE_CAIRO" = xyes; then
 fi
 AM_CONDITIONAL(HAVE_CAIRO, [test "x$HAVE_CAIRO" = xyes])
 
+if test "x$VALGRIND" = xyes; then
+        AC_DEFINE(VALGRIND, 1, [Have valgrind support])
+fi
+
 
 AC_SUBST(WARN_CFLAGS)
 AC_OUTPUT([
diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c
index e48778c..6f1ffb8 100644
--- a/libdrm/intel/intel_bufmgr_gem.c
+++ b/libdrm/intel/intel_bufmgr_gem.c
@@ -38,6 +38,9 @@
 #include "config.h"
 #endif
 
+#ifdef VALGRIND
+#include <valgrind/valgrind.h>
+#endif
 #include <xf86drm.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -424,6 +427,10 @@ drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr, const char *name,
     DBG("bo_create: buf %d (%s) %ldb\n",
 	bo_gem->gem_handle, bo_gem->name, size);
 
+#ifdef VALGRIND
+    VALGRIND_MALLOCLIKE_BLOCK( bo_gem->gem_handle, 0, 0, 0 );
+#endif
+
     return &bo_gem->bo;
 }
 
@@ -553,6 +560,10 @@ drm_intel_gem_bo_unreference_locked(drm_intel_bo *bo)
 	struct drm_intel_gem_bo_bucket *bucket;
 	uint32_t tiling_mode;
 
+#ifdef VALGRIND
+        VALGRIND_FREELIKE_BLOCK( bo_gem->gem_handle, 0 );
+#endif
+
 	if (bo_gem->relocs != NULL) {
 	    int i;
 
@@ -635,6 +646,10 @@ drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
     }
     DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
 	bo_gem->mem_virtual);
+
+#ifdef VALGRIND
+    VALGRIND_MALLOCLIKE_BLOCK( bo_gem->mem_virtual, bo->size, 0, /*is_zeroed*/0 );
+#endif
     bo->virtual = bo_gem->mem_virtual;
 
     if (bo_gem->global_name != 0 || !bo_gem->swrast) {
@@ -749,6 +764,10 @@ drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
     bo->virtual = NULL;
     pthread_mutex_unlock(&bufmgr_gem->lock);
 
+#ifdef VALGRIND
+    VALGRIND_FREELIKE_BLOCK( bo_gem->mem_virtual, bo->size );
+#endif
+
     return ret;
 }
 
