plugin/amdgpu: check posix_memalign() return value

posix_memalign() returns an error code on failure and does not
guarantee setting the pointer to NULL. Check the return value
instead of the pointer. Since posix_memalign() does not set
errno, assign it explicitly so pr_perror() prints the correct
message. Negate the return code instead of hardcoding -ENOMEM
to preserve the actual error (e.g. EINVAL for bad alignment).
In amdgpu_plugin_drm_dump_file(), replace break with cleanup
and goto exit so per-BO resources are freed on failure.

Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
This commit is contained in:
Radostin Stoyanov 2026-03-14 14:01:10 +00:00
parent 611af0188d
commit af32d407a2
2 changed files with 22 additions and 13 deletions

View file

@ -841,10 +841,11 @@ void *dump_bo_contents(void *_thread_data)
buffer_size = kfd_max_buffer_size > 0 ? min(kfd_max_buffer_size, max_bo_size) : max_bo_size;
posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (!buffer) {
ret = posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (ret) {
errno = ret;
pr_perror("Failed to alloc aligned memory. Consider setting KFD_MAX_BUFFER_SIZE.");
ret = -ENOMEM;
ret = -ret;
goto exit;
}
@ -949,10 +950,11 @@ void *restore_bo_contents(void *_thread_data)
buffer_size = kfd_max_buffer_size > 0 ? min(kfd_max_buffer_size, max_bo_size) : max_bo_size;
posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (!buffer) {
ret = posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (ret) {
errno = ret;
pr_perror("Failed to alloc aligned memory. Consider setting KFD_MAX_BUFFER_SIZE.");
ret = -ENOMEM;
ret = -ret;
goto exit;
}
@ -2287,10 +2289,11 @@ void *parallel_restore_bo_contents(void *_thread_data)
}
offset = ftell(bo_contents_fp);
posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (!buffer) {
ret = posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (ret) {
errno = ret;
pr_perror("Failed to alloc aligned memory. Consider setting KFD_MAX_BUFFER_SIZE.");
ret = -ENOMEM;
ret = -ret;
goto err_sdma;
}

View file

@ -193,10 +193,11 @@ static int restore_bo_contents_drm(int drm_render_minor, CriuRenderNode *rd, int
buffer_size = max_bo_size;
posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (!buffer) {
ret = posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), buffer_size);
if (ret) {
errno = ret;
pr_perror("Failed to alloc aligned memory. Consider setting KFD_MAX_BUFFER_SIZE.");
ret = -ENOMEM;
ret = -ret;
goto exit;
}
@ -394,9 +395,14 @@ int amdgpu_plugin_drm_dump_file(int fd, int id, struct stat *drm)
ret = posix_memalign(&buffer, sysconf(_SC_PAGE_SIZE), handle_entry.size);
if (ret) {
errno = ret;
pr_perror("Failed to allocate buffer");
ret = -ret;
fclose(bo_contents_fp);
break;
close(dmabuf_fd);
amdgpu_device_deinitialize(h_dev);
xfree(vm_info_entries);
goto exit;
}
ret = sdma_copy_bo(dmabuf_fd, handle_entry.size, bo_contents_fp, buffer, handle_entry.size, h_dev, 0x1000,