summaryrefslogtreecommitdiff
path: root/benchmarks/gem_exec_tracer.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-08-14 20:31:48 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-08-14 20:34:21 +0100
commita64e6c39b13c2a59d807cab9d4faefd4aaa49d0c (patch)
tree1142b9cf85701a404edbc938e979e7f29dbb215a /benchmarks/gem_exec_tracer.c
parent78120d8158555fd393eb73e7dc992388b6d03f05 (diff)
benchmark/gem_exec_tracer: Tweak to handle SNA
SNA starts by feeding in deliberately bad ioctls in order to detect the kernel interface versions. A quick solution is to always feed it to the ioctl and only record the trace if it is valid. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'benchmarks/gem_exec_tracer.c')
-rw-r--r--benchmarks/gem_exec_tracer.c143
1 files changed, 80 insertions, 63 deletions
diff --git a/benchmarks/gem_exec_tracer.c b/benchmarks/gem_exec_tracer.c
index ccc2d23a..f0057942 100644
--- a/benchmarks/gem_exec_tracer.c
+++ b/benchmarks/gem_exec_tracer.c
@@ -170,6 +170,35 @@ close(int fd)
return libc_close(fd);
}
+static unsigned long
+size_for_fb(const struct drm_mode_fb_cmd *cmd)
+{
+ unsigned long size;
+
+#ifndef ALIGN
+#define ALIGN(x, y) (((x) + (y) - 1) & -(y))
+#endif
+
+ size = ALIGN(cmd->width * cmd->bpp, 64);
+ size *= cmd->height;
+ return ALIGN(size, 4096);
+}
+
+static int is_i915(int fd)
+{
+ drm_version_t version;
+ char name[5] = "";
+
+ memset(&version, 0, sizeof(version));
+ version.name_len = 4;
+ version.name = name;
+
+ if (libc_ioctl(fd, DRM_IOCTL_VERSION, &version))
+ return 0;
+
+ return strcmp(name, "i915") == 0;
+}
+
int
ioctl(int fd, unsigned long request, ...)
{
@@ -181,84 +210,72 @@ ioctl(int fd, unsigned long request, ...)
argp = va_arg(args, void *);
va_end(args);
- if (_IOC_TYPE(request) == DRM_IOCTL_BASE && drm_fd != fd) {
+ ret = libc_ioctl(fd, request, argp);
+ if (ret)
+ return ret;
+
+ if (_IOC_TYPE(request) != DRM_IOCTL_BASE)
+ return 0;
+
+ if (drm_fd != fd) {
char filename[80];
+
+ if (!is_i915(fd))
+ return 0;
+
if (file)
fclose(file);
+
sprintf(filename, "/tmp/trace.%d", fd);
file = fopen(filename, "w+");
drm_fd = fd;
}
- if (fd == drm_fd) {
- switch (request) {
- case DRM_IOCTL_I915_GEM_EXECBUFFER: {
- return libc_ioctl(fd, request, argp);
- }
-
- case DRM_IOCTL_I915_GEM_EXECBUFFER2: {
- trace_exec(fd, argp);
- return libc_ioctl(fd, request, argp);
- }
-
- case DRM_IOCTL_I915_GEM_CREATE: {
- struct drm_i915_gem_create *create = argp;
-
- ret = libc_ioctl(fd, request, argp);
- if (ret == 0)
- trace_add(create->handle, create->size);
+ switch (request) {
+ case DRM_IOCTL_I915_GEM_EXECBUFFER2:
+ trace_exec(fd, argp);
+ break;
- return ret;
- }
-
- case DRM_IOCTL_I915_GEM_USERPTR: {
- struct drm_i915_gem_userptr *userptr = argp;
-
- ret = libc_ioctl(fd, request, argp);
- if (ret == 0)
- trace_add(userptr->handle, userptr->user_size);
- return ret;
- }
-
- case DRM_IOCTL_GEM_CLOSE: {
- struct drm_gem_close *close = argp;
-
- trace_del(close->handle);
-
- return libc_ioctl(fd, request, argp);
- }
-
- case DRM_IOCTL_GEM_OPEN: {
- struct drm_gem_open *open = argp;
-
- ret = libc_ioctl(fd, request, argp);
- if (ret == 0)
- trace_add(open->handle, open->size);
-
- return ret;
- }
+ case DRM_IOCTL_I915_GEM_CREATE: {
+ struct drm_i915_gem_create *create = argp;
+ trace_add(create->handle, create->size);
+ break;
+ }
- case DRM_IOCTL_PRIME_FD_TO_HANDLE: {
- struct drm_prime_handle *prime = argp;
+ case DRM_IOCTL_I915_GEM_USERPTR: {
+ struct drm_i915_gem_userptr *userptr = argp;
+ trace_add(userptr->handle, userptr->user_size);
+ break;
+ }
- ret = libc_ioctl(fd, request, argp);
- if (ret == 0) {
- off_t size;
+ case DRM_IOCTL_GEM_CLOSE: {
+ struct drm_gem_close *close = argp;
+ trace_del(close->handle);
+ break;
+ }
- size = lseek(prime->fd, 0, SEEK_END);
- fail_if(size == -1, "failed to get prime bo size\n");
- trace_add(prime->handle, size);
- }
+ case DRM_IOCTL_GEM_OPEN: {
+ struct drm_gem_open *open = argp;
+ trace_add(open->handle, open->size);
+ break;
+ }
- return ret;
- }
+ case DRM_IOCTL_PRIME_FD_TO_HANDLE: {
+ struct drm_prime_handle *prime = argp;
+ off_t size = lseek(prime->fd, 0, SEEK_END);
+ fail_if(size == -1, "failed to get prime bo size\n");
+ trace_add(prime->handle, size);
+ break;
+ }
- default:
- return libc_ioctl(fd, request, argp);
- }
- } else {
- return libc_ioctl(fd, request, argp);
+ case DRM_IOCTL_MODE_GETFB: {
+ struct drm_mode_fb_cmd *cmd = argp;
+ trace_add(cmd->handle, size_for_fb(cmd));
+ break;
}
+ }
+
+ return 0;
}
static void __attribute__ ((constructor))