From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bMXlc-00065B-Td for qemu-devel@nongnu.org; Mon, 11 Jul 2016 05:44:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bMXlX-0000cx-S0 for qemu-devel@nongnu.org; Mon, 11 Jul 2016 05:44:43 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:47634 helo=mx01.kamp.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bMXlX-0000cr-Hu for qemu-devel@nongnu.org; Mon, 11 Jul 2016 05:44:39 -0400 References: <1467104499-27517-1-git-send-email-pl@kamp.de> <1467104499-27517-14-git-send-email-pl@kamp.de> <57836783.4070100@kamp.de> From: Peter Lieven Message-ID: <57836A7F.9090900@kamp.de> Date: Mon, 11 Jul 2016 11:44:31 +0200 MIME-Version: 1.0 In-Reply-To: <57836783.4070100@kamp.de> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 13/15] exec: use mmap for PhysPageMap->nodes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , qemu-devel@nongnu.org Cc: kwolf@redhat.com, peter.maydell@linaro.org, mst@redhat.com, dgilbert@redhat.com, mreitz@redhat.com, kraxel@redhat.com Am 11.07.2016 um 11:31 schrieb Peter Lieven: > Am 28.06.2016 um 12:43 schrieb Paolo Bonzini: >> >> On 28/06/2016 11:01, Peter Lieven wrote: >>> this was causing serious framentation in conjunction with the >>> subpages since RCU was introduced. The node space was allocated >>> at approx 32kB then reallocted to approx 75kB and this a few hundred >>> times at startup. And thanks to RCU the freeing was delayed. >>> >>> Signed-off-by: Peter Lieven >> The size of the node from the previous as->dispatch could be used as a >> hint for the new one perhaps, avoiding the reallocation? > > This here seems also to work: > > diff --git a/exec.c b/exec.c > index 0122ef7..2691c0a 100644 > --- a/exec.c > +++ b/exec.c > @@ -187,10 +187,12 @@ struct CPUAddressSpace { > > static void phys_map_node_reserve(PhysPageMap *map, unsigned nodes) > { > + static unsigned alloc_hint = 16; > if (map->nodes_nb + nodes > map->nodes_nb_alloc) { > - map->nodes_nb_alloc = MAX(map->nodes_nb_alloc * 2, 16); > + map->nodes_nb_alloc = MAX(map->nodes_nb_alloc, alloc_hint); > map->nodes_nb_alloc = MAX(map->nodes_nb_alloc, map->nodes_nb + nodes); > map->nodes = g_renew(Node, map->nodes, map->nodes_nb_alloc); > + alloc_hint = map->nodes_nb_alloc; > } > } > > > Question is still, mmap for this? Side note: I added some counters and found that on my test system at maximum 453 allocations of 28 * sizeof(Nodes) bytes where active at the same time. During runtime its only 9. So this might explain why the alloc + realloc causes fragmentation of the brk heap. Peter