On Tue, 7 Mar 2023 02:02:51 +0000 Joao Martins <joao.m.mart...@oracle.com> wrote:
> In preparation to be used in device dirty tracking, move the code that > calculates a iova/end range from the container/section. This avoids > duplication on the common checks across listener callbacks. > > Signed-off-by: Joao Martins <joao.m.mart...@oracle.com> > --- > hw/vfio/common.c | 37 ++++++++++++++++++++++++++++++------- > 1 file changed, 30 insertions(+), 7 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 54b4a4fc7daf..3a6491dbc523 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -961,6 +961,35 @@ static bool > vfio_listener_valid_section(MemoryRegionSection *section) > return true; > } > > +/* > + * Called for the dirty tracking memory listener to calculate the iova/end > + * for a given memory region section. > + */ > +static bool vfio_get_section_iova_range(VFIOContainer *container, > + MemoryRegionSection *section, > + hwaddr *out_iova, hwaddr *out_end, > + Int128 *out_llend) > +{ > + Int128 llend; > + hwaddr iova; > + > + iova = REAL_HOST_PAGE_ALIGN(section->offset_within_address_space); > + llend = int128_make64(section->offset_within_address_space); > + llend = int128_add(llend, section->size); > + llend = int128_and(llend, int128_exts64(qemu_real_host_page_mask())); > + > + if (int128_ge(int128_make64(iova), llend)) { > + return false; > + } > + > + *out_iova = iova; > + *out_end = int128_get64(int128_sub(llend, int128_one())); > + if (out_llend) { > + *out_llend = llend; > + } > + return true; > +} > + > static void vfio_listener_region_add(MemoryListener *listener, > MemoryRegionSection *section) > { > @@ -976,12 +1005,7 @@ static void vfio_listener_region_add(MemoryListener > *listener, > return; > } > > - iova = REAL_HOST_PAGE_ALIGN(section->offset_within_address_space); > - llend = int128_make64(section->offset_within_address_space); > - llend = int128_add(llend, section->size); > - llend = int128_and(llend, int128_exts64(qemu_real_host_page_mask())); > - > - if (int128_ge(int128_make64(iova), llend)) { > + if (!vfio_get_section_iova_range(container, section, &iova, &end, > &llend)) { > if (memory_region_is_ram_device(section->mr)) { > trace_vfio_listener_region_add_no_dma_map( > memory_region_name(section->mr), > @@ -991,7 +1015,6 @@ static void vfio_listener_region_add(MemoryListener > *listener, > } > return; > } > - end = int128_get64(int128_sub(llend, int128_one())); > > if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU) { > hwaddr pgsize = 0; Shouldn't this convert vfio_listener_region_del() too? Thanks, Alex