vfio/common: Move dirty tracking ranges update to helper

Separate the changes that update the ranges from the listener, to
make it reusable in preparation to expand its use to vIOMMU support.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
[ clg: - Rebased on upstream
       - Introduced vfio_dirty_tracking_update_range()
       - Fixed typ in commit log ]
Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
Joao Martins 2024-06-17 08:33:55 +02:00 committed by Cédric Le Goater
parent 889833e5ae
commit 344e70945d

View file

@ -839,20 +839,11 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section,
return false; return false;
} }
static void vfio_dirty_tracking_update(MemoryListener *listener, static void vfio_dirty_tracking_update_range(VFIODirtyRanges *range,
MemoryRegionSection *section) hwaddr iova, hwaddr end,
bool update_pci)
{ {
VFIODirtyRangesListener *dirty = container_of(listener, hwaddr *min, *max;
VFIODirtyRangesListener,
listener);
VFIODirtyRanges *range = &dirty->ranges;
hwaddr iova, end, *min, *max;
if (!vfio_listener_valid_section(section, "tracking_update") ||
!vfio_get_section_iova_range(dirty->bcontainer, section,
&iova, &end, NULL)) {
return;
}
/* /*
* The address space passed to the dirty tracker is reduced to three ranges: * The address space passed to the dirty tracker is reduced to three ranges:
@ -873,8 +864,7 @@ static void vfio_dirty_tracking_update(MemoryListener *listener,
* The alternative would be an IOVATree but that has a much bigger runtime * The alternative would be an IOVATree but that has a much bigger runtime
* overhead and unnecessary complexity. * overhead and unnecessary complexity.
*/ */
if (vfio_section_is_vfio_pci(section, dirty->bcontainer) && if (update_pci && iova >= UINT32_MAX) {
iova >= UINT32_MAX) {
min = &range->minpci64; min = &range->minpci64;
max = &range->maxpci64; max = &range->maxpci64;
} else { } else {
@ -889,7 +879,23 @@ static void vfio_dirty_tracking_update(MemoryListener *listener,
} }
trace_vfio_device_dirty_tracking_update(iova, end, *min, *max); trace_vfio_device_dirty_tracking_update(iova, end, *min, *max);
return; }
static void vfio_dirty_tracking_update(MemoryListener *listener,
MemoryRegionSection *section)
{
VFIODirtyRangesListener *dirty =
container_of(listener, VFIODirtyRangesListener, listener);
hwaddr iova, end;
if (!vfio_listener_valid_section(section, "tracking_update") ||
!vfio_get_section_iova_range(dirty->bcontainer, section,
&iova, &end, NULL)) {
return;
}
vfio_dirty_tracking_update_range(&dirty->ranges, iova, end,
vfio_section_is_vfio_pci(section, dirty->bcontainer));
} }
static const MemoryListener vfio_dirty_tracking_listener = { static const MemoryListener vfio_dirty_tracking_listener = {