Re: [RFC 13/26] plugins/amdgpu: Consolidate vm_info collection
Tvrtko Ursulin <[email protected]> Mon, 2 Mar 2026 09:06:08 +0000
| Newsgroups | dev.linux.lists.criu |
|---|---|
| Message-ID | <[email protected]> |
On 27/02/2026 20:11, Francis, David wrote: > (Re-sending, hopefully without html content) > > This ioctl shouldn't ever need more than two calls (the first call should give the right size for the second) but this is cleaner. Right, I also thought it is cleaner to to repeat the args init block and all twice, glad you agree. > Nitpick: criu seems to use "while (1)" more than "for (;;)". Could this be changed here? Ack, I marked this as a todo for when it is clearer how things will proceed. > With that change, this is > > Reviewed-By: David Francis <[email protected]> Thank you! Tvrtko > ________________________________________ > From: Tvrtko Ursulin <[email protected]> > Sent: Friday, February 20, 2026 7:05 AM > To: [email protected] > Cc: Francis, David; Tvrtko Ursulin > Subject: [RFC 13/26] plugins/amdgpu: Consolidate vm_info collection > > Instead of open coding the same ioctl twice we can put it in a loop from > which we break out once we have allocated enough space for all objects. > > While at it we add error handling for the memory allocation. > > Signed-off-by: Tvrtko Ursulin <[email protected]> > --- > plugins/amdgpu/amdgpu_plugin_drm.c | 47 ++++++++++++++++-------------- > 1 file changed, 25 insertions(+), 22 deletions(-) > > diff --git a/plugins/amdgpu/amdgpu_plugin_drm.c b/plugins/amdgpu/amdgpu_plugin_drm.c > index 9df755450dc9..baa560537813 100644 > --- a/plugins/amdgpu/amdgpu_plugin_drm.c > +++ b/plugins/amdgpu/amdgpu_plugin_drm.c > @@ -302,8 +302,7 @@ int amdgpu_plugin_drm_dump_file(int fd, int id, struct stat *drm) > > for (int i = 0; i < num_bos; i++) { > int num_vm_entries = 8; > - struct drm_amdgpu_gem_vm_entry *vm_info_entries; > - struct drm_amdgpu_gem_op vm_info_args = { 0 }; > + struct drm_amdgpu_gem_vm_entry *vm_info_entries = NULL; > DrmBoEntry *boinfo = rd->bo_entries[i]; > struct drm_amdgpu_gem_list_handles_entry handle_entry = list_handles_entries[i]; > union drm_amdgpu_gem_mmap mmap_args = { 0 }; > @@ -333,32 +332,36 @@ int amdgpu_plugin_drm_dump_file(int fd, int id, struct stat *drm) > > boinfo->offset = mmap_args.out.addr_ptr; > > - vm_info_entries = xzalloc(sizeof(struct drm_amdgpu_gem_vm_entry) * num_vm_entries); > - vm_info_args.handle = handle_entry.gem_handle; > - vm_info_args.num_entries = num_vm_entries; > - vm_info_args.value = (uintptr_t)vm_info_entries; > - vm_info_args.op = AMDGPU_GEM_OP_GET_MAPPING_INFO; > - ret = drmIoctl(fd, DRM_IOCTL_AMDGPU_GEM_OP, &vm_info_args); > - if (ret) { > - pr_perror("Failed to call vm info ioctl"); > - goto exit; > - } > + for (;;) { > + struct drm_amdgpu_gem_op vm_info_args = { > + .handle = handle_entry.gem_handle, > + .num_entries = num_vm_entries, > + .op = AMDGPU_GEM_OP_GET_MAPPING_INFO, > + }; > + > + if (vm_info_entries) > + xfree(vm_info_entries); > + vm_info_entries = xzalloc(sizeof(*vm_info_entries) * > + num_vm_entries); > + if (!vm_info_entries) { > + ret = -ENOMEM; > + goto exit; > + } > > - if (vm_info_args.num_entries > num_vm_entries) { > - num_vm_entries = vm_info_args.num_entries; > - xfree(vm_info_entries); > - vm_info_entries = xzalloc(sizeof(struct drm_amdgpu_gem_vm_entry) * num_vm_entries); > - vm_info_args.handle = handle_entry.gem_handle; > - vm_info_args.num_entries = num_vm_entries; > vm_info_args.value = (uintptr_t)vm_info_entries; > - vm_info_args.op = AMDGPU_GEM_OP_GET_MAPPING_INFO; > - ret = drmIoctl(fd, DRM_IOCTL_AMDGPU_GEM_OP, &vm_info_args); > + ret = drmIoctl(fd, DRM_IOCTL_AMDGPU_GEM_OP, > + &vm_info_args); > if (ret) { > pr_perror("Failed to call vm info ioctl"); > goto exit; > } > - } else { > - num_vm_entries = vm_info_args.num_entries; > + > + if (vm_info_args.num_entries <= num_vm_entries) { > + num_vm_entries = vm_info_args.num_entries; > + break; > + } else { > + num_vm_entries = vm_info_args.num_entries; > + } > } > > boinfo->num_of_vms = num_vm_entries; > -- > 2.52.0 >