Message ID | 20240617063409.34393-4-clg@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: QOMify VFIOContainer | expand |
Hi Cédric, On 6/17/24 08:33, Cédric Le Goater wrote: > From: Joao Martins <joao.m.martins@oracle.com> > > Separate the changes that updates the ranges from the listener, to s/updates/update > make it reusable in preparation to expand its use to vIOMMU support. > > [ clg: - Rebased on upstream > - Introduced vfio_dirty_tracking_update_range() ] > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Signed-off-by: Cédric Le Goater <clg@redhat.com> > Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > hw/vfio/common.c | 38 ++++++++++++++++++++++---------------- > 1 file changed, 22 insertions(+), 16 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index d48cd9b9361a92d184e423ffc60aabaff40fb487..fe215918bdf66ddbe3c5db803e10ce1aa9756b90 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -839,20 +839,11 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section, > return false; > } > > -static void vfio_dirty_tracking_update(MemoryListener *listener, > - MemoryRegionSection *section) > +static void vfio_dirty_tracking_update_range(VFIODirtyRanges *range, > + hwaddr iova, hwaddr end, > + bool update_pci) > { > - VFIODirtyRangesListener *dirty = container_of(listener, > - VFIODirtyRangesListener, > - listener); > - VFIODirtyRanges *range = &dirty->ranges; > - hwaddr iova, end, *min, *max; > - > - if (!vfio_listener_valid_section(section, "tracking_update") || > - !vfio_get_section_iova_range(dirty->bcontainer, section, > - &iova, &end, NULL)) { > - return; > - } > + hwaddr *min, *max; > > /* > * The address space passed to the dirty tracker is reduced to three ranges: > @@ -873,8 +864,7 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, > * The alternative would be an IOVATree but that has a much bigger runtime > * overhead and unnecessary complexity. > */ > - if (vfio_section_is_vfio_pci(section, dirty->bcontainer) && > - iova >= UINT32_MAX) { > + if (update_pci && iova >= UINT32_MAX) { > min = &range->minpci64; > max = &range->maxpci64; > } else { > @@ -889,7 +879,23 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, > } > > trace_vfio_device_dirty_tracking_update(iova, end, *min, *max); don't you want to update the name of the trace point? > - return; > +} > + > +static void vfio_dirty_tracking_update(MemoryListener *listener, > + MemoryRegionSection *section) > +{ > + VFIODirtyRangesListener *dirty = > + container_of(listener, VFIODirtyRangesListener, listener); > + hwaddr iova, end; > + > + if (!vfio_listener_valid_section(section, "tracking_update") || > + !vfio_get_section_iova_range(dirty->bcontainer, section, > + &iova, &end, NULL)) { > + return; > + } > + > + vfio_dirty_tracking_update_range(&dirty->ranges, iova, end, > + vfio_section_is_vfio_pci(section, dirty->bcontainer)); > } > > static const MemoryListener vfio_dirty_tracking_listener = { Besides Reviewed-by: Eric Auger <eric.auger@redhat.com> Eric
On 6/17/24 1:39 PM, Eric Auger wrote: > Hi Cédric, > On 6/17/24 08:33, Cédric Le Goater wrote: >> From: Joao Martins <joao.m.martins@oracle.com> >> >> Separate the changes that updates the ranges from the listener, to > s/updates/update fixed. >> make it reusable in preparation to expand its use to vIOMMU support. >> >> [ clg: - Rebased on upstream >> - Introduced vfio_dirty_tracking_update_range() ] >> >> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> >> Signed-off-by: Cédric Le Goater <clg@redhat.com> >> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >> --- >> hw/vfio/common.c | 38 ++++++++++++++++++++++---------------- >> 1 file changed, 22 insertions(+), 16 deletions(-) >> >> diff --git a/hw/vfio/common.c b/hw/vfio/common.c >> index d48cd9b9361a92d184e423ffc60aabaff40fb487..fe215918bdf66ddbe3c5db803e10ce1aa9756b90 100644 >> --- a/hw/vfio/common.c >> +++ b/hw/vfio/common.c >> @@ -839,20 +839,11 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section, >> return false; >> } >> >> -static void vfio_dirty_tracking_update(MemoryListener *listener, >> - MemoryRegionSection *section) >> +static void vfio_dirty_tracking_update_range(VFIODirtyRanges *range, >> + hwaddr iova, hwaddr end, >> + bool update_pci) >> { >> - VFIODirtyRangesListener *dirty = container_of(listener, >> - VFIODirtyRangesListener, >> - listener); >> - VFIODirtyRanges *range = &dirty->ranges; >> - hwaddr iova, end, *min, *max; >> - >> - if (!vfio_listener_valid_section(section, "tracking_update") || >> - !vfio_get_section_iova_range(dirty->bcontainer, section, >> - &iova, &end, NULL)) { >> - return; >> - } >> + hwaddr *min, *max; >> >> /* >> * The address space passed to the dirty tracker is reduced to three ranges: >> @@ -873,8 +864,7 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, >> * The alternative would be an IOVATree but that has a much bigger runtime >> * overhead and unnecessary complexity. >> */ >> - if (vfio_section_is_vfio_pci(section, dirty->bcontainer) && >> - iova >= UINT32_MAX) { >> + if (update_pci && iova >= UINT32_MAX) { >> min = &range->minpci64; >> max = &range->maxpci64; >> } else { >> @@ -889,7 +879,23 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, >> } >> >> trace_vfio_device_dirty_tracking_update(iova, end, *min, *max); > don't you want to update the name of the trace point? There is only one caller. Let's reconsider when there are more users of this routine. Thanks, C. >> - return; >> +} >> + >> +static void vfio_dirty_tracking_update(MemoryListener *listener, >> + MemoryRegionSection *section) >> +{ >> + VFIODirtyRangesListener *dirty = >> + container_of(listener, VFIODirtyRangesListener, listener); >> + hwaddr iova, end; >> + >> + if (!vfio_listener_valid_section(section, "tracking_update") || >> + !vfio_get_section_iova_range(dirty->bcontainer, section, >> + &iova, &end, NULL)) { >> + return; >> + } >> + >> + vfio_dirty_tracking_update_range(&dirty->ranges, iova, end, >> + vfio_section_is_vfio_pci(section, dirty->bcontainer)); >> } >> >> static const MemoryListener vfio_dirty_tracking_listener = { > Besides > Reviewed-by: Eric Auger <eric.auger@redhat.com> > > Eric >
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index d48cd9b9361a92d184e423ffc60aabaff40fb487..fe215918bdf66ddbe3c5db803e10ce1aa9756b90 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -839,20 +839,11 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section, return false; } -static void vfio_dirty_tracking_update(MemoryListener *listener, - MemoryRegionSection *section) +static void vfio_dirty_tracking_update_range(VFIODirtyRanges *range, + hwaddr iova, hwaddr end, + bool update_pci) { - VFIODirtyRangesListener *dirty = container_of(listener, - VFIODirtyRangesListener, - listener); - VFIODirtyRanges *range = &dirty->ranges; - hwaddr iova, end, *min, *max; - - if (!vfio_listener_valid_section(section, "tracking_update") || - !vfio_get_section_iova_range(dirty->bcontainer, section, - &iova, &end, NULL)) { - return; - } + hwaddr *min, *max; /* * The address space passed to the dirty tracker is reduced to three ranges: @@ -873,8 +864,7 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, * The alternative would be an IOVATree but that has a much bigger runtime * overhead and unnecessary complexity. */ - if (vfio_section_is_vfio_pci(section, dirty->bcontainer) && - iova >= UINT32_MAX) { + if (update_pci && iova >= UINT32_MAX) { min = &range->minpci64; max = &range->maxpci64; } else { @@ -889,7 +879,23 @@ static void vfio_dirty_tracking_update(MemoryListener *listener, } trace_vfio_device_dirty_tracking_update(iova, end, *min, *max); - return; +} + +static void vfio_dirty_tracking_update(MemoryListener *listener, + MemoryRegionSection *section) +{ + VFIODirtyRangesListener *dirty = + container_of(listener, VFIODirtyRangesListener, listener); + hwaddr iova, end; + + if (!vfio_listener_valid_section(section, "tracking_update") || + !vfio_get_section_iova_range(dirty->bcontainer, section, + &iova, &end, NULL)) { + return; + } + + vfio_dirty_tracking_update_range(&dirty->ranges, iova, end, + vfio_section_is_vfio_pci(section, dirty->bcontainer)); } static const MemoryListener vfio_dirty_tracking_listener = {