memory: Create FlatView directly
This avoids usual memory_region_transaction_commit() which rebuilds all FVs. On POWER8 with 255 CPUs, 255 virtio-net, 40 PCI bridges guest this brings down the boot time from 25s to 20s and reduces the amount of temporary FVs allocated during machine constructon (~800000 -> ~640000) and amount of temporary dispatch trees (~370000 -> ~300000), the total memory footprint goes down (18G -> 17G). Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Message-Id: <20170921085110.25598-18-aik@ozlabs.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									b516572f31
								
							
						
					
					
						commit
						202fc01b05
					
				
							
								
								
									
										16
									
								
								memory.c
								
								
								
								
							
							
						
						
									
										16
									
								
								memory.c
								
								
								
								
							| 
						 | 
				
			
			@ -1010,6 +1010,17 @@ static void address_space_set_flatview(AddressSpace *as)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void address_space_update_topology(AddressSpace *as)
 | 
			
		||||
{
 | 
			
		||||
    MemoryRegion *physmr = memory_region_get_flatview_root(as->root);
 | 
			
		||||
 | 
			
		||||
    flatviews_init();
 | 
			
		||||
    if (!g_hash_table_lookup(flat_views, physmr)) {
 | 
			
		||||
        generate_memory_topology(physmr);
 | 
			
		||||
    }
 | 
			
		||||
    address_space_set_flatview(as);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void memory_region_transaction_begin(void)
 | 
			
		||||
{
 | 
			
		||||
    qemu_flush_coalesced_mmio_buffer();
 | 
			
		||||
| 
						 | 
				
			
			@ -2721,7 +2732,6 @@ void memory_region_invalidate_mmio_ptr(MemoryRegion *mr, hwaddr offset,
 | 
			
		|||
void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
 | 
			
		||||
{
 | 
			
		||||
    memory_region_ref(root);
 | 
			
		||||
    memory_region_transaction_begin();
 | 
			
		||||
    as->root = root;
 | 
			
		||||
    as->current_map = NULL;
 | 
			
		||||
    as->ioeventfd_nb = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -2729,8 +2739,8 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
 | 
			
		|||
    QTAILQ_INIT(&as->listeners);
 | 
			
		||||
    QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link);
 | 
			
		||||
    as->name = g_strdup(name ? name : "anonymous");
 | 
			
		||||
    memory_region_update_pending |= root->enabled;
 | 
			
		||||
    memory_region_transaction_commit();
 | 
			
		||||
    address_space_update_topology(as);
 | 
			
		||||
    address_space_update_ioeventfds(as);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_address_space_destroy(AddressSpace *as)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue