14e647fa0SStefano Garzarella /* 24e647fa0SStefano Garzarella * QEMU host POSIX shared memory object backend 34e647fa0SStefano Garzarella * 44e647fa0SStefano Garzarella * Copyright (C) 2024 Red Hat Inc 54e647fa0SStefano Garzarella * 64e647fa0SStefano Garzarella * Authors: 74e647fa0SStefano Garzarella * Stefano Garzarella <sgarzare@redhat.com> 84e647fa0SStefano Garzarella * 94e647fa0SStefano Garzarella * This work is licensed under the terms of the GNU GPL, version 2 or later. 104e647fa0SStefano Garzarella * See the COPYING file in the top-level directory. 114e647fa0SStefano Garzarella */ 124e647fa0SStefano Garzarella 134e647fa0SStefano Garzarella #include "qemu/osdep.h" 1432cad1ffSPhilippe Mathieu-Daudé #include "system/hostmem.h" 154e647fa0SStefano Garzarella #include "qapi/error.h" 164e647fa0SStefano Garzarella 174e647fa0SStefano Garzarella #define TYPE_MEMORY_BACKEND_SHM "memory-backend-shm" 184e647fa0SStefano Garzarella 194e647fa0SStefano Garzarella OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendShm, MEMORY_BACKEND_SHM) 204e647fa0SStefano Garzarella 214e647fa0SStefano Garzarella struct HostMemoryBackendShm { 224e647fa0SStefano Garzarella HostMemoryBackend parent_obj; 234e647fa0SStefano Garzarella }; 244e647fa0SStefano Garzarella 254e647fa0SStefano Garzarella static bool 264e647fa0SStefano Garzarella shm_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) 274e647fa0SStefano Garzarella { 284e647fa0SStefano Garzarella g_autofree char *backend_name = NULL; 294e647fa0SStefano Garzarella uint32_t ram_flags; 30*57ad6ab8SSteve Sistare int fd; 314e647fa0SStefano Garzarella 324e647fa0SStefano Garzarella if (!backend->size) { 334e647fa0SStefano Garzarella error_setg(errp, "can't create shm backend with size 0"); 344e647fa0SStefano Garzarella return false; 354e647fa0SStefano Garzarella } 364e647fa0SStefano Garzarella 374e647fa0SStefano Garzarella if (!backend->share) { 384e647fa0SStefano Garzarella error_setg(errp, "can't create shm backend with `share=off`"); 394e647fa0SStefano Garzarella return false; 404e647fa0SStefano Garzarella } 414e647fa0SStefano Garzarella 42*57ad6ab8SSteve Sistare fd = qemu_shm_alloc(backend->size, errp); 434e647fa0SStefano Garzarella if (fd < 0) { 444e647fa0SStefano Garzarella return false; 454e647fa0SStefano Garzarella } 464e647fa0SStefano Garzarella 47*57ad6ab8SSteve Sistare /* Let's do the same as memory-backend-ram,share=on would do. */ 48*57ad6ab8SSteve Sistare backend_name = host_memory_backend_get_name(backend); 494e647fa0SStefano Garzarella ram_flags = RAM_SHARED; 504e647fa0SStefano Garzarella ram_flags |= backend->reserve ? 0 : RAM_NORESERVE; 514e647fa0SStefano Garzarella 524e647fa0SStefano Garzarella return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), 534e647fa0SStefano Garzarella backend_name, backend->size, 544e647fa0SStefano Garzarella ram_flags, fd, 0, errp); 554e647fa0SStefano Garzarella } 564e647fa0SStefano Garzarella 574e647fa0SStefano Garzarella static void 584e647fa0SStefano Garzarella shm_backend_instance_init(Object *obj) 594e647fa0SStefano Garzarella { 604e647fa0SStefano Garzarella HostMemoryBackendShm *m = MEMORY_BACKEND_SHM(obj); 614e647fa0SStefano Garzarella 624e647fa0SStefano Garzarella MEMORY_BACKEND(m)->share = true; 634e647fa0SStefano Garzarella } 644e647fa0SStefano Garzarella 654e647fa0SStefano Garzarella static void 664e647fa0SStefano Garzarella shm_backend_class_init(ObjectClass *oc, void *data) 674e647fa0SStefano Garzarella { 684e647fa0SStefano Garzarella HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); 694e647fa0SStefano Garzarella 704e647fa0SStefano Garzarella bc->alloc = shm_backend_memory_alloc; 714e647fa0SStefano Garzarella } 724e647fa0SStefano Garzarella 734e647fa0SStefano Garzarella static const TypeInfo shm_backend_info = { 744e647fa0SStefano Garzarella .name = TYPE_MEMORY_BACKEND_SHM, 754e647fa0SStefano Garzarella .parent = TYPE_MEMORY_BACKEND, 764e647fa0SStefano Garzarella .instance_init = shm_backend_instance_init, 774e647fa0SStefano Garzarella .class_init = shm_backend_class_init, 784e647fa0SStefano Garzarella .instance_size = sizeof(HostMemoryBackendShm), 794e647fa0SStefano Garzarella }; 804e647fa0SStefano Garzarella 814e647fa0SStefano Garzarella static void register_types(void) 824e647fa0SStefano Garzarella { 834e647fa0SStefano Garzarella type_register_static(&shm_backend_info); 844e647fa0SStefano Garzarella } 854e647fa0SStefano Garzarella 864e647fa0SStefano Garzarella type_init(register_types); 87