On Thu, 26 Jan 2023 20:49:41 +0200 Avihai Horon <avih...@nvidia.com> wrote:
> From: Joao Martins <joao.m.mart...@oracle.com> > > Add device dirty page bitmap sync functionality. This uses the device > DMA logging uAPI to sync dirty page bitmap from the device. > > Device dirty page bitmap sync is used only if all devices within a > container support device dirty page tracking. > > Signed-off-by: Joao Martins <joao.m.mart...@oracle.com> > Signed-off-by: Avihai Horon <avih...@nvidia.com> > --- > hw/vfio/common.c | 93 ++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 82 insertions(+), 11 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 3caa73d6f7..0003f2421d 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -355,6 +355,9 @@ static void vfio_bitmap_dealloc(VFIOBitmap *vbmap) > g_free(vbmap); > } > > +static int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova, > + uint64_t size, ram_addr_t ram_addr); > + > bool vfio_mig_active(void) > { > VFIOGroup *group; > @@ -582,10 +585,19 @@ static int vfio_dma_unmap(VFIOContainer *container, > .iova = iova, > .size = size, > }; > + int ret; > > - if (iotlb && container->dirty_pages_supported && > - vfio_devices_all_running_and_mig_active(container)) { > - return vfio_dma_unmap_bitmap(container, iova, size, iotlb); > + if (iotlb && vfio_devices_all_running_and_mig_active(container)) { > + if (!vfio_devices_all_device_dirty_tracking(container) && > + container->dirty_pages_supported) { > + return vfio_dma_unmap_bitmap(container, iova, size, iotlb); > + } > + > + ret = vfio_get_dirty_bitmap(container, iova, size, > + iotlb->translated_addr); > + if (ret) { > + return ret; > + } Isn't the ordering backwards here? Only after the range is unmapped can we know that this container can no longer dirty pages within the range. Thanks, Alex