Message ID | 20230304014343.33646-7-joao.m.martins@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio/migration: Device dirty page tracking | expand |
On 3/4/23 02:43, Joao Martins wrote: > 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> > --- > hw/vfio/common.c | 52 +++++++++++++++++++----------------------------- > 1 file changed, 21 insertions(+), 31 deletions(-) LGTM, it is a valid change even without adding migration support. Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 80f3a1c44a01..ed908e303dbb 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -935,23 +935,14 @@ 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) > { > - 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_add_skip( > 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 & > @@ -966,6 +957,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)) { > return; > } > > @@ -1184,26 +1193,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_del_skip( > - 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)) { > return; > } >
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 80f3a1c44a01..ed908e303dbb 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -935,23 +935,14 @@ 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) { - 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_add_skip( 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 & @@ -966,6 +957,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)) { return; } @@ -1184,26 +1193,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_del_skip( - 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)) { return; }
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> --- hw/vfio/common.c | 52 +++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 31 deletions(-)