X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=backends%2Fhostmem-memfd.c;h=3fc85c3db81bb71176cdfe65dbf0643e1504355b;hb=c54483b6f45a0c84e230728a1a9e7adf90345e15;hp=b6836b28e54bccc63e38e419d1668a06c0cd080f;hpb=7d51a855cd568ec3399a1834ada4023cfa12f231;p=mirror_qemu.git diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index b6836b28e5..3fc85c3db8 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -9,20 +9,19 @@ * 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 "qemu/osdep.h" -#include "qemu-common.h" #include "sysemu/hostmem.h" -#include "sysemu/sysemu.h" #include "qom/object_interfaces.h" #include "qemu/memfd.h" +#include "qemu/module.h" #include "qapi/error.h" +#include "qom/object.h" #define TYPE_MEMORY_BACKEND_MEMFD "memory-backend-memfd" -#define MEMORY_BACKEND_MEMFD(obj) \ - OBJECT_CHECK(HostMemoryBackendMemfd, (obj), TYPE_MEMORY_BACKEND_MEMFD) +OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendMemfd, MEMORY_BACKEND_MEMFD) -typedef struct HostMemoryBackendMemfd HostMemoryBackendMemfd; struct HostMemoryBackendMemfd { HostMemoryBackend parent_obj; @@ -36,6 +35,7 @@ static void memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(backend); + uint32_t ram_flags; char *name; int fd; @@ -44,11 +44,6 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) return; } - if (host_memory_backend_mr_inited(backend)) { - return; - } - - backend->force_prealloc = mem_prealloc; fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, m->hugetlb, m->hugetlbsize, m->seal ? F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, @@ -57,9 +52,11 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) return; } - name = object_get_canonical_path(OBJECT(backend)); - memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), - name, backend->size, true, fd, errp); + name = host_memory_backend_get_name(backend); + ram_flags = backend->share ? RAM_SHARED : 0; + ram_flags |= backend->reserve ? 0 : RAM_NORESERVE; + memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, + backend->size, ram_flags, fd, 0, errp); g_free(name); } @@ -80,26 +77,22 @@ memfd_backend_set_hugetlbsize(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(obj); - Error *local_err = NULL; uint64_t value; if (host_memory_backend_mr_inited(MEMORY_BACKEND(obj))) { - error_setg(&local_err, "cannot change property value"); - goto out; + error_setg(errp, "cannot change property value"); + return; } - visit_type_size(v, name, &value, &local_err); - if (local_err) { - goto out; + if (!visit_type_size(v, name, &value, errp)) { + return; } if (!value) { - error_setg(&local_err, "Property '%s.%s' doesn't take value '%" - PRIu64 "'", object_get_typename(obj), name, value); - goto out; + error_setg(errp, "Property '%s.%s' doesn't take value '%" PRIu64 "'", + object_get_typename(obj), name, value); + return; } m->hugetlbsize = value; -out: - error_propagate(errp, local_err); } static void @@ -131,6 +124,7 @@ memfd_backend_instance_init(Object *obj) /* default to sealed file */ m->seal = true; + MEMORY_BACKEND(m)->share = true; } static void @@ -143,28 +137,21 @@ memfd_backend_class_init(ObjectClass *oc, void *data) if (qemu_memfd_check(MFD_HUGETLB)) { object_class_property_add_bool(oc, "hugetlb", memfd_backend_get_hugetlb, - memfd_backend_set_hugetlb, - &error_abort); + memfd_backend_set_hugetlb); object_class_property_set_description(oc, "hugetlb", - "Use huge pages", - &error_abort); + "Use huge pages"); object_class_property_add(oc, "hugetlbsize", "int", memfd_backend_get_hugetlbsize, memfd_backend_set_hugetlbsize, - NULL, NULL, &error_abort); + NULL, NULL); object_class_property_set_description(oc, "hugetlbsize", - "Huge pages size (ex: 2M, 1G)", - &error_abort); - } - if (qemu_memfd_check(MFD_ALLOW_SEALING)) { - object_class_property_add_bool(oc, "seal", - memfd_backend_get_seal, - memfd_backend_set_seal, - &error_abort); - object_class_property_set_description(oc, "seal", - "Seal growing & shrinking", - &error_abort); + "Huge pages size (ex: 2M, 1G)"); } + object_class_property_add_bool(oc, "seal", + memfd_backend_get_seal, + memfd_backend_set_seal); + object_class_property_set_description(oc, "seal", + "Seal growing & shrinking"); } static const TypeInfo memfd_backend_info = { @@ -177,7 +164,7 @@ static const TypeInfo memfd_backend_info = { static void register_types(void) { - if (qemu_memfd_check(0)) { + if (qemu_memfd_check(MFD_ALLOW_SEALING)) { type_register_static(&memfd_backend_info); } }