summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-02-09 10:42:01 +0100
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-02-27 11:17:25 +0100
commitd930b6493d93a6e6c2ca9a5ed468d360a9183586 (patch)
tree353049a57f2544c68f3e771f8bf84fbeedc3e39b
parent8f3164ff51b7ceef87ebc285c5ba9874ceee767e (diff)
lib: Add basic support for valgrind annotations.
SIGRTMAX appears to be used by valgrind now for its internal tracking, so avoid it in the helpers. Also add some valgrind annotations in gem_mmap, to make sure that its accesses are tracked correctly. I've also added gem_munmap, but there are a lot of places that don't use it yet in tests/. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
-rw-r--r--configure.ac5
-rw-r--r--lib/Makefile.am1
-rw-r--r--lib/igt_aux.c2
-rw-r--r--lib/igt_draw.c6
-rw-r--r--lib/igt_dummyload.c5
-rw-r--r--lib/igt_fb.c6
-rw-r--r--lib/ioctl_wrappers.c25
-rw-r--r--lib/ioctl_wrappers.h2
8 files changed, 43 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac
index 5bdd744a..562d5525 100644
--- a/configure.ac
+++ b/configure.ac
@@ -124,6 +124,11 @@ PKG_CHECK_MODULES(DRM, [libdrm])
PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])
PKG_CHECK_MODULES(KMOD, [libkmod])
PKG_CHECK_MODULES(PROCPS, [libprocps])
+PKG_CHECK_MODULES(VALGRIND, [valgrind], [have_valgrind=yes], [have_valgrind=no])
+
+if test x$have_valgrind = xyes; then
+ AC_DEFINE(HAVE_VALGRIND, 1, [Enable valgrind annotation support.])
+fi
case "$target_cpu" in
x86*|i?86)
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 7030ea27..c0ddf298 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -34,6 +34,7 @@ AM_CFLAGS = \
$(XMLRPC_CFLAGS) \
$(LIBUDEV_CFLAGS) \
$(PIXMAN_CFLAGS) \
+ $(VALGRIND_CFLAGS) \
-DIGT_SRCDIR=\""$(abs_top_srcdir)/tests"\" \
-DIGT_DATADIR=\""$(pkgdatadir)"\" \
-DIGT_LOG_DOMAIN=\""$(subst _,-,$*)"\" \
diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index 763e997c..eb4ca640 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -402,7 +402,7 @@ void igt_fork_hang_detector(int fd)
igt_assert(fstat(fd, &st) == 0);
- signal(SIGRTMAX, sig_abort);
+ signal(SIGRTMAX - 1, sig_abort);
igt_fork_helper(&hang_detector)
hang_detector_process(getppid(), st.st_rdev);
}
diff --git a/lib/igt_draw.c b/lib/igt_draw.c
index 3afb8272..29aec850 100644
--- a/lib/igt_draw.c
+++ b/lib/igt_draw.c
@@ -269,7 +269,7 @@ static void draw_rect_mmap_cpu(int fd, struct buf_data *buf, struct rect *rect,
gem_sw_finish(fd, buf->handle);
- igt_assert(munmap(ptr, buf->size) == 0);
+ igt_assert(gem_munmap(ptr, buf->size) == 0);
}
static void draw_rect_mmap_gtt(int fd, struct buf_data *buf, struct rect *rect,
@@ -284,7 +284,7 @@ static void draw_rect_mmap_gtt(int fd, struct buf_data *buf, struct rect *rect,
draw_rect_ptr_linear(ptr, buf->stride, rect, color, buf->bpp);
- igt_assert(munmap(ptr, buf->size) == 0);
+ igt_assert(gem_munmap(ptr, buf->size) == 0);
}
static void draw_rect_mmap_wc(int fd, struct buf_data *buf, struct rect *rect,
@@ -317,7 +317,7 @@ static void draw_rect_mmap_wc(int fd, struct buf_data *buf, struct rect *rect,
break;
}
- igt_assert(munmap(ptr, buf->size) == 0);
+ igt_assert(gem_munmap(ptr, buf->size) == 0);
}
static void draw_rect_pwrite_untiled(int fd, struct buf_data *buf,
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 7ceb370b..019c1fbc 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -220,7 +220,8 @@ void igt_spin_batch_set_timeout(igt_spin_t *spin, int64_t ns)
igt_assert(!spin->timer);
- if (spin_signo == SIGRTMAX)
+ /* SIGRTMAX is used by valgrind, SIGRTMAX - 1 by igt_fork_hang_detector */
+ if (spin_signo >= SIGRTMAX - 2)
spin_signo = SIGRTMIN;
spin->signo = ++spin_signo;
@@ -283,7 +284,7 @@ void igt_spin_batch_free(int fd, igt_spin_t *spin)
timer_delete(spin->timer);
igt_spin_batch_end(spin);
- munmap(spin->batch, BATCH_SIZE);
+ gem_munmap(spin->batch, BATCH_SIZE);
gem_close(fd, spin->handle);
free(spin);
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index bb87869f..d2b7e9e3 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -237,7 +237,7 @@ static int create_bo_for_fb(int fd, int width, int height, uint32_t format,
/* Ensure the framebuffer is preallocated */
ptr = gem_mmap__gtt(fd, bo, size, PROT_READ);
igt_assert(*ptr == 0);
- munmap(ptr, size);
+ gem_munmap(ptr, size);
if (size_ret)
*size_ret = size;
@@ -988,7 +988,7 @@ static void destroy_cairo_surface__blit(void *arg)
struct igt_fb *fb = blit->fb;
unsigned int obj_tiling = igt_fb_mod_to_tiling(fb->tiling);
- munmap(blit->linear.map, blit->linear.size);
+ gem_munmap(blit->linear.map, blit->linear.size);
fb->cairo_surface = NULL;
gem_set_domain(blit->fd, blit->linear.handle,
@@ -1095,7 +1095,7 @@ static void destroy_cairo_surface__gtt(void *arg)
{
struct igt_fb *fb = arg;
- munmap(cairo_image_surface_get_data(fb->cairo_surface), fb->size);
+ gem_munmap(cairo_image_surface_get_data(fb->cairo_surface), fb->size);
fb->cairo_surface = NULL;
if (fb->is_dumb)
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 2d1be49b..7370543f 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -56,6 +56,15 @@
#include "igt_debugfs.h"
#include "config.h"
+#ifdef HAVE_VALGRIND
+#include <valgrind/valgrind.h>
+#include <valgrind/memcheck.h>
+
+#define VG(x) x
+#else
+#define VG(x)
+#endif
+
#include "ioctl_wrappers.h"
/**
@@ -636,6 +645,8 @@ void *__gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot)
else
errno = 0;
+ VG(VALGRIND_MAKE_MEM_DEFINED(ptr, size));
+
return ptr;
}
@@ -657,6 +668,16 @@ void *gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot)
return ptr;
}
+int gem_munmap(void *ptr, uint64_t size)
+{
+ int ret = munmap(ptr, size);
+
+ if (ret == 0)
+ VG(VALGRIND_MAKE_MEM_NOACCESS(ptr, size));
+
+ return ret;
+}
+
struct local_i915_gem_mmap_v2 {
uint32_t handle;
uint32_t pad;
@@ -734,6 +755,8 @@ void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, un
if (igt_ioctl(fd, LOCAL_IOCTL_I915_GEM_MMAP_v2, &arg))
return NULL;
+ VG(VALGRIND_MAKE_MEM_DEFINED(from_user_pointer(arg.addr_ptr), arg.size));
+
errno = 0;
return from_user_pointer(arg.addr_ptr);
}
@@ -781,6 +804,8 @@ void *__gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, u
if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg))
return NULL;
+ VG(VALGRIND_MAKE_MEM_DEFINED(from_user_pointer(mmap_arg.addr_ptr), mmap_arg.size));
+
errno = 0;
return from_user_pointer(mmap_arg.addr_ptr);
}
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index cf33da87..ef92b5bc 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -86,6 +86,8 @@ void *__gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot);
void *__gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
+int gem_munmap(void *ptr, uint64_t size);
+
/**
* gem_require_stolen_support:
* @fd: open i915 drm file descriptor