vfio/common: Consolidate skip/invalid section into helper

The checks are replicated against region_add and region_del
and will be soon added in another memory listener dedicated
for dirty tracking.

Move these into a new helper for avoid duplication.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Reviewed-by: Avihai Horon <avihaih@nvidia.com>
Link: https://lore.kernel.org/r/20230307125450.62409-8-joao.m.martins@oracle.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
Joao Martins 2023-03-07 12:54:42 +00:00 committed by Alex Williamson
parent 1cd7fa7adc
commit b92f237635

View File

@ -933,23 +933,15 @@ static bool vfio_known_safe_misalignment(MemoryRegionSection *section)
return true; return true;
} }
static void vfio_listener_region_add(MemoryListener *listener, static bool vfio_listener_valid_section(MemoryRegionSection *section,
MemoryRegionSection *section) const char *name)
{ {
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
hwaddr iova, end;
Int128 llend, llsize;
void *vaddr;
int ret;
VFIOHostDMAWindow *hostwin;
Error *err = NULL;
if (vfio_listener_skipped_section(section)) { if (vfio_listener_skipped_section(section)) {
trace_vfio_listener_region_skip("region_add", trace_vfio_listener_region_skip(name,
section->offset_within_address_space, section->offset_within_address_space,
section->offset_within_address_space + section->offset_within_address_space +
int128_get64(int128_sub(section->size, int128_one()))); int128_get64(int128_sub(section->size, int128_one())));
return; return false;
} }
if (unlikely((section->offset_within_address_space & if (unlikely((section->offset_within_address_space &
@ -964,6 +956,24 @@ static void vfio_listener_region_add(MemoryListener *listener,
section->offset_within_region, section->offset_within_region,
qemu_real_host_page_size()); qemu_real_host_page_size());
} }
return false;
}
return true;
}
static void vfio_listener_region_add(MemoryListener *listener,
MemoryRegionSection *section)
{
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
hwaddr iova, end;
Int128 llend, llsize;
void *vaddr;
int ret;
VFIOHostDMAWindow *hostwin;
Error *err = NULL;
if (!vfio_listener_valid_section(section, "region_add")) {
return; return;
} }
@ -1182,26 +1192,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
int ret; int ret;
bool try_unmap = true; bool try_unmap = true;
if (vfio_listener_skipped_section(section)) { if (!vfio_listener_valid_section(section, "region_del")) {
trace_vfio_listener_region_skip("region_del",
section->offset_within_address_space,
section->offset_within_address_space +
int128_get64(int128_sub(section->size, int128_one())));
return;
}
if (unlikely((section->offset_within_address_space &
~qemu_real_host_page_mask()) !=
(section->offset_within_region & ~qemu_real_host_page_mask()))) {
if (!vfio_known_safe_misalignment(section)) {
error_report("%s received unaligned region %s iova=0x%"PRIx64
" offset_within_region=0x%"PRIx64
" qemu_real_host_page_size=0x%"PRIxPTR,
__func__, memory_region_name(section->mr),
section->offset_within_address_space,
section->offset_within_region,
qemu_real_host_page_size());
}
return; return;
} }