vfio/mlx5: Fix an unwind issue in mlx5vf_add_migration_pages()
Fix an unwind issue in mlx5vf_add_migration_pages().
If a set of pages is allocated but fails to be added to the SG table,
they need to be freed to prevent a memory leak.
Any pages successfully added to the SG table will be freed as part of
mlx5vf_free_data_buffer().
Fixes: 6fadb02126 ("vfio/mlx5: Implement vfio_pci driver for mlx5 devices")
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20241114095318.16556-2-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
pull/1091/head
parent
40bcdb12c6
commit
22e87bf3f7
|
|
@ -423,6 +423,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
|||
unsigned long filled;
|
||||
unsigned int to_fill;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
to_fill = min_t(unsigned int, npages, PAGE_SIZE / sizeof(*page_list));
|
||||
page_list = kvzalloc(to_fill * sizeof(*page_list), GFP_KERNEL_ACCOUNT);
|
||||
|
|
@ -443,7 +444,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
|||
GFP_KERNEL_ACCOUNT);
|
||||
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_append;
|
||||
buf->allocated_length += filled * PAGE_SIZE;
|
||||
/* clean input for another bulk allocation */
|
||||
memset(page_list, 0, filled * sizeof(*page_list));
|
||||
|
|
@ -454,6 +455,9 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
|||
kvfree(page_list);
|
||||
return 0;
|
||||
|
||||
err_append:
|
||||
for (i = filled - 1; i >= 0; i--)
|
||||
__free_page(page_list[i]);
|
||||
err:
|
||||
kvfree(page_list);
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in New Issue