2
0

hostmem-shm.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * QEMU host POSIX shared memory object backend
  3. *
  4. * Copyright (C) 2024 Red Hat Inc
  5. *
  6. * Authors:
  7. * Stefano Garzarella <sgarzare@redhat.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. */
  12. #include "qemu/osdep.h"
  13. #include "system/hostmem.h"
  14. #include "qapi/error.h"
  15. #include "migration/cpr.h"
  16. #define TYPE_MEMORY_BACKEND_SHM "memory-backend-shm"
  17. OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendShm, MEMORY_BACKEND_SHM)
  18. struct HostMemoryBackendShm {
  19. HostMemoryBackend parent_obj;
  20. };
  21. static bool
  22. shm_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
  23. {
  24. g_autofree char *backend_name = host_memory_backend_get_name(backend);
  25. uint32_t ram_flags;
  26. int fd = cpr_find_fd(backend_name, 0);
  27. if (!backend->size) {
  28. error_setg(errp, "can't create shm backend with size 0");
  29. return false;
  30. }
  31. if (!backend->share) {
  32. error_setg(errp, "can't create shm backend with `share=off`");
  33. return false;
  34. }
  35. if (fd >= 0) {
  36. goto have_fd;
  37. }
  38. fd = qemu_shm_alloc(backend->size, errp);
  39. if (fd < 0) {
  40. return false;
  41. }
  42. cpr_save_fd(backend_name, 0, fd);
  43. have_fd:
  44. /* Let's do the same as memory-backend-ram,share=on would do. */
  45. ram_flags = RAM_SHARED;
  46. ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
  47. return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend),
  48. backend_name, backend->size,
  49. ram_flags, fd, 0, errp);
  50. }
  51. static void
  52. shm_backend_instance_init(Object *obj)
  53. {
  54. HostMemoryBackendShm *m = MEMORY_BACKEND_SHM(obj);
  55. MEMORY_BACKEND(m)->share = true;
  56. }
  57. static void
  58. shm_backend_class_init(ObjectClass *oc, void *data)
  59. {
  60. HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
  61. bc->alloc = shm_backend_memory_alloc;
  62. }
  63. static const TypeInfo shm_backend_info = {
  64. .name = TYPE_MEMORY_BACKEND_SHM,
  65. .parent = TYPE_MEMORY_BACKEND,
  66. .instance_init = shm_backend_instance_init,
  67. .class_init = shm_backend_class_init,
  68. .instance_size = sizeof(HostMemoryBackendShm),
  69. };
  70. static void register_types(void)
  71. {
  72. type_register_static(&shm_backend_info);
  73. }
  74. type_init(register_types);