 e681645862
			
		
	
	
		e681645862
		
	
	
	
	
		
			
			Let's allow for specifying a thread context via the "prealloc-context" property. When set, preallcoation threads will be crated via the thread context -- inheriting the same CPU affinity as the thread context. Pinning preallcoation threads to CPUs can heavily increase performance in NUMA setups, because, preallocation from a CPU close to the target NUMA node(s) is faster then preallocation from a CPU further remote, simply because of memory bandwidth for initializing memory with zeroes. This is especially relevant for very large VMs backed by huge/gigantic pages, whereby preallocation is mandatory. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Message-Id: <20221014134720.168738-7-david@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com>
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * QEMU Host Memory Backend
 | |
|  *
 | |
|  * Copyright (C) 2013-2014 Red Hat Inc
 | |
|  *
 | |
|  * Authors:
 | |
|  *   Igor Mammedov <imammedo@redhat.com>
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
|  * See the COPYING file in the top-level directory.
 | |
|  */
 | |
| 
 | |
| #ifndef SYSEMU_HOSTMEM_H
 | |
| #define SYSEMU_HOSTMEM_H
 | |
| 
 | |
| #include "sysemu/numa.h"
 | |
| #include "qapi/qapi-types-machine.h"
 | |
| #include "qom/object.h"
 | |
| #include "exec/memory.h"
 | |
| #include "qemu/bitmap.h"
 | |
| #include "qemu/thread-context.h"
 | |
| 
 | |
| #define TYPE_MEMORY_BACKEND "memory-backend"
 | |
| OBJECT_DECLARE_TYPE(HostMemoryBackend, HostMemoryBackendClass,
 | |
|                     MEMORY_BACKEND)
 | |
| 
 | |
| /* hostmem-ram.c */
 | |
| /**
 | |
|  * @TYPE_MEMORY_BACKEND_RAM:
 | |
|  * name of backend that uses mmap on the anonymous RAM
 | |
|  */
 | |
| 
 | |
| #define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
 | |
| 
 | |
| /* hostmem-file.c */
 | |
| /**
 | |
|  * @TYPE_MEMORY_BACKEND_FILE:
 | |
|  * name of backend that uses mmap on a file descriptor
 | |
|  */
 | |
| #define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * HostMemoryBackendClass:
 | |
|  * @parent_class: opaque parent class container
 | |
|  */
 | |
| struct HostMemoryBackendClass {
 | |
|     ObjectClass parent_class;
 | |
| 
 | |
|     void (*alloc)(HostMemoryBackend *backend, Error **errp);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @HostMemoryBackend
 | |
|  *
 | |
|  * @parent: opaque parent object container
 | |
|  * @size: amount of memory backend provides
 | |
|  * @mr: MemoryRegion representing host memory belonging to backend
 | |
|  * @prealloc_threads: number of threads to be used for preallocatining RAM
 | |
|  */
 | |
| struct HostMemoryBackend {
 | |
|     /* private */
 | |
|     Object parent;
 | |
| 
 | |
|     /* protected */
 | |
|     uint64_t size;
 | |
|     bool merge, dump, use_canonical_path;
 | |
|     bool prealloc, is_mapped, share, reserve;
 | |
|     uint32_t prealloc_threads;
 | |
|     ThreadContext *prealloc_context;
 | |
|     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
 | |
|     HostMemPolicy policy;
 | |
| 
 | |
|     MemoryRegion mr;
 | |
| };
 | |
| 
 | |
| bool host_memory_backend_mr_inited(HostMemoryBackend *backend);
 | |
| MemoryRegion *host_memory_backend_get_memory(HostMemoryBackend *backend);
 | |
| 
 | |
| void host_memory_backend_set_mapped(HostMemoryBackend *backend, bool mapped);
 | |
| bool host_memory_backend_is_mapped(HostMemoryBackend *backend);
 | |
| size_t host_memory_backend_pagesize(HostMemoryBackend *memdev);
 | |
| char *host_memory_backend_get_name(HostMemoryBackend *backend);
 | |
| 
 | |
| #endif
 |