mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-17 16:47:50 +00:00
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 <tvrtko.ursulin@igalia.com> Reviewed-By: David Francis <David.Francis@amd.com>
This commit is contained in:
parent
6e76c26c8c
commit
38263b06fe
2 changed files with 18 additions and 15 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue