From nobody Thu Dec 21 18:17:45 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SwzDn3vV2z554v1; Thu, 21 Dec 2023 18:17:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SwzDn3S9Cz3Y4v; Thu, 21 Dec 2023 18:17:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1703182665; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mSVagYTHvCGXKGwwsB5jyYxFnp29QffP9+7GRAegtCM=; b=RYb3rK6Mi8y708HjKPpFUhsJ3Dw1s3nMQRgzjl8D0RvT9t39Fq+nDMK7Bqq1E1ogDQbyJ+ DtKIKzQ6tTioSAecrHVGEgp8v+cHiiRnifSjid8ESmE2cArFp1EvmTOLt2IcAsE469yBOt o3xp6xS90bJYK943CQVdj/TZ+wMMwdeobeWvOqyGqmMEMO0snji5PPdymviyuUHPb0bzxn LS/SfskO+0S8J3JP0DDKY0uHcvjHMJH9tl3+B89135zY623NyaoLHOlR6Ii3/pyyvEXcJP sfxVJLVbFt6t1AoMKJQqPEbTtjdNAXBk5EcqChBNxE6ojHP3TFO/SfRwWkqIVw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1703182665; a=rsa-sha256; cv=none; b=odkKdC36/hdckJmVPtFP2o1Gtda2L/k8Qv4ZZL6U0RBBPCToeskpycz4bLJP1ZduDfIa6Y rWYDdmxiRnARLlrM7xpRCND+tbF135Cvx88VTYP4ip06P2d+A805edauBqBD7PHjz8ucXu M8llEMKhXb547IdtDM2ngrUVYNsep1igrOBtJyCGf8phsSmmLIImwhDfoqck+tIAbmic5s VdCQh+wI+5WaTfKkgm/CtMhNwKeV/tWgaHjYA6aNjSTcJailebGjAUserTVMTuG2LvxF1o 1o4mCUPpWrzuKjUxv0CZRqYwfotM23rW0e2N6wldJx62NA9KMBynxYUjcNkF4Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1703182665; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mSVagYTHvCGXKGwwsB5jyYxFnp29QffP9+7GRAegtCM=; b=oMMBHJi2XCDEmvwm1Pgl30L+tjA1ur9jf2v9z5lHq25gBg91kdd1lN8EFRW7Je8U9RWlse dh4KUu7zzYskTAvTF88oJUCdtAvn6lDt1vfVfvC7H/YOMVaK9szGlQ+9Jg37EhJgDwYxcC l7s36SnqCNu0Qvr6d5dpiVlprV8O43JjSlM5QtOnbvJfbb+qcbrSqNzMU9GVVnGUjDPFKy 3i1FiDSo4sB0CbsiCC1Lmqwe7CiKN1d5UzIhEYDT6alJ9EIz9ud0AK06DV7rIrixjR3QGY wlFc4QJN93uqKa31WmzNrJjToAnK892x6Xljd835DTyk327soKkYlc2AJiwomg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SwzDn2XBbzjsR; Thu, 21 Dec 2023 18:17:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3BLIHj7Y034081; Thu, 21 Dec 2023 18:17:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3BLIHjAt034078; Thu, 21 Dec 2023 18:17:45 GMT (envelope-from git) Date: Thu, 21 Dec 2023 18:17:45 GMT Message-Id: <202312211817.3BLIHjAt034078@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Brooks Davis Subject: git: 89ebe0ce1f53 - stable/14 - memfd_create: move implementation to libc/gen List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: brooks X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 89ebe0ce1f539ec7629a15e35f31eef956f1b603 Auto-Submitted: auto-generated The branch stable/14 has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=89ebe0ce1f539ec7629a15e35f31eef956f1b603 commit 89ebe0ce1f539ec7629a15e35f31eef956f1b603 Author: Brooks Davis AuthorDate: 2023-11-27 17:06:33 +0000 Commit: Brooks Davis CommitDate: 2023-12-21 18:13:18 +0000 memfd_create: move implementation to libc/gen Due to memfd_create(3)'s construction of a path to pass to shm_open2(2), it has a much larger than typical dependency footprint for a system call wrapper (the list currently includes calloc, memset, sprintf, and strlen). As such, split it off into its own file under libc/gen to lighten libc/sys's dependency list. Reviewed by: kevans, imp, emaste Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D42709 (cherry picked from commit c3207e2d2554c8e36f9cf5950f8cd52a19fedfd5) --- lib/libc/gen/Makefile.inc | 1 + lib/libc/gen/Symbol.map | 1 + lib/libc/gen/memfd_create.c | 131 ++++++++++++++++++++++++++++++++++++++++++++ lib/libc/sys/Symbol.map | 1 - lib/libc/sys/shm_open.c | 93 ------------------------------- 5 files changed, 133 insertions(+), 94 deletions(-) diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index 655843f03715..3a3aa41c7d59 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -102,6 +102,7 @@ SRCS+= __getosreldate.c \ 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 index 559c0252c338..b68d63b279f3 100644 --- a/lib/libc/gen/Symbol.map +++ b/lib/libc/gen/Symbol.map @@ -433,6 +433,7 @@ FBSD_1.6 { eventfd_write; getlogin_r; memalign; + memfd_create; pthread_getname_np; scandir_b; sigandset; diff --git a/lib/libc/gen/memfd_create.c b/lib/libc/gen/memfd_create.c new file mode 100644 index 000000000000..b26d638656a4 --- /dev/null +++ b/lib/libc/gen/memfd_create.c @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2019 Kyle Evans + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice(s), this list of conditions and the following disclaimer as + * the first lines of this file unmodified other than the possible + * addition of one or more copyright notices. + * 2. Redistributions in binary form must reproduce the above copyright + * notice(s), this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "libc_private.h" + +#define MEMFD_NAME_PREFIX "memfd:" + +/* + * 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); +} diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map index b59ec1858ffd..f17aae279b8d 100644 --- a/lib/libc/sys/Symbol.map +++ b/lib/libc/sys/Symbol.map @@ -409,7 +409,6 @@ FBSD_1.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 index b2c1532133bf..eb3022c857b1 100644 --- a/lib/libc/sys/shm_open.c +++ b/lib/libc/sys/shm_open.c @@ -34,9 +34,6 @@ #include #include -#include -#include -#include #include #include @@ -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 @@ shm_create_largepage(const char *path, int flags, int psind, int alloc_policy, } 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); -}