From nobody Tue Nov 28 17:16:10 2023 X-Original-To: dev-commits-src-main@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 4SfpyM1Q14z52FrH; Tue, 28 Nov 2023 17:16:11 +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 4SfpyL6wmKz3d6f; Tue, 28 Nov 2023 17:16:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701191771; 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=R7uOoKBZ3Y8PeGQNesysY3yqzVUrqa2GPpxrEOSfSII=; b=SpXcmLLvDXD1uVuSE580/u9kgNGxtwlThDHdsklhICCaqyxzQZaqLIsS/3m0pi3TkSuQ/t +CVmzz3tHC12ePbYyI4GF/S/6tbRXP1PHtlCVlSJbGRSSrpcSVYKtZB9WYYNrPWLTUuyKX VrR/4HnXwNPG96sAJ5vpYYsWugVSSBcfj33hqBUjyWoS6c/FfHTtiH2raqspEp4FVXPZ8V gIW/GEfxYHxpcsvGRQdEoUGBiHVGYPtE/7dzgvyAF6H+oh8sWa54xZoRkhGTa3/xUCt1fT BSg6lRJNcgo/hH43pWB3yOsjeBkeypfbj5/lNe1EVZLqMm18t2+X+816SSGrBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701191771; 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=R7uOoKBZ3Y8PeGQNesysY3yqzVUrqa2GPpxrEOSfSII=; b=FD6EV4kFdZHia2kKsxr1BENkt1W0fD8JhZHIRhBUPg58MxUlJKmJCzVnBw97rZTp+aPJ/I 4NCZvhU1jZd3z3/wwYzXzlXIB+qUgvVwf/QOgbKNvXxq0K1QCIW2W1E6S0OF2ihR+YPGDy eNj60bLBWt2YeQ2v0fhz8g3UdYnn8RhGcLjbgEU+1LBOSPuCCv/aQBk21qwim7+horT6rO RsnsE3ITUdHotO0owQ3DeA12j1x47saPExUUTNmf9lOIGORlzQQdnXdoPllX3JCtQdKtqK vvbzBAxparLdQ/cHG63JUpjfHx/lPylHAMrs8bgbpRPwx5kncZ4WbsiDaXtq4g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1701191771; a=rsa-sha256; cv=none; b=e9/OeUL0tLtUVpTMz79Kt4DzsBRESkrgquJBEu+fGoupUQ/PRl3dQUqrhEHfMtF6+1JdHe smRO0z8IN08djtY4GxHSdhhueT/An8p4SdSYKFNvhphMebWBDv8c5Elazezc5lmLMoxyhZ JWfhtrUCHkTAeBrZo+q89J/QfnE+s3V6GyyZBS6r8A+keLUYCxRile3OGwJUgTxMt3cNnW GAspWyd4OuFDGA4g2B9T5a2+MqsO4n3r+38lsIqbrLrb15To/Uji6o61V3zb8C9QxrL0vH pLSkRIsw15jl4goZOMP1AV20IicMoO1cYomNtEEtmE6/abqStpacXyzWVoz0PA== 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 4SfpyL5nlPzWfB; Tue, 28 Nov 2023 17:16:10 +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 3ASHGAZH095368; Tue, 28 Nov 2023 17:16:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3ASHGA7N095365; Tue, 28 Nov 2023 17:16:10 GMT (envelope-from git) Date: Tue, 28 Nov 2023 17:16:10 GMT Message-Id: <202311281716.3ASHGA7N095365@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Brooks Davis Subject: git: c3207e2d2554 - main - memfd_create: move implementation to libc/gen List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: c3207e2d2554c8e36f9cf5950f8cd52a19fedfd5 Auto-Submitted: auto-generated The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=c3207e2d2554c8e36f9cf5950f8cd52a19fedfd5 commit c3207e2d2554c8e36f9cf5950f8cd52a19fedfd5 Author: Brooks Davis AuthorDate: 2023-11-27 17:06:33 +0000 Commit: Brooks Davis CommitDate: 2023-11-28 17:09:27 +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 --- 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 5cb471fe4672..f657bd949cb7 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -101,6 +101,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); -}