intel/dump_gpu: only write BOs mapped by the driver
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 2 Oct 2019 23:13:32 +0000 (02:13 +0300)
committerMarge Bot <eric+marge@anholt.net>
Fri, 7 Aug 2020 11:27:54 +0000 (11:27 +0000)
Track what BOs are mapped by the driver and only write those. We can
safely assume that when not mapped there is no data to save.

v2: Don't forget to return the ret (Rafael)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2201>

src/intel/tools/intel_dump_gpu.c

index 24dd1dffcaa596b86653769459eced47eaa03482..1b6a1fa6cb9cba53b30e8d5ebd33c3ffcbc5471c 100644 (file)
@@ -65,6 +65,7 @@ struct bo {
    uint32_t size;
    uint64_t offset;
    void *map;
+   bool mapped;
 };
 
 static struct bo *bos;
@@ -285,12 +286,14 @@ dump_execbuffer2(int fd, struct drm_i915_gem_execbuffer2 *execbuffer2)
       else
          data = bo->map;
 
-      if (bo == batch_bo) {
-         aub_write_trace_block(&aub_file, AUB_TRACE_TYPE_BATCH,
-                               GET_PTR(data), bo->size, bo->offset);
-      } else {
-         aub_write_trace_block(&aub_file, AUB_TRACE_TYPE_NOTYPE,
-                               GET_PTR(data), bo->size, bo->offset);
+      if (bo->mapped) {
+         if (bo == batch_bo) {
+            aub_write_trace_block(&aub_file, AUB_TRACE_TYPE_BATCH,
+                                  GET_PTR(data), bo->size, bo->offset);
+         } else {
+            aub_write_trace_block(&aub_file, AUB_TRACE_TYPE_NOTYPE,
+                                  GET_PTR(data), bo->size, bo->offset);
+         }
       }
 
       if (data != bo->map)
@@ -331,6 +334,7 @@ add_new_bo(unsigned fd, int handle, uint64_t size, void *map)
 
    bo->size = size;
    bo->map = map;
+   bo->mapped = false;
 }
 
 static void
@@ -342,6 +346,7 @@ remove_bo(int fd, int handle)
       munmap(bo->map, bo->size);
    bo->size = 0;
    bo->map = NULL;
+   bo->mapped = false;
 }
 
 __attribute__ ((visibility ("default"))) int
@@ -636,6 +641,16 @@ ioctl(int fd, unsigned long request, ...)
          return ret;
       }
 
+      case DRM_IOCTL_I915_GEM_MMAP: {
+         ret = libc_ioctl(fd, request, argp);
+         if (ret == 0) {
+            struct drm_i915_gem_mmap *mmap = argp;
+            struct bo *bo = get_bo(fd, mmap->handle);
+            bo->mapped = true;
+         }
+         return ret;
+      }
+
       default:
          return libc_ioctl(fd, request, argp);
       }