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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user