static void memfd_backend_class_init(ObjectClass *oc, void *data) { HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); bc->alloc = memfd_backend_memory_alloc; if (qemu_memfd_check(MFD_HUGETLB)) { object_class_property_add_bool(oc, "hugetlb", memfd_backend_get_hugetlb, memfd_backend_set_hugetlb, &error_abort); object_class_property_set_description(oc, "hugetlb", "Use huge pages", &error_abort); object_class_property_add(oc, "hugetlbsize", "int", memfd_backend_get_hugetlbsize, memfd_backend_set_hugetlbsize, NULL, NULL, &error_abort); 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); } }
static void append_mem_opts(TestServer *server, GString *cmd_line, int size, enum test_memfd memfd) { if (memfd == TEST_MEMFD_AUTO) { memfd = qemu_memfd_check(MFD_ALLOW_SEALING) ? TEST_MEMFD_YES : TEST_MEMFD_NO; } if (memfd == TEST_MEMFD_YES) { g_string_append_printf(cmd_line, QEMU_CMD_MEMFD, size, size); } else { const char *root = init_hugepagefs() ? : server->tmpfs; g_string_append_printf(cmd_line, QEMU_CMD_MEM, size, size, root); } }
static char *get_qemu_cmd(TestServer *s, int mem, enum test_memfd memfd, const char *mem_path, const char *chr_opts, const char *extra) { if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check(0)) { memfd = TEST_MEMFD_YES; } if (memfd == TEST_MEMFD_YES) { return g_strdup_printf(QEMU_CMD_MEMFD QEMU_CMD_CHR QEMU_CMD_NETDEV QEMU_CMD_NET "%s", mem, mem, s->chr_name, s->socket_path, chr_opts, s->chr_name, extra); } else { return g_strdup_printf(QEMU_CMD_MEM QEMU_CMD_CHR QEMU_CMD_NETDEV QEMU_CMD_NET "%s", mem, mem, mem_path, s->chr_name, s->socket_path, chr_opts, s->chr_name, extra); } }
static void register_types(void) { if (qemu_memfd_check(0)) { type_register_static(&memfd_backend_info); } }