libc: Prefer to implement memfd on top of shm

since shm can work in protected and kernel mode too

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao 2023-06-12 00:03:55 +08:00 committed by Petro Karashchenko
parent f930b4f6f5
commit 43f9abf84f
2 changed files with 34 additions and 9 deletions

View File

@ -81,9 +81,25 @@ config LIBC_FTOK_VFS_PATH
---help--- ---help---
The relative path to where ftok will exist in the root namespace. The relative path to where ftok will exist in the root namespace.
choice
prompt "Select memfd implementation"
config LIBC_MEMFD_SHMFS
bool "memfd base on shmfs"
depends on FS_SHMFS
config LIBC_MEMFD_TMPFS
bool "memfd base on tmpfs"
depends on FS_TMPFS
config LIBC_MEMFD_ERROR
bool "memfd return error"
endchoice
config LIBC_MEM_FD_VFS_PATH config LIBC_MEM_FD_VFS_PATH
string "Relative path to memfd storage" string "Relative path to memfd storage"
default "memfd" default "memfd"
depends on FS_TMPFS depends on !LIBC_MEMFD_ERROR
---help--- ---help---
The relative path to where memfd will exist in the tmpfs namespace. The relative path to where memfd will exist in the tmpfs namespace.

View File

@ -32,8 +32,13 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
#define LIBC_MEM_FD_VFS_PATH \ #ifdef CONFIG_LIBC_MEMFD_TMPFS
CONFIG_LIBC_TMPDIR "/" CONFIG_LIBC_MEM_FD_VFS_PATH "/%s" # define LIBC_MEM_FD_VFS_PATH CONFIG_LIBC_TMPDIR "/" CONFIG_LIBC_MEM_FD_VFS_PATH
#else
# define LIBC_MEM_FD_VFS_PATH CONFIG_LIBC_MEM_FD_VFS_PATH
#endif
#define LIBC_MEM_FD_VFS_PATH_FMT LIBC_MEM_FD_VFS_PATH "/%s"
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
@ -41,13 +46,17 @@
int memfd_create(FAR const char *name, unsigned int flags) int memfd_create(FAR const char *name, unsigned int flags)
{ {
#ifdef CONFIG_FS_TMPFS #ifdef CONFIG_LIBC_MEMFD_ERROR
char path[PATH_MAX];
snprintf(path, sizeof(path), LIBC_MEM_FD_VFS_PATH, name);
return open(path, O_RDWR | flags);
#else
set_errno(ENOSYS); set_errno(ENOSYS);
return -1; return -1;
#else
char path[PATH_MAX];
snprintf(path, sizeof(path), LIBC_MEM_FD_VFS_PATH_FMT, name);
# ifdef CONFIG_LIBC_MEMFD_SHMFS
return shm_open(path, O_RDWR | flags, 0660);
# else
return open(path, O_RDWR | flags, 0660);
# endif
#endif #endif
} }