qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] memory: batch allocate ioeventfds[] in address_space_update_


From: Paolo Bonzini
Subject: Re: [PATCH] memory: batch allocate ioeventfds[] in address_space_update_ioeventfds()
Date: Wed, 19 Feb 2020 12:36:04 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.1

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));
> +                }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]