From patchwork Thu Feb 16 00:41:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ackerley Tng X-Patchwork-Id: 57774 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp20398wrn; Wed, 15 Feb 2023 16:43:52 -0800 (PST) X-Google-Smtp-Source: AK7set9u/JE6KcUyLzuIbOX6xQCR+cX5i/awiJnTsZJHhnTc3ywqQ0cBNY0Pnc13Wzqe3s4XcEIn X-Received: by 2002:a05:6a21:3984:b0:c6:b869:5df4 with SMTP id ad4-20020a056a21398400b000c6b8695df4mr484878pzc.3.1676508231875; Wed, 15 Feb 2023 16:43:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676508231; cv=none; d=google.com; s=arc-20160816; b=K1/14eBW42Z7OsesgyYWJ2I5eqo+A7qfSVotzf+hAA2bpDExlWbRqbraDq0LjTMme4 mCrNcfGhiMF8VI9y4k4IFfbBjlHO5KuP4+jcgdtId2/pggyLAfZbgQUQ6PkEMDBdguBy TnN08moxHUX/c6GrseqcaAPdGoipxQTEGXfX7Ze8+zhnw9jmmdBfNMCG+JfK+C9S+hEW qWVX8XINaYc7Hy2/c3ir6SOR8fvQRtG5okonLZMFugF2WAantnhIWw9bWhjqq12VxaNj Y5bS7axJ1L+uf8fpbs8L1RvCwQZWDHG1lPWUsE8EH0ABHJ+MrLnTU/6KEascYg/3XhC1 /wkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=xFJSOOgmL/+0yEbfXc6ryYjQyU1/3hcKBEe5blgULG8=; b=orNi7YhrGUBsSoZHHknNKYRYc947rFfGizW0yLNJJ7ZlousNNmcVOQEnAlaKxXqTWR WOeGZ+JvTbcNpIyHS3xC9U3Gl0rHq/CSprnMWVDU78vvrwdVU7IEuH0cRij2uTbafcQr Z4xPRNV/zK/xodCsFiQj28NL8p8SUpe0exc+6ksQ7T0y3EP9qC2BxvLdtPWNsUvY/kW1 GJGB1Pf87ZGO4H7OoKxHZebRBWzQ64HTgq+lGkrdGETybtuA9rAZeLJCmmGyeHxrkn18 TkpYE8e3tDB3SDuWXelJ8n6gygY4YPVy/MHogPvPG2BhqFyoR1NTmweUDz0Hfv0b7hfN x0vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=cINlncli; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r72-20020a632b4b000000b004faeb3bfabcsi6718pgr.690.2023.02.15.16.43.38; Wed, 15 Feb 2023 16:43:51 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=cINlncli; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229620AbjBPAlo (ORCPT + 99 others); Wed, 15 Feb 2023 19:41:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229619AbjBPAlh (ORCPT ); Wed, 15 Feb 2023 19:41:37 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E496C4390A for ; Wed, 15 Feb 2023 16:41:34 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id w23-20020a63fb57000000b004fba35704a3so150852pgj.13 for ; Wed, 15 Feb 2023 16:41:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=xFJSOOgmL/+0yEbfXc6ryYjQyU1/3hcKBEe5blgULG8=; b=cINlnclit+qIhReE+Kd7SxHPyCpYVP+gHpr/lFZIYMsvtqPRMGMguGhZ+AmtA8dFRc Djw+CXsM0iFzwsMurICuBsTP1scpM+tCEPKY9d7bDxdD5YrTS/xTPWBYVcL8YG0s8lEx aufd0oD+1ETay2cKPepbBkhK2DjZdGGh9+sIqO+Vcbz+DiP+awtJagXFXVVgNQbNgyf4 dLNAd50vYgR4BhTu4f/JtATvZK4wp3PfCPiwj0DiDlPx+B7yfpqr/PRhgYcbi/fNtz/R 06dsNug5WVXeH5PztldqJP7IVZaS+IwS51Y4HyfEGNLXO726iXRISqbDJTUc9PcT6yga oL2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=xFJSOOgmL/+0yEbfXc6ryYjQyU1/3hcKBEe5blgULG8=; b=d4GMcwd905K7jgMlYCutKhoHjmZcPngDLYzRNfYJjpy4+AYsELnF8ijkf+jqD5b1MK gQbqYCXmZLFitu7IFpLFGmdAXEbJl5nSeIWDkDjMzFpKB7eekyS5cLBsgY4Pav6wMPbs Hmi3+UaRad9znV5j7J8vXqaEZQuuUXwd2JITmPkydDmSAmTuCQQii5HhrPINaq/xOBJt doyNnBMzDzmMzbwqi+kRRtF0rfAAHOzcjSOayyBZL8Br3LYtacUPfymfYyorQE4h7WZM rLzt9lgNcVeYW0i0NUTa4P0xdprU6huJQHX96lsEqAmMGgaeD9ODKXFXM/gpub/iq318 P0aw== X-Gm-Message-State: AO0yUKVbSYsDpAFztBnN7Fc1VGWBqc8YRBjXaU3QC0+gxQaNAuxTX+EH CAdmZfcpZrR7szTQTybe68/TVeLwXFMgkqMZPg== X-Received: from ackerleytng-cloudtop.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:1f5f]) (user=ackerleytng job=sendgmr) by 2002:a63:33ce:0:b0:4e7:79c5:d682 with SMTP id z197-20020a6333ce000000b004e779c5d682mr625417pgz.9.1676508094293; Wed, 15 Feb 2023 16:41:34 -0800 (PST) Date: Thu, 16 Feb 2023 00:41:16 +0000 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.39.1.637.g21b0678d19-goog Message-ID: <176081a4817e492965a864a8bc8bacb7d2c05078.1676507663.git.ackerleytng@google.com> Subject: [RFC PATCH 1/2] mm: restrictedmem: Allow userspace to specify mount_path for memfd_restricted From: Ackerley Tng To: kvm@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, qemu-devel@nongnu.org Cc: chao.p.peng@linux.intel.com, aarcange@redhat.com, ak@linux.intel.com, akpm@linux-foundation.org, arnd@arndb.de, bfields@fieldses.org, bp@alien8.de, corbet@lwn.net, dave.hansen@intel.com, david@redhat.com, ddutile@redhat.com, dhildenb@redhat.com, hpa@zytor.com, hughd@google.com, jlayton@kernel.org, jmattson@google.com, joro@8bytes.org, jun.nakajima@intel.com, kirill.shutemov@linux.intel.com, linmiaohe@huawei.com, luto@kernel.org, mail@maciej.szmigiero.name, mhocko@suse.com, michael.roth@amd.com, mingo@redhat.com, naoya.horiguchi@nec.com, pbonzini@redhat.com, qperret@google.com, rppt@kernel.org, seanjc@google.com, shuah@kernel.org, steven.price@arm.com, tabba@google.com, tglx@linutronix.de, vannapurve@google.com, vbabka@suse.cz, vkuznets@redhat.com, wanpengli@tencent.com, wei.w.wang@intel.com, x86@kernel.org, yu.c.zhang@linux.intel.com, Ackerley Tng X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757946295645070330?= X-GMAIL-MSGID: =?utf-8?q?1757946295645070330?= By default, the backing shmem file for a restrictedmem fd is created on shmem's kernel space mount. With this patch, an optional tmpfs mount can be specified, which will be used as the mountpoint for backing the shmem file associated with a restrictedmem fd. This change is modeled after how sys_open() can create an unnamed temporary file in a given directory with O_TMPFILE. This will help restrictedmem fds inherit the properties of the provided tmpfs mounts, for example, hugepage allocation hints, NUMA binding hints, etc. Signed-off-by: Ackerley Tng --- include/linux/syscalls.h | 2 +- include/uapi/linux/restrictedmem.h | 8 ++++ mm/restrictedmem.c | 63 +++++++++++++++++++++++++++--- 3 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 include/uapi/linux/restrictedmem.h diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index f9e9e0c820c5..4b8efe9a8680 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -1056,7 +1056,7 @@ asmlinkage long sys_memfd_secret(unsigned int flags); asmlinkage long sys_set_mempolicy_home_node(unsigned long start, unsigned long len, unsigned long home_node, unsigned long flags); -asmlinkage long sys_memfd_restricted(unsigned int flags); +asmlinkage long sys_memfd_restricted(unsigned int flags, const char __user *mount_path); /* * Architecture-specific system calls diff --git a/include/uapi/linux/restrictedmem.h b/include/uapi/linux/restrictedmem.h new file mode 100644 index 000000000000..9f108dd1ac4c --- /dev/null +++ b/include/uapi/linux/restrictedmem.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_RESTRICTEDMEM_H +#define _UAPI_LINUX_RESTRICTEDMEM_H + +/* flags for memfd_restricted */ +#define RMFD_TMPFILE 0x0001U + +#endif /* _UAPI_LINUX_RESTRICTEDMEM_H */ diff --git a/mm/restrictedmem.c b/mm/restrictedmem.c index c5d869d8c2d8..97f3e2159e8b 100644 --- a/mm/restrictedmem.c +++ b/mm/restrictedmem.c @@ -1,11 +1,12 @@ // SPDX-License-Identifier: GPL-2.0 -#include "linux/sbitmap.h" +#include #include #include #include #include #include #include +#include #include struct restrictedmem { @@ -189,19 +190,20 @@ static struct file *restrictedmem_file_create(struct file *memfd) return file; } -SYSCALL_DEFINE1(memfd_restricted, unsigned int, flags) +static int restrictedmem_create(struct vfsmount *mount) { struct file *file, *restricted_file; int fd, err; - if (flags) - return -EINVAL; - fd = get_unused_fd_flags(0); if (fd < 0) return fd; - file = shmem_file_setup("memfd:restrictedmem", 0, VM_NORESERVE); + if (mount) + file = shmem_file_setup_with_mnt(mount, "memfd:restrictedmem", 0, VM_NORESERVE); + else + file = shmem_file_setup("memfd:restrictedmem", 0, VM_NORESERVE); + if (IS_ERR(file)) { err = PTR_ERR(file); goto err_fd; @@ -223,6 +225,55 @@ SYSCALL_DEFINE1(memfd_restricted, unsigned int, flags) return err; } +static bool is_shmem_mount(struct vfsmount *mnt) +{ + return mnt->mnt_sb->s_magic == TMPFS_MAGIC; +} + +static int restrictedmem_create_from_path(const char __user *mount_path) +{ + int ret; + struct path path; + + ret = user_path_at(AT_FDCWD, mount_path, + LOOKUP_FOLLOW | LOOKUP_MOUNTPOINT, + &path); + if (ret) + return ret; + + if (!is_shmem_mount(path.mnt)) { + ret = -EINVAL; + goto out; + } + + ret = mnt_want_write(path.mnt); + if (unlikely(ret)) + goto out; + + ret = restrictedmem_create(path.mnt); + + mnt_drop_write(path.mnt); +out: + path_put(&path); + + return ret; +} + +SYSCALL_DEFINE2(memfd_restricted, unsigned int, flags, const char __user *, mount_path) +{ + if (flags & ~RMFD_TMPFILE) + return -EINVAL; + + if (flags == RMFD_TMPFILE) { + if (!mount_path) + return -EINVAL; + + return restrictedmem_create_from_path(mount_path); + } else { + return restrictedmem_create(NULL); + } +} + int restrictedmem_bind(struct file *file, pgoff_t start, pgoff_t end, struct restrictedmem_notifier *notifier, bool exclusive) {