mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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:
parent
889833e5ae
commit
344e70945d
1 changed files with 22 additions and 16 deletions
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in a new issue