From patchwork Fri Feb 21 16:07:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Roy X-Patchwork-Id: 13985868 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D956C021B5 for ; Fri, 21 Feb 2025 16:09:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CBD1C28000A; Fri, 21 Feb 2025 11:09:30 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C6A78280001; Fri, 21 Feb 2025 11:09:30 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AE5E328000A; Fri, 21 Feb 2025 11:09:30 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 8E718280001 for ; Fri, 21 Feb 2025 11:09:30 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 5614EB6CA4 for ; Fri, 21 Feb 2025 16:09:30 +0000 (UTC) X-FDA: 83144436900.14.377160B Received: from smtp-fw-80007.amazon.com (smtp-fw-80007.amazon.com [99.78.197.218]) by imf06.hostedemail.com (Postfix) with ESMTP id 1B5BA180006 for ; Fri, 21 Feb 2025 16:09:27 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=amazon.co.uk header.s=amazon201209 header.b=Q++tzmpf; spf=pass (imf06.hostedemail.com: domain of "prvs=140b82bcc=roypat@amazon.co.uk" designates 99.78.197.218 as permitted sender) smtp.mailfrom="prvs=140b82bcc=roypat@amazon.co.uk"; dmarc=pass (policy=quarantine) header.from=amazon.co.uk ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740154168; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=H8EJounnNVCHbSPBe6inBfgnScOOplPgupbAfsLZMsM=; b=bPruOsxGtD4Sg4A3eANOO53s6ei9BOei8SAn1LsJKCDYJjJyLITeg1ISUttZvyo5VY+vmy iMPM/8llhfEZW3JDi0K9/FDzVpZObBevXTf0izq1XvTwZdAzsSulu3o3mo9X38GSA3J1AO wQ4+8DFpl8nhfA39Kwy4suW+LZ/+zkg= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=amazon.co.uk header.s=amazon201209 header.b=Q++tzmpf; spf=pass (imf06.hostedemail.com: domain of "prvs=140b82bcc=roypat@amazon.co.uk" designates 99.78.197.218 as permitted sender) smtp.mailfrom="prvs=140b82bcc=roypat@amazon.co.uk"; dmarc=pass (policy=quarantine) header.from=amazon.co.uk ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740154168; a=rsa-sha256; cv=none; b=UpotFjnEBIVbq9UM3gDZWDVsAfA8AYYM+QGqUza3GSOv8+cc+1Eq9qJiu7kdU+nls/ac0U uLiHAOu4wzCbRSEXAxPBtJu7PRwj3dRP75KvO97vFOuSvELfkOXcjwGKOZ2/KFSVi5hHRQ d/EAy9mOZqnW1QddlOZ3EbhnJaZkbJA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.co.uk; i=@amazon.co.uk; q=dns/txt; s=amazon201209; t=1740154169; x=1771690169; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=H8EJounnNVCHbSPBe6inBfgnScOOplPgupbAfsLZMsM=; b=Q++tzmpf5uPITA7EaSi+UsrVnYQZnU95Jy1imMoG2dyel+0pXEaVHUIM ssWUQBZGH3G79ibJ/UBR+1iS1c+030YdId5jYGar3pNbNuUXcb5XNcgv9 yRed+iGXLYP+cC7fsnSTY755MFJ6m2LSeMiZ7KIZuvcQ9t5PxjP2a2aeY s=; X-IronPort-AV: E=Sophos;i="6.13,305,1732579200"; d="scan'208";a="379576522" Received: from pdx4-co-svc-p1-lb2-vlan2.amazon.com (HELO smtpout.prod.us-west-2.prod.farcaster.email.amazon.dev) ([10.25.36.210]) by smtp-border-fw-80007.pdx80.corp.amazon.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Feb 2025 16:09:23 +0000 Received: from EX19MTAUWA002.ant.amazon.com [10.0.38.20:37109] by smtpin.naws.us-west-2.prod.farcaster.email.amazon.dev [10.0.55.141:2525] with esmtp (Farcaster) id 78cc7798-b6c2-4e9f-88b9-8c9c17bd29c6; Fri, 21 Feb 2025 16:09:22 +0000 (UTC) X-Farcaster-Flow-ID: 78cc7798-b6c2-4e9f-88b9-8c9c17bd29c6 Received: from EX19D003UWB004.ant.amazon.com (10.13.138.24) by EX19MTAUWA002.ant.amazon.com (10.250.64.202) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1258.39; Fri, 21 Feb 2025 16:09:12 +0000 Received: from EX19MTAUWC002.ant.amazon.com (10.250.64.143) by EX19D003UWB004.ant.amazon.com (10.13.138.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1544.14; Fri, 21 Feb 2025 16:09:12 +0000 Received: from email-imr-corp-prod-pdx-all-2b-c1559d0e.us-west-2.amazon.com (10.25.36.210) by mail-relay.amazon.com (10.250.64.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1258.39 via Frontend Transport; Fri, 21 Feb 2025 16:09:12 +0000 Received: from ua2d7e1a6107c5b.ant.amazon.com (dev-dsk-roypat-1c-dbe2a224.eu-west-1.amazon.com [172.19.88.180]) by email-imr-corp-prod-pdx-all-2b-c1559d0e.us-west-2.amazon.com (Postfix) with ESMTPS id 3843B401F3; Fri, 21 Feb 2025 16:09:05 +0000 (UTC) From: Patrick Roy To: , , CC: Patrick Roy , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v4 01/12] mm: introduce AS_NO_DIRECT_MAP Date: Fri, 21 Feb 2025 16:07:14 +0000 Message-ID: <20250221160728.1584559-2-roypat@amazon.co.uk> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221160728.1584559-1-roypat@amazon.co.uk> References: <20250221160728.1584559-1-roypat@amazon.co.uk> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 1B5BA180006 X-Stat-Signature: a8fs6xruowt4okonmxny3sqj6ifwin1k X-Rspamd-Server: rspam03 X-HE-Tag: 1740154167-517714 X-HE-Meta: U2FsdGVkX19PvahHS+Hsepp5B4QDFeBCSWi5CnPtxwwW82enW5n4sGbaVBn4nFXqMJDVtmc2932hVvnrvRuPYttpRcZGXK9+DUY/VI9WjPosgh2BEjEZklMI7HRiDQ9co2RrdHmjlZYOWBpQO2QyY3TRTWWGmyi7mTtizD7Rks9UHl5dXWiDh+rTzkgpLYqlGysuNcwkYlZ3/UxDS/DxBF3GnrOvpgabc6P525rtaLHcMCXFQnoEFsXedLNQAp86WubHlPYj9UhpABscA8qMz87oXyzs51B0ep3rPwMca8MRMQ+RnSyWs/8TPDhr3haVapCHdl56ALHdl8A9QqeMJXzBfVjvJazoGxgHYzNjjyZCVL1+W+4X5B+9XrzV0ZX2sMH8kxNVBE/HK1EXjRPnGHECYjZeMRXnMVm6QvDA54wP7HQ7OoIp0Un4odnccOhfY3SwePuxzPGmwoPaVv9nOxUI9Se7/kH7r8dAypZpqpYrsfNLQvYo4TdbuPmbrERPyt+xh83jEEPYl0Fhxf4Byk56m6q5bXEBJ38jWCWxL3n6YGAo+SlveGpUYkHP97BYDCPN4KwP2YexTUA7c/rgs0XuaiGETsFo4MCxOj6CHe9N+/T8dUkEmk41aLA6588+EPChR1AtF9Se+jjllG78S6htUjOAG4YK+WdkSi20Q63dVa2LjrrYH3iMM2jVBj0E9JWMlt/ZpD2GOSFJlkq5Bj7lUUxsfKGvtrybnLh1TlhYF94ZBJeO3QTZDjuKZsb7XkP/fIXYH04drV5/q+QuaIjh4hTpkaK0fyRWZwsye1ewegA7L0Js3xq1gnJ2p+P8ZcwxgBsnRoyiLBfsJMQSuAXZT1CPrJDiV1T7DQXaAmBz8916pScN8Il4EbRQ6M2P0Huv4/mVawh6b6gJxiytxibNBrdvVOynYav8VtVc28rnjXsQ8dBp5ZGVTKylwRDi2gSRagmdun+G/5pD1WF AZU9YaZL jEi8iGL0VYP1D6926sscsHXRDjP48+R7o6EiMhpqgSxzXfqOZ9yYryuCsjITa7UyhEdQzzbrjcsgcRLH8DFvYMd34G207QOxKk3a3LTT/JbB3Zaxrq4STMTxc7V3e2gQklzB3PfC1XgG91SCz7OLqTagIwrK2IAmvZMmZ6s8aloideyTZZyevDrSJUKz12R1DJFRSriQOn+YHuXAugbtk+8+YHJqbMph4xqBRJjchW1XnzSoA1bVGXyG7cT+LCEMwPUHH72rvhQxY2S/9PUV14NTu5oSVOWHVQcbB/nbrUrmXDsqiRoK+eLs8OMP4/BdrPDaGCFN3ADpW5khJJGzZ6GTPucOVkCRPefvQnz7LduxMabEBkueapI0iJWfqoWoTF4Y5JOJWMxiTIMMtdhRnS+2VVVtwYwqsUsfJcbXXrt4zllr/fw3wVGO6zbg5KZ8AYS4Vcd6OWKLkDSIxpCkIXYFzsjNLUIRl6qNJ7Zxtod91nfBUJjLcgDWq3JVkXQ/GwESq X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Add AS_NO_DIRECT_MAP for mappings where direct map entries of folios are set to not present . Currently, mappings that match this description are secretmem mappings (memfd_secret()). Later, some guest_memfd configurations will also fall into this category. Reject this new type of mappings in all locations that currently reject secretmem mappings, on the assumption that if secretmem mappings are rejected somewhere, it is precisely because of an inability to deal with folios without direct map entries. Use a new flag instead of overloading AS_INACCESSIBLE (which is already set by guest_memfd) because not all guest_memfd mappings will end up being direct map removed (e.g. in pKVM setups, parts of guest_memfd that can be mapped to userspace should also be GUP-able, and generally not have restrictions on who can access it). Signed-off-by: Patrick Roy --- include/linux/pagemap.h | 16 ++++++++++++++++ lib/buildid.c | 4 ++-- mm/gup.c | 6 +++++- mm/mlock.c | 3 ++- 4 files changed, 25 insertions(+), 4 deletions(-) base-commit: da40655874b54a2b563f8ceb3ed839c6cd38e0b4 diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 47bfc6b1b632..903b41e89cf8 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -210,6 +210,7 @@ enum mapping_flags { AS_STABLE_WRITES = 7, /* must wait for writeback before modifying folio contents */ AS_INACCESSIBLE = 8, /* Do not attempt direct R/W access to the mapping */ + AS_NO_DIRECT_MAP = 9, /* Folios in the mapping are not in the direct map */ /* Bits 16-25 are used for FOLIO_ORDER */ AS_FOLIO_ORDER_BITS = 5, AS_FOLIO_ORDER_MIN = 16, @@ -335,6 +336,21 @@ static inline bool mapping_inaccessible(struct address_space *mapping) return test_bit(AS_INACCESSIBLE, &mapping->flags); } +static inline void mapping_set_no_direct_map(struct address_space *mapping) +{ + set_bit(AS_NO_DIRECT_MAP, &mapping->flags); +} + +static inline bool mapping_no_direct_map(struct address_space *mapping) +{ + return test_bit(AS_NO_DIRECT_MAP, &mapping->flags); +} + +static inline bool vma_is_no_direct_map(const struct vm_area_struct *vma) +{ + return vma->vm_file && mapping_no_direct_map(vma->vm_file->f_mapping); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask; diff --git a/lib/buildid.c b/lib/buildid.c index c4b0f376fb34..80b5d805067f 100644 --- a/lib/buildid.c +++ b/lib/buildid.c @@ -65,8 +65,8 @@ static int freader_get_folio(struct freader *r, loff_t file_off) freader_put_folio(r); - /* reject secretmem folios created with memfd_secret() */ - if (secretmem_mapping(r->file->f_mapping)) + /* reject secretmem folios created with memfd_secret() or guest_memfd() */ + if (secretmem_mapping(r->file->f_mapping) || mapping_no_direct_map(r->file->f_mapping)) return -EFAULT; r->folio = filemap_get_folio(r->file->f_mapping, file_off >> PAGE_SHIFT); diff --git a/mm/gup.c b/mm/gup.c index 3883b307780e..7ddaf93c5b6a 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1283,7 +1283,7 @@ static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags) if ((gup_flags & FOLL_LONGTERM) && vma_is_fsdax(vma)) return -EOPNOTSUPP; - if (vma_is_secretmem(vma)) + if (vma_is_secretmem(vma) || vma_is_no_direct_map(vma)) return -EFAULT; if (write) { @@ -2849,6 +2849,10 @@ static bool gup_fast_folio_allowed(struct folio *folio, unsigned int flags) */ if (check_secretmem && secretmem_mapping(mapping)) return false; + + if (mapping_no_direct_map(mapping)) + return false; + /* The only remaining allowed file system is shmem. */ return !reject_file_backed || shmem_mapping(mapping); } diff --git a/mm/mlock.c b/mm/mlock.c index cde076fa7d5e..07a351491d9d 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -474,7 +474,8 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma, if (newflags == oldflags || (oldflags & VM_SPECIAL) || is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm) || - vma_is_dax(vma) || vma_is_secretmem(vma) || (oldflags & VM_DROPPABLE)) + vma_is_dax(vma) || vma_is_secretmem(vma) || vma_is_no_direct_map(vma) || + (oldflags & VM_DROPPABLE)) /* don't set VM_LOCKED or VM_LOCKONFAULT and don't count */ goto out;