Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150365692
D42709.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D42709.id.diff
View Options
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -101,6 +101,7 @@
lockf.c \
lrand48.c \
memalign.c \
+ memfd_create.c \
mrand48.c \
nftw.c \
nftw-compat11.c \
diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -433,6 +433,7 @@
eventfd_write;
getlogin_r;
memalign;
+ memfd_create;
pthread_getname_np;
scandir_b;
sigandset;
diff --git a/lib/libc/sys/shm_open.c b/lib/libc/gen/memfd_create.c
copy from lib/libc/sys/shm_open.c
copy to lib/libc/gen/memfd_create.c
--- a/lib/libc/sys/shm_open.c
+++ b/lib/libc/gen/memfd_create.c
@@ -34,50 +34,15 @@
#include <errno.h>
#include <fcntl.h>
-#include <limits.h>
-#include <stdlib.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "libc_private.h"
-__weak_reference(shm_open, _shm_open);
-__weak_reference(shm_open, __sys_shm_open);
-
#define MEMFD_NAME_PREFIX "memfd:"
-int
-shm_open(const char *path, int flags, mode_t mode)
-{
-
- return (__sys_shm_open2(path, flags | O_CLOEXEC, mode, 0, NULL));
-}
-
-int
-shm_create_largepage(const char *path, int flags, int psind, int alloc_policy,
- mode_t mode)
-{
- struct shm_largepage_conf slc;
- int error, fd, saved_errno;
-
- fd = __sys_shm_open2(path, flags | O_CREAT, mode, SHM_LARGEPAGE, NULL);
- if (fd == -1)
- return (-1);
-
- memset(&slc, 0, sizeof(slc));
- slc.psind = psind;
- slc.alloc_policy = alloc_policy;
- error = ioctl(fd, FIOSSHMLPGCNF, &slc);
- if (error == -1) {
- saved_errno = errno;
- close(fd);
- errno = saved_errno;
- return (-1);
- }
- return (fd);
-}
-
/*
* The path argument is passed to the kernel, but the kernel doesn't currently
* do anything with it. Linux exposes it in linprocfs for debugging purposes
diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map
--- a/lib/libc/sys/Symbol.map
+++ b/lib/libc/sys/Symbol.map
@@ -409,7 +409,6 @@
fhreadlink;
getfhat;
funlinkat;
- memfd_create;
shm_create_largepage;
shm_rename;
};
diff --git a/lib/libc/sys/shm_open.c b/lib/libc/sys/shm_open.c
--- a/lib/libc/sys/shm_open.c
+++ b/lib/libc/sys/shm_open.c
@@ -34,9 +34,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -45,12 +42,9 @@
__weak_reference(shm_open, _shm_open);
__weak_reference(shm_open, __sys_shm_open);
-#define MEMFD_NAME_PREFIX "memfd:"
-
int
shm_open(const char *path, int flags, mode_t mode)
{
-
return (__sys_shm_open2(path, flags | O_CLOEXEC, mode, 0, NULL));
}
@@ -77,90 +71,3 @@
}
return (fd);
}
-
-/*
- * The path argument is passed to the kernel, but the kernel doesn't currently
- * do anything with it. Linux exposes it in linprocfs for debugging purposes
- * only, but our kernel currently will not do the same.
- */
-int
-memfd_create(const char *name, unsigned int flags)
-{
- char memfd_name[NAME_MAX + 1];
- size_t namelen, *pgs, pgsize;
- struct shm_largepage_conf slc;
- int error, fd, npgs, oflags, pgidx, saved_errno, shmflags;
-
- if (name == NULL) {
- errno = EBADF;
- return (-1);
- }
- namelen = strlen(name);
- if (namelen + sizeof(MEMFD_NAME_PREFIX) - 1 > NAME_MAX) {
- errno = EINVAL;
- return (-1);
- }
- if ((flags & ~(MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB |
- MFD_HUGE_MASK)) != 0) {
- errno = EINVAL;
- return (-1);
- }
- /* Size specified but no HUGETLB. */
- if ((flags & MFD_HUGE_MASK) != 0 && (flags & MFD_HUGETLB) == 0) {
- errno = EINVAL;
- return (-1);
- }
-
- /* We've already validated that we're sufficiently sized. */
- snprintf(memfd_name, NAME_MAX + 1, "%s%s", MEMFD_NAME_PREFIX, name);
- oflags = O_RDWR;
- shmflags = 0;
- if ((flags & MFD_CLOEXEC) != 0)
- oflags |= O_CLOEXEC;
- if ((flags & MFD_ALLOW_SEALING) != 0)
- shmflags |= SHM_ALLOW_SEALING;
- if ((flags & MFD_HUGETLB) != 0)
- shmflags |= SHM_LARGEPAGE;
- else
- shmflags |= SHM_GROW_ON_WRITE;
- fd = __sys_shm_open2(SHM_ANON, oflags, 0, shmflags, memfd_name);
- if (fd == -1 || (flags & MFD_HUGETLB) == 0)
- return (fd);
-
- pgs = NULL;
- npgs = getpagesizes(NULL, 0);
- if (npgs == -1)
- goto clean;
- pgs = calloc(npgs, sizeof(size_t));
- if (pgs == NULL)
- goto clean;
- error = getpagesizes(pgs, npgs);
- if (error == -1)
- goto clean;
- pgsize = (size_t)1 << ((flags & MFD_HUGE_MASK) >> MFD_HUGE_SHIFT);
- for (pgidx = 0; pgidx < npgs; pgidx++) {
- if (pgsize == pgs[pgidx])
- break;
- }
- if (pgidx == npgs) {
- errno = EOPNOTSUPP;
- goto clean;
- }
- free(pgs);
- pgs = NULL;
-
- memset(&slc, 0, sizeof(slc));
- slc.psind = pgidx;
- slc.alloc_policy = SHM_LARGEPAGE_ALLOC_DEFAULT;
- error = ioctl(fd, FIOSSHMLPGCNF, &slc);
- if (error == -1)
- goto clean;
- return (fd);
-
-clean:
- saved_errno = errno;
- close(fd);
- free(pgs);
- errno = saved_errno;
- return (-1);
-}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Apr 1, 2:22 PM (10 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30635430
Default Alt Text
D42709.id.diff (4 KB)
Attached To
Mode
D42709: memfd_create: move implementation to libc/gen
Attached
Detach File
Event Timeline
Log In to Comment