On 18/02/20 19:22, Stefan Hajnoczi wrote: > + * It is likely that the number of ioeventfds hasn't changed much, so use > + * the previous size as the starting value. > + */ > + ioeventfd_max = as->ioeventfd_nb; > + ioeventfds = g_new(MemoryRegionIoeventfd, ioeventfd_max);
This would be a bit space-inefficient if we are adding just one ioeventfd, because it would waste 64 entries right below. I would like to squash this if it's okay with you: diff --git a/memory.c b/memory.c index 2d6f931f8c..09be40edd2 100644 --- a/memory.c +++ b/memory.c @@ -801,9 +801,10 @@ static void address_space_update_ioeventfds(AddressSpace *as) /* * It is likely that the number of ioeventfds hasn't changed much, so use - * the previous size as the starting value. + * the previous size as the starting value, with some headroom to avoid + * gratuitous reallocations. */ - ioeventfd_max = as->ioeventfd_nb; + ioeventfd_max = QEMU_ALIGN_UP(as->ioeventfd_nb, 4); ioeventfds = g_new(MemoryRegionIoeventfd, ioeventfd_max); view = address_space_get_flatview(as); @@ -815,7 +816,7 @@ static void address_space_update_ioeventfds(AddressSpace *as) if (addrrange_intersects(fr->addr, tmp)) { ++ioeventfd_nb; if (ioeventfd_nb > ioeventfd_max) { - ioeventfd_max += 64; + ioeventfd_max = MAX(ioeventfd_max * 2, 4); ioeventfds = g_realloc(ioeventfds, ioeventfd_max * sizeof(*ioeventfds)); } Thanks, Paolo > view = address_space_get_flatview(as); > FOR_EACH_FLAT_RANGE(fr, view) { > for (i = 0; i < fr->mr->ioeventfd_nb; ++i) { > @@ -806,8 +814,11 @@ static void address_space_update_ioeventfds(AddressSpace > *as) > > int128_make64(fr->offset_in_region))); > if (addrrange_intersects(fr->addr, tmp)) { > ++ioeventfd_nb; > - ioeventfds = g_realloc(ioeventfds, > - ioeventfd_nb * > sizeof(*ioeventfds)); > + if (ioeventfd_nb > ioeventfd_max) { > + ioeventfd_max += 64; > + ioeventfds = g_realloc(ioeventfds, > + ioeventfd_max * sizeof(*ioeventfds)); > + }