From nobody Sat Jul 26 21:31:49 2025 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 4bqHxf0jPSz62Vp1; Sat, 26 Jul 2025 21:31:50 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bqHxd6z37z3rtn; Sat, 26 Jul 2025 21:31:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753565510; 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=gFKMAjJAyoDqXdVfeRLeIS/znKpv+DgKSW1WeIF5Pp8=; b=EzyBRCTnW0KDFICvjgoiF8DnIuPXHqn15ZbhB6qvRnYM2tiY4fyLhFQmzIAres/IzZk4X6 NPXL4uPi9rcn0q+IFhQ52PCjqjK7jp5bMAGfKDjf1mHfo87cavmTj5xfhooaRxmaRw37XO N84zHDCNeUS5PCA/3pCsFbDm4PvtAobjBLyWGGqs0Ye3a75XmW8athluAw8KIDSkLxuCzX XvepP+iX2Zm4I3wx03di6x0TB39EChTwdhnA8jIxt+T7PHrTr6pkK3YtSRupsN2c236jKl q83NPPJuyYtK3gjycMLXtVaDS/q2H/+ZEBm3WuiavK4Zlwks0fOqOQyCtHZkKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753565510; 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=gFKMAjJAyoDqXdVfeRLeIS/znKpv+DgKSW1WeIF5Pp8=; b=xFTzQgvy4PRmqW8KHv83RXT+fcgEpkFKOzRYCHNZ8uXrD0a2mTy9zJ7XhPgEBa7SyCFMgX AnoFSBfBqv5iMEUEPlwwgzq84Vxi6wdkXSCtVf68xfzN7zoUpZ0RXHmqZLTg4YBwYWPe2j pvWWmj/CXC5UrZcynbzLZg0ZMAuioNI51FwH7qW3d08jDCPEoPkxbYHEMm2hGvtglpvPKm rx+Qb2kVgdT/OX7LQUJAxv0IOvWTuzLkYRIIQwoi+UJgyip8EgwbM9ToVvp8+B1zb5bNzR t1WRPTGcRow5JMMypBwMZYjctWwKy/tauMCU+jE2zuAfcSdCj3HP9NCJOTatvQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1753565510; a=rsa-sha256; cv=none; b=iuZqji2Av+C4YK1ZkDRkpGO68ZWjc/+PhRYlkGUL1Qqj5io8KXN7ON6h2B/ict/cm09Az3 8zU6tJM02zHomZlm/JxF0QPIOsiQcElzl0FJUlPGFLKe/3q5pcnQAOVGvyb5Hzb1e96t3K y/RJAFv3SBz1Jgr8mV9gHvJk+qMvYcXz7pf0zW8k9g6BYVr4GLfPohkBhXSqPITQbTWETU CgxI/vWAGhwyfj4Vna1LU516s0USD+Yn8NoZiHOT17ivXqvAFl+jg+WiWHNDwdGdaRPv8c jLk+hDOCkh/JvGspTmMleYCq00s1HrRFW3hV/FY1QmnJ8HZLUOZtcpnI6mRffA== 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 4bqHxd5yv3zmrS; Sat, 26 Jul 2025 21:31:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 56QLVnAU065722; Sat, 26 Jul 2025 21:31:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56QLVnbB065719; Sat, 26 Jul 2025 21:31:49 GMT (envelope-from git) Date: Sat, 26 Jul 2025 21:31:49 GMT Message-Id: <202507262131.56QLVnbB065719@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kyle Evans Subject: git: 6b49d1194899 - main - kern: allow kern_shm_open2 of an anonymous preconstructed shmfd 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: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6b49d119489944abbef87b5892c21f65e7a7055e Auto-Submitted: auto-generated The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=6b49d119489944abbef87b5892c21f65e7a7055e commit 6b49d119489944abbef87b5892c21f65e7a7055e Author: Kyle Evans AuthorDate: 2025-07-14 23:28:35 +0000 Commit: Kyle Evans CommitDate: 2025-07-26 21:31:40 +0000 kern: allow kern_shm_open2 of an anonymous preconstructed shmfd The motivation here is for future changes to the coredump code to be able to build up a coredump into a shmfd instead of a vnode, which then gets tapped out to userland via a character device. This also opens up the possibility that it's useful for the kernel to be able to construct a shmfd and pass it out to a process that shouldn't need to write to it. Reviewed by: emaste, kib, markj Differential Revision: https://reviews.freebsd.org/D51336 --- sys/compat/linux/linux_file.c | 2 +- sys/kern/uipc_shm.c | 50 +++++++++++++++++++++++++++++-------------- sys/sys/syscallsubr.h | 3 ++- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 86834a7ecea8..a4be5313aa96 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -1792,7 +1792,7 @@ linux_memfd_create(struct thread *td, struct linux_memfd_create_args *args) if ((flags & MFD_ALLOW_SEALING) != 0) shmflags |= SHM_ALLOW_SEALING; return (kern_shm_open2(td, SHM_ANON, oflags, 0, shmflags, NULL, - memfd_name)); + memfd_name, NULL)); } int diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index 6f83b875a6b6..85fe48ddd466 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -1134,10 +1134,10 @@ shm_doremove(struct shm_mapping *map) int kern_shm_open2(struct thread *td, const char *userpath, int flags, mode_t mode, - int shmflags, struct filecaps *fcaps, const char *name __unused) + int shmflags, struct filecaps *fcaps, const char *name __unused, + struct shmfd *shmfd) { struct pwddesc *pdp; - struct shmfd *shmfd; struct file *fp; char *path; void *rl_cookie; @@ -1214,23 +1214,41 @@ kern_shm_open2(struct thread *td, const char *userpath, int flags, mode_t mode, if (error != 0) goto outnofp; - /* A SHM_ANON path pointer creates an anonymous object. */ + /* + * A SHM_ANON path pointer creates an anonymous object. We allow other + * parts of the kernel to pre-populate a shmfd and then materialize an + * fd for it here as a means to pass data back up to userland. This + * doesn't really make sense for named shm objects, but it makes plenty + * of sense for anonymous objects. + */ if (userpath == SHM_ANON) { - /* A read-only anonymous object is pointless. */ - if ((flags & O_ACCMODE) == O_RDONLY) { - error = EINVAL; - goto out; - } - shmfd = shm_alloc(td->td_ucred, cmode, largepage); - if (shmfd == NULL) { - error = ENOMEM; - goto out; + if (shmfd != NULL) { + shm_hold(shmfd); + } else { + /* + * A read-only anonymous object is pointless, unless it + * was pre-populated by the kernel with the expectation + * that a shmfd would later be created for userland to + * access it through. + */ + if ((flags & O_ACCMODE) == O_RDONLY) { + error = EINVAL; + goto out; + } + shmfd = shm_alloc(td->td_ucred, cmode, largepage); + if (shmfd == NULL) { + error = ENOMEM; + goto out; + } + + shmfd->shm_seals = initial_seals; + shmfd->shm_flags = shmflags; } - shmfd->shm_seals = initial_seals; - shmfd->shm_flags = shmflags; } else { fnv = fnv_32_str(path, FNV1_32_INIT); sx_xlock(&shm_dict_lock); + + MPASS(shmfd == NULL); shmfd = shm_lookup(path, fnv); if (shmfd == NULL) { /* Object does not yet exist, create it if requested. */ @@ -2173,7 +2191,7 @@ kern_shm_open(struct thread *td, const char *path, int flags, mode_t mode, struct filecaps *caps) { - return (kern_shm_open2(td, path, flags, mode, 0, caps, NULL)); + return (kern_shm_open2(td, path, flags, mode, 0, caps, NULL, NULL)); } /* @@ -2191,7 +2209,7 @@ sys_shm_open2(struct thread *td, struct shm_open2_args *uap) { return (kern_shm_open2(td, uap->path, uap->flags, uap->mode, - uap->shmflags, NULL, uap->name)); + uap->shmflags, NULL, uap->name, NULL)); } int diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index fd183ffbc7a4..8237165b84ce 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -60,6 +60,7 @@ struct rusage; struct sched_param; struct sembuf; union semun; +struct shmfd; struct sockaddr; struct spacectl_range; struct stat; @@ -337,7 +338,7 @@ int kern_shm_open(struct thread *td, const char *userpath, int flags, mode_t mode, struct filecaps *fcaps); int kern_shm_open2(struct thread *td, const char *path, int flags, mode_t mode, int shmflags, struct filecaps *fcaps, - const char *name); + const char *name, struct shmfd *shmfd); int kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg); int kern_shmctl(struct thread *td, int shmid, int cmd, void *buf,