[PATCH v1 7/7] drm/amdgpu: include BO dump into coredump

Pierre-Eric Pelloux-Prayer pierre-eric.pelloux-prayer at amd.com
Wed May 21 09:49:09 UTC 2025


It can be useful when getting a page fault.

Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c  | 36 +++++++++++++++++++
 .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h  |  1 +
 2 files changed, 37 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
index 1dfc5473d2ab..9fa7189bf852 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
@@ -319,6 +319,11 @@ __amdgpu_devcoredump_read(char *buffer, size_t count, struct amdgpu_coredump_inf
 	else if (coredump->reset_vram_lost)
 		drm_printf(&p, "VRAM is lost due to GPU reset!\n");
 
+	if (coredump->vm_dump) {
+		drm_puts(&p, "\nVM Dump\n");
+		drm_puts(&p, coredump->vm_dump);
+	}
+
 	return count - iter.remain;
 }
 
@@ -360,6 +365,7 @@ static void amdgpu_devcoredump_free(void *data)
 	struct amdgpu_coredump_info *coredump = data;
 
 	kvfree(coredump->read.buffer);
+	kvfree(coredump->vm_dump);
 	kfree(data);
 }
 
@@ -383,12 +389,42 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
 
 	if (job && job->pasid) {
 		struct amdgpu_task_info *ti;
+		struct amdgpu_vm *vm;
+		unsigned long flags;
 
 		ti = amdgpu_vm_get_task_info_pasid(adev, job->pasid);
 		if (ti) {
 			coredump->reset_task_info = *ti;
 			amdgpu_vm_put_task_info(ti);
 		}
+
+		xa_lock_irqsave(&adev->vm_manager.pasids, flags);
+		vm = xa_load(&adev->vm_manager.pasids, job->pasid);
+		xa_unlock_irqrestore(&adev->vm_manager.pasids, flags);
+
+		if (vm && amdgpu_bo_reserve(vm->root.bo, true) == 0) {
+			struct drm_printer p;
+			struct drm_print_iterator iter;
+			ssize_t vm_dump_size;
+
+			iter.data = NULL;
+			iter.offset = 0;
+			iter.remain = AMDGPU_CORE_DUMP_SIZE_MAX;
+
+			p = drm_coredump_printer(&iter);
+			amdgpu_debugfs_vm_bo_info(vm, &p);
+
+			vm_dump_size = AMDGPU_CORE_DUMP_SIZE_MAX - iter.remain;
+			coredump->vm_dump = kvmalloc(vm_dump_size, GFP_USER);
+			if (coredump->vm_dump) {
+				iter.remain = vm_dump_size;
+				iter.data = coredump->vm_dump;
+				p = drm_coredump_printer(&iter);
+				amdgpu_debugfs_vm_bo_info(vm, &p);
+			}
+
+			amdgpu_bo_unreserve(vm->root.bo);
+		}
 	}
 
 	if (job) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h
index 38ccdd3d6213..bc8d71219bc8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h
@@ -39,6 +39,7 @@ struct amdgpu_coredump_info {
 	bool                            reset_vram_lost;
 	struct amdgpu_vm_fault_info	fault_info;
 	struct amdgpu_ring              *ring;
+	char *vm_dump;
 	/* Readable form of coredevdump, generate once to speed up
 	 * reading it (see drm_coredump_printer's documentation).
 	 */
-- 
2.43.0



More information about the amd-gfx mailing list