From 38263b06febdea8965db0aca8fb86536bfa92983 Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Fri, 10 Apr 2026 19:54:57 +0100 Subject: [PATCH] plugins/amdgpu: Propagate failure to save buffer object content Currently the failure to save content of a buffer object is only logged, while the checkpointing will continue unaware due the error code being "eaten" inside sdma_copy_bo() cleanup path, together with the caller not checking the return value to begin with. Fix it by preserving and returning the original error code inside sdma_copy_bo(), and abort the checkpointing process in case of a failure. Signed-off-by: Tvrtko Ursulin Reviewed-By: David Francis --- plugins/amdgpu/amdgpu_plugin.c | 31 +++++++++++++++--------------- plugins/amdgpu/amdgpu_plugin_drm.c | 2 ++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/plugins/amdgpu/amdgpu_plugin.c b/plugins/amdgpu/amdgpu_plugin.c index a55e6cef9..c875df060 100644 --- a/plugins/amdgpu/amdgpu_plugin.c +++ b/plugins/amdgpu/amdgpu_plugin.c @@ -563,7 +563,7 @@ int sdma_copy_bo(int shared_fd, uint64_t size, FILE *storage_fp, uint32_t expired; amdgpu_context_handle h_ctx; uint32_t *ib = NULL; - int j, err, packets_per_buffer; + int j, err, err2, packets_per_buffer; buffer_bo_size = min(size, buffer_size); packets_per_buffer = ((buffer_bo_size - 1) / max_copy_size) + 1; @@ -767,29 +767,30 @@ err_ctx: err_bo_list: free_and_unmap(packets_per_buffer * 28, h_bo_ib, h_va_ib, gpu_addr_ib, ib); err_ib_gpu_alloc: - err = amdgpu_bo_va_op(h_bo_dst, 0, size, gpu_addr_dst, 0, AMDGPU_VA_OP_UNMAP); - if (err) + err2 = amdgpu_bo_va_op(h_bo_dst, 0, size, gpu_addr_dst, 0, AMDGPU_VA_OP_UNMAP); + if (err2) pr_perror("failed to GPU unmap the dest BO %lx, size = %lx", gpu_addr_dst, size); err_dst_bo_map: - err = amdgpu_va_range_free(h_va_dst); - if (err) + err2 = amdgpu_va_range_free(h_va_dst); + if (err2) pr_perror("dest range free failed"); err_dst_va: - if (!do_not_free) - err = amdgpu_bo_free(h_bo_dst); - if (err) - pr_perror("dest bo free failed"); + if (!do_not_free) { + err2 = amdgpu_bo_free(h_bo_dst); + if (err2) + pr_perror("dest bo free failed"); + } err_dst_bo_prep: - err = amdgpu_bo_va_op(h_bo_src, 0, size, gpu_addr_src, 0, AMDGPU_VA_OP_UNMAP); - if (err) + err2 = amdgpu_bo_va_op(h_bo_src, 0, size, gpu_addr_src, 0, AMDGPU_VA_OP_UNMAP); + if (err2) pr_perror("failed to GPU unmap the src BO %lx, size = %lx", gpu_addr_src, size); err_src_bo_map: - err = amdgpu_va_range_free(h_va_src); - if (err) + err2 = amdgpu_va_range_free(h_va_src); + if (err2) pr_perror("src range free failed"); err_src_va: - err = amdgpu_bo_free(h_bo_src); - if (err) + err2 = amdgpu_bo_free(h_bo_src); + if (err2) pr_perror("src bo free failed"); plugin_log_msg("Leaving sdma_copy_bo, err = %d\n", err); return err; diff --git a/plugins/amdgpu/amdgpu_plugin_drm.c b/plugins/amdgpu/amdgpu_plugin_drm.c index 487c2a1e2..a5ab3adff 100644 --- a/plugins/amdgpu/amdgpu_plugin_drm.c +++ b/plugins/amdgpu/amdgpu_plugin_drm.c @@ -438,6 +438,8 @@ int amdgpu_plugin_drm_dump_file(int fd, int id, struct stat *drm) ret = sdma_copy_bo(dmabuf_fd, handle_entry.size, bo_contents_fp, buffer, handle_entry.size, h_dev, 0x1000, SDMA_OP_VRAM_READ, false); + if (ret) + goto exit; xfree(buffer);