- alloc.name = (char *) memfd->name;
- alloc.size = memfd->ssvm_size;
- alloc.flags = CLIB_MEM_VM_F_SHARED;
- alloc.requested_va = memfd->requested_va;
- if ((err = clib_mem_vm_ext_alloc (&alloc)))
+ if (memfd->huge_page)
+ memfd->fd = clib_mem_vm_create_fd (CLIB_MEM_PAGE_SZ_DEFAULT_HUGE,
+ (char *) memfd->name);
+ else
+ memfd->fd =
+ clib_mem_vm_create_fd (CLIB_MEM_PAGE_SZ_DEFAULT, (char *) memfd->name);
+
+ if (memfd->fd == CLIB_MEM_ERROR)
+ {
+ clib_unix_warning ("failed to create memfd");
+ return SSVM_API_ERROR_CREATE_FAILURE;
+ }
+
+ log2_page_size = clib_mem_get_fd_log2_page_size (memfd->fd);
+ if (log2_page_size == 0)
+ {
+ clib_unix_warning ("cannot determine page size");
+ return SSVM_API_ERROR_CREATE_FAILURE;
+ }
+
+ n_pages = ((memfd->ssvm_size - 1) >> log2_page_size) + 1;
+
+ if ((ftruncate (memfd->fd, n_pages << log2_page_size)) == -1)
+ {
+ clib_unix_warning ("memfd ftruncate failure");
+ return SSVM_API_ERROR_CREATE_FAILURE;
+ }
+
+ sh = clib_mem_vm_map_shared (uword_to_pointer (memfd->requested_va, void *),
+ memfd->ssvm_size, memfd->fd, 0,
+ (char *) memfd->name);
+ if (sh == CLIB_MEM_VM_MAP_FAILED)