add memdev backend infrastructure
Provides framework for splitting host RAM allocation/ policies into a separate backend that could be used by devices. Initially only legacy RAM backend is provided, which uses memory_region_init_ram() allocator and compatible with every CLI option that affects memory_region_init_ram(). Signed-off-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									2d9c2725f7
								
							
						
					
					
						commit
						1f07048933
					
				| @ -6,3 +6,5 @@ common-obj-$(CONFIG_BRLAPI) += baum.o | ||||
| baum.o-cflags := $(SDL_CFLAGS) | ||||
| 
 | ||||
| common-obj-$(CONFIG_TPM) += tpm.o | ||||
| 
 | ||||
| common-obj-y += hostmem.o hostmem-ram.o | ||||
|  | ||||
							
								
								
									
										54
									
								
								backends/hostmem-ram.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								backends/hostmem-ram.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| /*
 | ||||
|  * 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. | ||||
|  */ | ||||
| #include "sysemu/hostmem.h" | ||||
| #include "qom/object_interfaces.h" | ||||
| 
 | ||||
| #define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram" | ||||
| 
 | ||||
| 
 | ||||
| static void | ||||
| ram_backend_memory_init(UserCreatable *uc, Error **errp) | ||||
| { | ||||
|     HostMemoryBackend *backend = MEMORY_BACKEND(uc); | ||||
|     char *path; | ||||
| 
 | ||||
|     if (!backend->size) { | ||||
|         error_setg(errp, "can't create backend with size 0"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     path = object_get_canonical_path_component(OBJECT(backend)); | ||||
|     memory_region_init_ram(&backend->mr, OBJECT(backend), path, | ||||
|                            backend->size); | ||||
|     g_free(path); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| ram_backend_class_init(ObjectClass *oc, void *data) | ||||
| { | ||||
|     UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); | ||||
| 
 | ||||
|     ucc->complete = ram_backend_memory_init; | ||||
| } | ||||
| 
 | ||||
| static const TypeInfo ram_backend_info = { | ||||
|     .name = TYPE_MEMORY_BACKEND_RAM, | ||||
|     .parent = TYPE_MEMORY_BACKEND, | ||||
|     .class_init = ram_backend_class_init, | ||||
| }; | ||||
| 
 | ||||
| static void register_types(void) | ||||
| { | ||||
|     type_register_static(&ram_backend_info); | ||||
| } | ||||
| 
 | ||||
| type_init(register_types); | ||||
							
								
								
									
										97
									
								
								backends/hostmem.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								backends/hostmem.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | ||||
| /*
 | ||||
|  * 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. | ||||
|  */ | ||||
| #include "sysemu/hostmem.h" | ||||
| #include "sysemu/sysemu.h" | ||||
| #include "qapi/visitor.h" | ||||
| #include "qapi/qmp/qerror.h" | ||||
| #include "qemu/config-file.h" | ||||
| #include "qom/object_interfaces.h" | ||||
| 
 | ||||
| static void | ||||
| hostmemory_backend_get_size(Object *obj, Visitor *v, void *opaque, | ||||
|                             const char *name, Error **errp) | ||||
| { | ||||
|     HostMemoryBackend *backend = MEMORY_BACKEND(obj); | ||||
|     uint64_t value = backend->size; | ||||
| 
 | ||||
|     visit_type_size(v, &value, name, errp); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| hostmemory_backend_set_size(Object *obj, Visitor *v, void *opaque, | ||||
|                             const char *name, Error **errp) | ||||
| { | ||||
|     HostMemoryBackend *backend = MEMORY_BACKEND(obj); | ||||
|     Error *local_err = NULL; | ||||
|     uint64_t value; | ||||
| 
 | ||||
|     if (memory_region_size(&backend->mr)) { | ||||
|         error_setg(&local_err, "cannot change property value"); | ||||
|         goto out; | ||||
|     } | ||||
| 
 | ||||
|     visit_type_size(v, &value, name, &local_err); | ||||
|     if (local_err) { | ||||
|         goto out; | ||||
|     } | ||||
|     if (!value) { | ||||
|         error_setg(&local_err, "Property '%s.%s' doesn't take value '%" | ||||
|                    PRIu64 "'", object_get_typename(obj), name, value); | ||||
|         goto out; | ||||
|     } | ||||
|     backend->size = value; | ||||
| out: | ||||
|     error_propagate(errp, local_err); | ||||
| } | ||||
| 
 | ||||
| static void hostmemory_backend_init(Object *obj) | ||||
| { | ||||
|     object_property_add(obj, "size", "int", | ||||
|                         hostmemory_backend_get_size, | ||||
|                         hostmemory_backend_set_size, NULL, NULL, NULL); | ||||
| } | ||||
| 
 | ||||
| static void hostmemory_backend_finalize(Object *obj) | ||||
| { | ||||
|     HostMemoryBackend *backend = MEMORY_BACKEND(obj); | ||||
| 
 | ||||
|     if (memory_region_size(&backend->mr)) { | ||||
|         memory_region_destroy(&backend->mr); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| MemoryRegion * | ||||
| host_memory_backend_get_memory(HostMemoryBackend *backend, Error **errp) | ||||
| { | ||||
|     return memory_region_size(&backend->mr) ? &backend->mr : NULL; | ||||
| } | ||||
| 
 | ||||
| static const TypeInfo hostmemory_backend_info = { | ||||
|     .name = TYPE_MEMORY_BACKEND, | ||||
|     .parent = TYPE_OBJECT, | ||||
|     .abstract = true, | ||||
|     .class_size = sizeof(HostMemoryBackendClass), | ||||
|     .instance_size = sizeof(HostMemoryBackend), | ||||
|     .instance_init = hostmemory_backend_init, | ||||
|     .instance_finalize = hostmemory_backend_finalize, | ||||
|     .interfaces = (InterfaceInfo[]) { | ||||
|         { TYPE_USER_CREATABLE }, | ||||
|         { } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static void register_types(void) | ||||
| { | ||||
|     type_register_static(&hostmemory_backend_info); | ||||
| } | ||||
| 
 | ||||
| type_init(register_types); | ||||
							
								
								
									
										60
									
								
								include/sysemu/hostmem.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								include/sysemu/hostmem.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| /*
 | ||||
|  * 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 QEMU_RAM_H | ||||
| #define QEMU_RAM_H | ||||
| 
 | ||||
| #include "qom/object.h" | ||||
| #include "qapi/error.h" | ||||
| #include "exec/memory.h" | ||||
| #include "qemu/option.h" | ||||
| 
 | ||||
| #define TYPE_MEMORY_BACKEND "memory-backend" | ||||
| #define MEMORY_BACKEND(obj) \ | ||||
|     OBJECT_CHECK(HostMemoryBackend, (obj), TYPE_MEMORY_BACKEND) | ||||
| #define MEMORY_BACKEND_GET_CLASS(obj) \ | ||||
|     OBJECT_GET_CLASS(HostMemoryBackendClass, (obj), TYPE_MEMORY_BACKEND) | ||||
| #define MEMORY_BACKEND_CLASS(klass) \ | ||||
|     OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND) | ||||
| 
 | ||||
| typedef struct HostMemoryBackend HostMemoryBackend; | ||||
| typedef struct HostMemoryBackendClass HostMemoryBackendClass; | ||||
| 
 | ||||
| /**
 | ||||
|  * HostMemoryBackendClass: | ||||
|  * @parent_class: opaque parent class container | ||||
|  */ | ||||
| struct HostMemoryBackendClass { | ||||
|     ObjectClass parent_class; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * @HostMemoryBackend | ||||
|  * | ||||
|  * @parent: opaque parent object container | ||||
|  * @size: amount of memory backend provides | ||||
|  * @id: unique identification string in memdev namespace | ||||
|  * @mr: MemoryRegion representing host memory belonging to backend | ||||
|  */ | ||||
| struct HostMemoryBackend { | ||||
|     /* private */ | ||||
|     Object parent; | ||||
| 
 | ||||
|     /* protected */ | ||||
|     uint64_t size; | ||||
| 
 | ||||
|     MemoryRegion mr; | ||||
| }; | ||||
| 
 | ||||
| MemoryRegion *host_memory_backend_get_memory(HostMemoryBackend *backend, | ||||
|                                              Error **errp); | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Igor Mammedov
						Igor Mammedov