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

drm/msm: rd dumping support for sparse

As with devcoredump, we need to iterate the VMAs to figure out what to
dump.

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/661510/

authored by

Rob Clark and committed by
Rob Clark
06ebb4f0 af9aa6f3

+33 -15
+33 -15
drivers/gpu/drm/msm/msm_rd.c
··· 372 372 373 373 rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4)); 374 374 375 - for (i = 0; i < submit->nr_bos; i++) { 376 - struct drm_gem_object *obj = submit->bos[i].obj; 377 - bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP); 375 + if (msm_context_is_vmbind(submit->queue->ctx)) { 376 + struct drm_gpuva *vma; 378 377 379 - snapshot_buf(rd, obj, submit->bos[i].iova, dump, 0, obj->size); 380 - } 378 + drm_gpuvm_resv_assert_held(submit->vm); 381 379 382 - for (i = 0; i < submit->nr_cmds; i++) { 383 - uint32_t szd = submit->cmd[i].size; /* in dwords */ 384 - int idx = submit->cmd[i].idx; 385 - bool dump = rd_full || (submit->bos[idx].flags & MSM_SUBMIT_BO_DUMP); 380 + drm_gpuvm_for_each_va (vma, submit->vm) { 381 + bool dump = rd_full || (vma->flags & MSM_VMA_DUMP); 386 382 387 - /* snapshot cmdstream bo's (if we haven't already): */ 388 - if (!dump) { 389 - struct drm_gem_object *obj = submit->bos[idx].obj; 390 - size_t offset = submit->cmd[i].iova - submit->bos[idx].iova; 383 + /* Skip MAP_NULL/PRR VMAs: */ 384 + if (!vma->gem.obj) 385 + continue; 391 386 392 - snapshot_buf(rd, obj, submit->cmd[i].iova, true, 393 - offset, szd * 4); 387 + snapshot_buf(rd, vma->gem.obj, vma->va.addr, dump, 388 + vma->gem.offset, vma->va.range); 389 + } 390 + 391 + } else { 392 + for (i = 0; i < submit->nr_bos; i++) { 393 + struct drm_gem_object *obj = submit->bos[i].obj; 394 + bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP); 395 + 396 + snapshot_buf(rd, obj, submit->bos[i].iova, dump, 0, obj->size); 397 + } 398 + 399 + for (i = 0; i < submit->nr_cmds; i++) { 400 + uint32_t szd = submit->cmd[i].size; /* in dwords */ 401 + int idx = submit->cmd[i].idx; 402 + bool dump = rd_full || (submit->bos[idx].flags & MSM_SUBMIT_BO_DUMP); 403 + 404 + /* snapshot cmdstream bo's (if we haven't already): */ 405 + if (!dump) { 406 + struct drm_gem_object *obj = submit->bos[idx].obj; 407 + size_t offset = submit->cmd[i].iova - submit->bos[idx].iova; 408 + 409 + snapshot_buf(rd, obj, submit->cmd[i].iova, true, 410 + offset, szd * 4); 411 + } 394 412 } 395 413 } 396 414