]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/msm: Crashdump prep for sparse mappings
authorRob Clark <robdclark@chromium.org>
Sun, 29 Jun 2025 20:13:08 +0000 (13:13 -0700)
committerRob Clark <robin.clark@oss.qualcomm.com>
Sat, 5 Jul 2025 00:48:36 +0000 (17:48 -0700)
In this case, userspace could request dumping partial GEM obj mappings.
Also drop use of should_dump() helper, which really only makes sense in
the old submit->bos[] table world.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Tested-by: Antonino Maniscalco <antomani103@gmail.com>
Reviewed-by: Antonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661496/

drivers/gpu/drm/msm/msm_gpu.c

index 0846f6c5169f7862b583151b3724a9d495d2547d..0a9d5ecbef7b5f912d2b92fbe47b7a46953c2fff 100644 (file)
@@ -219,13 +219,14 @@ static void msm_gpu_devcoredump_free(void *data)
 }
 
 static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
-               struct drm_gem_object *obj, u64 iova, bool full)
+                                     struct drm_gem_object *obj, u64 iova,
+                                     bool full, size_t offset, size_t size)
 {
        struct msm_gpu_state_bo *state_bo = &state->bos[state->nr_bos];
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
        /* Don't record write only objects */
-       state_bo->size = obj->size;
+       state_bo->size = size;
        state_bo->flags = msm_obj->flags;
        state_bo->iova = iova;
 
@@ -236,7 +237,7 @@ static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
        if (full) {
                void *ptr;
 
-               state_bo->data = kvmalloc(obj->size, GFP_KERNEL);
+               state_bo->data = kvmalloc(size, GFP_KERNEL);
                if (!state_bo->data)
                        goto out;
 
@@ -249,7 +250,7 @@ static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
                        goto out;
                }
 
-               memcpy(state_bo->data, ptr, obj->size);
+               memcpy(state_bo->data, ptr + offset, size);
                msm_gem_put_vaddr(obj);
        }
 out:
@@ -281,6 +282,7 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
                state->fault_info = *fault_info;
 
        if (submit) {
+               extern bool rd_full;
                int i;
 
                if (state->fault_info.ttbr0) {
@@ -296,9 +298,10 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
                        sizeof(struct msm_gpu_state_bo), GFP_KERNEL);
 
                for (i = 0; state->bos && i < submit->nr_bos; i++) {
-                       msm_gpu_crashstate_get_bo(state, submit->bos[i].obj,
-                                                 submit->bos[i].iova,
-                                                 should_dump(submit, i));
+                       struct drm_gem_object *obj = submit->bos[i].obj;
+                       bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP);
+                       msm_gpu_crashstate_get_bo(state, obj, submit->bos[i].iova,
+                                                 dump, 0, obj->size);
                }
        }