Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: Crashdump prep for sparse mappings

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/

authored by

Rob Clark and committed by
Rob Clark
757cff73 b58e12a6

+10 -7
+10 -7
drivers/gpu/drm/msm/msm_gpu.c
··· 219 219 } 220 220 221 221 static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state, 222 - struct drm_gem_object *obj, u64 iova, bool full) 222 + struct drm_gem_object *obj, u64 iova, 223 + bool full, size_t offset, size_t size) 223 224 { 224 225 struct msm_gpu_state_bo *state_bo = &state->bos[state->nr_bos]; 225 226 struct msm_gem_object *msm_obj = to_msm_bo(obj); 226 227 227 228 /* Don't record write only objects */ 228 - state_bo->size = obj->size; 229 + state_bo->size = size; 229 230 state_bo->flags = msm_obj->flags; 230 231 state_bo->iova = iova; 231 232 ··· 237 236 if (full) { 238 237 void *ptr; 239 238 240 - state_bo->data = kvmalloc(obj->size, GFP_KERNEL); 239 + state_bo->data = kvmalloc(size, GFP_KERNEL); 241 240 if (!state_bo->data) 242 241 goto out; 243 242 ··· 250 249 goto out; 251 250 } 252 251 253 - memcpy(state_bo->data, ptr, obj->size); 252 + memcpy(state_bo->data, ptr + offset, size); 254 253 msm_gem_put_vaddr(obj); 255 254 } 256 255 out: ··· 282 281 state->fault_info = *fault_info; 283 282 284 283 if (submit) { 284 + extern bool rd_full; 285 285 int i; 286 286 287 287 if (state->fault_info.ttbr0) { ··· 298 296 sizeof(struct msm_gpu_state_bo), GFP_KERNEL); 299 297 300 298 for (i = 0; state->bos && i < submit->nr_bos; i++) { 301 - msm_gpu_crashstate_get_bo(state, submit->bos[i].obj, 302 - submit->bos[i].iova, 303 - should_dump(submit, i)); 299 + struct drm_gem_object *obj = submit->bos[i].obj; 300 + bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP); 301 + msm_gpu_crashstate_get_bo(state, obj, submit->bos[i].iova, 302 + dump, 0, obj->size); 304 303 } 305 304 } 306 305