]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
vfio/type1: Fix error unwind in migration dirty bitmap allocation
authorLi RongQing <lirongqing@baidu.com>
Wed, 21 May 2025 03:46:47 +0000 (11:46 +0800)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 22 May 2025 16:41:24 +0000 (10:41 -0600)
When setting up dirty page tracking at the vfio IOMMU backend for
device migration, if an error is encountered allocating a tracking
bitmap, the unwind loop fails to free previously allocated tracking
bitmaps.  This occurs because the wrong loop index is used to
generate the tracking object.  This results in unintended memory
usage for the life of the current DMA mappings where bitmaps were
successfully allocated.

Use the correct loop index to derive the tracking object for
freeing during unwind.

Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Link: https://lore.kernel.org/r/20250521034647.2877-1-lirongqing@baidu.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/vfio_iommu_type1.c

index afc1449335c3088c977162bb0a5f66e240139af2..1136d7ac6b597e960950d4ea020a0e529157feb7 100644 (file)
@@ -292,7 +292,7 @@ static int vfio_dma_bitmap_alloc_all(struct vfio_iommu *iommu, size_t pgsize)
                        struct rb_node *p;
 
                        for (p = rb_prev(n); p; p = rb_prev(p)) {
-                               struct vfio_dma *dma = rb_entry(n,
+                               struct vfio_dma *dma = rb_entry(p,
                                                        struct vfio_dma, node);
 
                                vfio_dma_bitmap_free(dma);