drm/msm: devcoredump should dump MSM_SUBMIT_BO_DUMP buffers
authorRob Clark <robdclark@chromium.org>
Tue, 18 Feb 2020 21:20:12 +0000 (13:20 -0800)
committerRob Clark <robdclark@chromium.org>
Thu, 19 Mar 2020 19:18:44 +0000 (12:18 -0700)
Also log buffers with the DUMP flag set, to ensure we capture all useful
cmdstream in crashdump state with modern mesa.

Otherwise we miss out on the contents of "state object" cmdstream
buffers.

v2: add missing 'inline'

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Jordan Crouse <jcrouse@codeaurora.org>
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_rd.c

index 37aa556c5f9223d51aed28eae5bc820fb9862771..30584eaf8cc8dd7b985cf1dce3063ce0267ab175 100644 (file)
@@ -160,4 +160,14 @@ struct msm_gem_submit {
        } bos[];
 };
 
+/* helper to determine of a buffer in submit should be dumped, used for both
+ * devcoredump and debugfs cmdstream dumping:
+ */
+static inline bool
+should_dump(struct msm_gem_submit *submit, int idx)
+{
+       extern bool rd_full;
+       return rd_full || (submit->bos[idx].flags & MSM_SUBMIT_BO_DUMP);
+}
+
 #endif /* __MSM_GEM_H__ */
index 18f3a5c53ffb9f8aef285062f21cf61fd7065d0e..615c5cda5389eb1ce7d3d0e6ab9bb8956ace18d4 100644 (file)
@@ -355,16 +355,34 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
        state->cmd = kstrdup(cmd, GFP_KERNEL);
 
        if (submit) {
-               int i;
-
-               state->bos = kcalloc(submit->nr_cmds,
+               int i, nr = 0;
+
+               /* count # of buffers to dump: */
+               for (i = 0; i < submit->nr_bos; i++)
+                       if (should_dump(submit, i))
+                               nr++;
+               /* always dump cmd bo's, but don't double count them: */
+               for (i = 0; i < submit->nr_cmds; i++)
+                       if (!should_dump(submit, submit->cmd[i].idx))
+                               nr++;
+
+               state->bos = kcalloc(nr,
                        sizeof(struct msm_gpu_state_bo), GFP_KERNEL);
 
+               for (i = 0; i < submit->nr_bos; i++) {
+                       if (should_dump(submit, i)) {
+                               msm_gpu_crashstate_get_bo(state, submit->bos[i].obj,
+                                       submit->bos[i].iova, submit->bos[i].flags);
+                       }
+               }
+
                for (i = 0; state->bos && i < submit->nr_cmds; i++) {
                        int idx = submit->cmd[i].idx;
 
-                       msm_gpu_crashstate_get_bo(state, submit->bos[idx].obj,
-                               submit->bos[idx].iova, submit->bos[idx].flags);
+                       if (!should_dump(submit, submit->cmd[i].idx)) {
+                               msm_gpu_crashstate_get_bo(state, submit->bos[idx].obj,
+                                       submit->bos[idx].iova, submit->bos[idx].flags);
+                       }
                }
        }
 
index af7ceb246c7c4fd82edd59fcd900362d44133629..732f65df5c4f44288eec6e04a4e23a81edfd5ac5 100644 (file)
@@ -43,7 +43,7 @@
 #include "msm_gpu.h"
 #include "msm_gem.h"
 
-static bool rd_full = false;
+bool rd_full = false;
 MODULE_PARM_DESC(rd_full, "If true, $debugfs/.../rd will snapshot all buffer contents");
 module_param_named(rd_full, rd_full, bool, 0600);
 
@@ -336,12 +336,6 @@ static void snapshot_buf(struct msm_rd_state *rd,
        msm_gem_put_vaddr(&obj->base);
 }
 
-static bool
-should_dump(struct msm_gem_submit *submit, int idx)
-{
-       return rd_full || (submit->bos[idx].flags & MSM_SUBMIT_BO_DUMP);
-}
-
 /* called under struct_mutex */
 void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit,
                const char *fmt, ...)