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:
parent
1cd7fa7adc
commit
b92f237635
@ -933,23 +933,15 @@ static bool vfio_known_safe_misalignment(MemoryRegionSection *section)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void vfio_listener_region_add(MemoryListener *listener,
|
||||
MemoryRegionSection *section)
|
||||
static bool vfio_listener_valid_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)) {
|
||||
trace_vfio_listener_region_skip("region_add",
|
||||
trace_vfio_listener_region_skip(name,
|
||||
section->offset_within_address_space,
|
||||
section->offset_within_address_space +
|
||||
int128_get64(int128_sub(section->size, int128_one())));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (unlikely((section->offset_within_address_space &
|
||||
@ -964,6 +956,24 @@ static void vfio_listener_region_add(MemoryListener *listener,
|
||||
section->offset_within_region,
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1182,26 +1192,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
|
||||
int ret;
|
||||
bool try_unmap = true;
|
||||
|
||||
if (vfio_listener_skipped_section(section)) {
|
||||
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());
|
||||
}
|
||||
if (!vfio_listener_valid_section(section, "region_del")) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user