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

drm/msm: Crashdump support for sparse

In this case, we need to iterate the VMAs looking for ones with
MSM_VMA_DUMP flag.

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

authored by

Rob Clark and committed by
Rob Clark
af9aa6f3 4570dbb8

+72 -24
+72 -24
drivers/gpu/drm/msm/msm_gpu.c
··· 241 241 if (!state_bo->data) 242 242 goto out; 243 243 244 - msm_gem_lock(obj); 245 244 ptr = msm_gem_get_vaddr_active(obj); 246 - msm_gem_unlock(obj); 247 245 if (IS_ERR(ptr)) { 248 246 kvfree(state_bo->data); 249 247 state_bo->data = NULL; ··· 249 251 } 250 252 251 253 memcpy(state_bo->data, ptr + offset, size); 252 - msm_gem_put_vaddr(obj); 254 + msm_gem_put_vaddr_locked(obj); 253 255 } 254 256 out: 255 257 state->nr_bos++; 258 + } 259 + 260 + static void crashstate_get_bos(struct msm_gpu_state *state, struct msm_gem_submit *submit) 261 + { 262 + extern bool rd_full; 263 + 264 + if (!submit) 265 + return; 266 + 267 + if (msm_context_is_vmbind(submit->queue->ctx)) { 268 + struct drm_exec exec; 269 + struct drm_gpuva *vma; 270 + unsigned cnt = 0; 271 + 272 + drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, 0); 273 + drm_exec_until_all_locked(&exec) { 274 + cnt = 0; 275 + 276 + drm_exec_lock_obj(&exec, drm_gpuvm_resv_obj(submit->vm)); 277 + drm_exec_retry_on_contention(&exec); 278 + 279 + drm_gpuvm_for_each_va (vma, submit->vm) { 280 + if (!vma->gem.obj) 281 + continue; 282 + 283 + cnt++; 284 + drm_exec_lock_obj(&exec, vma->gem.obj); 285 + drm_exec_retry_on_contention(&exec); 286 + } 287 + 288 + } 289 + 290 + drm_gpuvm_for_each_va (vma, submit->vm) 291 + cnt++; 292 + 293 + state->bos = kcalloc(cnt, sizeof(struct msm_gpu_state_bo), GFP_KERNEL); 294 + 295 + drm_gpuvm_for_each_va (vma, submit->vm) { 296 + bool dump = rd_full || (vma->flags & MSM_VMA_DUMP); 297 + 298 + /* Skip MAP_NULL/PRR VMAs: */ 299 + if (!vma->gem.obj) 300 + continue; 301 + 302 + msm_gpu_crashstate_get_bo(state, vma->gem.obj, vma->va.addr, 303 + dump, vma->gem.offset, vma->va.range); 304 + } 305 + 306 + drm_exec_fini(&exec); 307 + } else { 308 + state->bos = kcalloc(submit->nr_bos, 309 + sizeof(struct msm_gpu_state_bo), GFP_KERNEL); 310 + 311 + for (int i = 0; state->bos && i < submit->nr_bos; i++) { 312 + struct drm_gem_object *obj = submit->bos[i].obj;; 313 + bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP); 314 + 315 + msm_gem_lock(obj); 316 + msm_gpu_crashstate_get_bo(state, obj, submit->bos[i].iova, 317 + dump, 0, obj->size); 318 + msm_gem_unlock(obj); 319 + } 320 + } 256 321 } 257 322 258 323 static void msm_gpu_crashstate_capture(struct msm_gpu *gpu, ··· 342 281 if (fault_info) 343 282 state->fault_info = *fault_info; 344 283 345 - if (submit) { 346 - extern bool rd_full; 347 - int i; 284 + if (submit && state->fault_info.ttbr0) { 285 + struct msm_gpu_fault_info *info = &state->fault_info; 286 + struct msm_mmu *mmu = to_msm_vm(submit->vm)->mmu; 348 287 349 - if (state->fault_info.ttbr0) { 350 - struct msm_gpu_fault_info *info = &state->fault_info; 351 - struct msm_mmu *mmu = to_msm_vm(submit->vm)->mmu; 352 - 353 - msm_iommu_pagetable_params(mmu, &info->pgtbl_ttbr0, 354 - &info->asid); 355 - msm_iommu_pagetable_walk(mmu, info->iova, info->ptes); 356 - } 357 - 358 - state->bos = kcalloc(submit->nr_bos, 359 - sizeof(struct msm_gpu_state_bo), GFP_KERNEL); 360 - 361 - for (i = 0; state->bos && i < submit->nr_bos; i++) { 362 - struct drm_gem_object *obj = submit->bos[i].obj; 363 - bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP); 364 - msm_gpu_crashstate_get_bo(state, obj, submit->bos[i].iova, 365 - dump, 0, obj->size); 366 - } 288 + msm_iommu_pagetable_params(mmu, &info->pgtbl_ttbr0, 289 + &info->asid); 290 + msm_iommu_pagetable_walk(mmu, info->iova, info->ptes); 367 291 } 292 + 293 + crashstate_get_bos(state, submit); 368 294 369 295 /* Set the active crash state to be dumped on failure */ 370 296 gpu->crashstate = state;