X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/0a99aae5fab5ed260aab96049c274b0334eb4085..979e9b03fc8c85d3b78a14410c64cbb16d348095:/backends/hostmem.c diff --git a/backends/hostmem.c b/backends/hostmem.c index ca10c51b51..41ba2af52f 100644 --- a/backends/hostmem.c +++ b/backends/hostmem.c @@ -10,10 +10,10 @@ * See the COPYING file in the top-level directory. */ #include "sysemu/hostmem.h" +#include "hw/boards.h" #include "qapi/visitor.h" #include "qapi-types.h" #include "qapi-visit.h" -#include "qapi/qmp/qerror.h" #include "qemu/config-file.h" #include "qom/object_interfaces.h" @@ -113,24 +113,17 @@ host_memory_backend_set_host_nodes(Object *obj, Visitor *v, void *opaque, #endif } -static void -host_memory_backend_get_policy(Object *obj, Visitor *v, void *opaque, - const char *name, Error **errp) +static int +host_memory_backend_get_policy(Object *obj, Error **errp G_GNUC_UNUSED) { HostMemoryBackend *backend = MEMORY_BACKEND(obj); - int policy = backend->policy; - - visit_type_enum(v, &policy, HostMemPolicy_lookup, NULL, name, errp); + return backend->policy; } static void -host_memory_backend_set_policy(Object *obj, Visitor *v, void *opaque, - const char *name, Error **errp) +host_memory_backend_set_policy(Object *obj, int policy, Error **errp) { HostMemoryBackend *backend = MEMORY_BACKEND(obj); - int policy; - - visit_type_enum(v, &policy, HostMemPolicy_lookup, NULL, name, errp); backend->policy = policy; #ifndef CONFIG_NUMA @@ -230,11 +223,10 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value, static void host_memory_backend_init(Object *obj) { HostMemoryBackend *backend = MEMORY_BACKEND(obj); + MachineState *machine = MACHINE(qdev_get_machine()); - backend->merge = qemu_opt_get_bool(qemu_get_machine_opts(), - "mem-merge", true); - backend->dump = qemu_opt_get_bool(qemu_get_machine_opts(), - "dump-guest-core", true); + backend->merge = machine_mem_merge(machine); + backend->dump = machine_dump_guest_core(machine); backend->prealloc = mem_prealloc; object_property_add_bool(obj, "merge", @@ -252,18 +244,10 @@ static void host_memory_backend_init(Object *obj) object_property_add(obj, "host-nodes", "int", host_memory_backend_get_host_nodes, host_memory_backend_set_host_nodes, NULL, NULL, NULL); - object_property_add(obj, "policy", "str", - host_memory_backend_get_policy, - host_memory_backend_set_policy, NULL, NULL, NULL); -} - -static void host_memory_backend_finalize(Object *obj) -{ - HostMemoryBackend *backend = MEMORY_BACKEND(obj); - - if (memory_region_size(&backend->mr)) { - memory_region_destroy(&backend->mr); - } + object_property_add_enum(obj, "policy", "HostMemPolicy", + HostMemPolicy_lookup, + host_memory_backend_get_policy, + host_memory_backend_set_policy, NULL); } MemoryRegion * @@ -304,7 +288,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp) /* ensure policy won't be ignored in case memory is preallocated * before mbind(). note: MPOL_MF_STRICT is ignored on hugepages so * this doesn't catch hugepage case. */ - unsigned flags = MPOL_MF_STRICT; + unsigned flags = MPOL_MF_STRICT | MPOL_MF_MOVE; /* check for invalid host-nodes and policies and give more verbose * error messages than mbind(). */ @@ -344,12 +328,26 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp) } } +static bool +host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp) +{ + MemoryRegion *mr; + + mr = host_memory_backend_get_memory(MEMORY_BACKEND(uc), errp); + if (memory_region_is_mapped(mr)) { + return false; + } else { + return true; + } +} + static void host_memory_backend_class_init(ObjectClass *oc, void *data) { UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); ucc->complete = host_memory_backend_memory_complete; + ucc->can_be_deleted = host_memory_backend_can_be_deleted; } static const TypeInfo host_memory_backend_info = { @@ -360,7 +358,6 @@ static const TypeInfo host_memory_backend_info = { .class_init = host_memory_backend_class_init, .instance_size = sizeof(HostMemoryBackend), .instance_init = host_memory_backend_init, - .instance_finalize = host_memory_backend_finalize, .interfaces = (InterfaceInfo[]) { { TYPE_USER_CREATABLE }, { }