plugins/amdgpu: amdgpu_plugin_drm_restore_file() does not need to use libdrm

There is no need to initialize and de-initialize libdrm only to use the
duplicated fd for calls to drmPrimeFDToHandle(). From the kernel's
perspective it is exactly the same file so operation is identical to just
using the passed in file descriptor.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Reviewed-By: David Francis <David.Francis@amd.com>
This commit is contained in:
Tvrtko Ursulin 2026-04-10 19:55:13 +01:00 committed by Andrei Vagin
parent e8f056e963
commit e1a8cb68cb

View file

@ -489,25 +489,12 @@ int amdgpu_plugin_drm_restore_file(int fd, CriuRenderNode *rd)
{
int ret = 0;
bool retry_needed = false;
bool dev_initialized = false;
bool bo_restore_called = false;
uint32_t major, minor;
amdgpu_device_handle h_dev;
int device_fd;
int *dmabufs = xmalloc(sizeof(int) * rd->num_of_bos);
if (!dmabufs)
return -ENOMEM;
memset(dmabufs, 0xff, sizeof(int) * rd->num_of_bos);
ret = amdgpu_device_initialize(fd, &major, &minor, &h_dev);
if (ret) {
pr_info("Error in init amdgpu device\n");
goto exit;
}
dev_initialized = true;
device_fd = amdgpu_device_get_fd(h_dev);
for (int i = 0; i < rd->num_of_bos; i++) {
DrmBoEntry *boinfo = rd->bo_entries[i];
int dmabuf_fd = -1;
@ -535,7 +522,7 @@ int amdgpu_plugin_drm_restore_file(int fd, CriuRenderNode *rd)
retry_needed = true;
continue;
}
ret = drmPrimeFDToHandle(device_fd, dmabuf_fd, &handle);
ret = drmPrimeFDToHandle(fd, dmabuf_fd, &handle);
if (ret) {
pr_perror("Failed to get handle from dmabuf fd");
close(dmabuf_fd);
@ -556,7 +543,7 @@ int amdgpu_plugin_drm_restore_file(int fd, CriuRenderNode *rd)
}
handle = create_args.out.handle;
ret = drmPrimeHandleToFD(device_fd, handle, 0, &dmabuf_fd);
ret = drmPrimeHandleToFD(fd, handle, 0, &dmabuf_fd);
if (ret) {
pr_perror("Failed to get dmabuf fd from handle");
goto exit;
@ -632,8 +619,6 @@ int amdgpu_plugin_drm_restore_file(int fd, CriuRenderNode *rd)
}
exit:
if (dev_initialized)
amdgpu_device_deinitialize(h_dev);
if (ret < 0 && !bo_restore_called) {
for (int i = 0; i < rd->num_of_bos; i++) {
if (dmabufs[i] != KFD_INVALID_FD)