Page MenuHomeFreeBSD

D42709.id.diff
No OneTemporary

D42709.id.diff

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

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)

Event Timeline