From mboxrd@z Thu Jan 1 00:00:00 1970 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]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 997571098786 for ; Fri, 20 Mar 2026 13:43:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 344CF6B00DF; Fri, 20 Mar 2026 09:43:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2CE2F6B00E1; Fri, 20 Mar 2026 09:43:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 196766B00E2; Fri, 20 Mar 2026 09:43:15 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id F28026B00E1 for ; Fri, 20 Mar 2026 09:43:14 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id BB0D6888FB for ; Fri, 20 Mar 2026 13:43:14 +0000 (UTC) X-FDA: 84566557908.02.7991C8F Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf25.hostedemail.com (Postfix) with ESMTP id 27EB3A0015 for ; Fri, 20 Mar 2026 13:43:13 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gK3cDFvh; spf=pass (imf25.hostedemail.com: domain of ljs@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=ljs@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1774014193; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=v/GF5cWba+z/Oi/4Q2mOyFeXrJeBcJW7/GUHv41K0pA=; b=NDHY17/17jnJK1Z07YPXFM0PKhPC34knM56NbuP15ka9iAwFa5UwNqSSncYu2StGuzET47 VnbW2wqdwX6FLa7RqhMGWH01MVGKVOkJdg0E4K4X06Vp++kH/jMagwL+CSmsm2F2V2bKUi tzF1l2b8PDmQpjq3uWNSqjjTZ7SSvtU= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gK3cDFvh; spf=pass (imf25.hostedemail.com: domain of ljs@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=ljs@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1774014193; a=rsa-sha256; cv=none; b=AC1nTIFulTqjfUuuPvBqcF3uq+wtQl+bn4u8jtUnHwnMYflUTzUxoPqVYjpr3U3rVnCwMo WtrZyceBHIaKlpvklwGIS5bXUQ4fdlgvYc8eKbLRAZOQ3DPezKEFia5ypxOF33jVJJF0Xf yKEZf5gEI9U186soHvAc7xR5nA29Scw= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 575AB61860; Fri, 20 Mar 2026 13:43:12 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ADD9AC2BCB2; Fri, 20 Mar 2026 13:42:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774014192; bh=DyFuJFml7YVo8+/hTBGS9GQt/nh4Xv5125sbhWsDy3w=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=gK3cDFvh7dEcs9L3VC7fj0P6IM5YMZ5Mdb7e1aiwqcjRMNtOygIPq2gaIILFuUtTM vmqMlCjBU/8YqWSrn8GlSD1mbnyZvleBSG4NBi3zJJ69IUJMAI0DEdStZKy+UW0TaS RKgp2laFc8jVyXbKre2JResrGO8+VbexZHvQVEUDnIaYf1/UBEaFtXzWQkyAGtWvAC EC8EOzLMExEfD4QvcP/5iHkGjSQVu/uJiaSVg5HYyjsbtJBNdghidoAN6SiQA2nRu6 m51U9AIWacLgoG0wrPS7G6Dn4d7v54+3rpqqUTSWe8f3RYfxZqr7UHrfRbAGSUWvmM y4Zk3Ov3DoF0w== Date: Fri, 20 Mar 2026 13:42:57 +0000 From: "Lorenzo Stoakes (Oracle)" To: "Vlastimil Babka (SUSE)" Cc: Andrew Morton , David Hildenbrand , "Liam R . Howlett" , Jann Horn , Pedro Falcato , Mike Rapoport , Suren Baghdasaryan , Kees Cook , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Vineet Gupta , Russell King , Catalin Marinas , Will Deacon , Brian Cain , Huacai Chen , WANG Xuerui , Thomas Bogendoerfer , Dinh Nguyen , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H . Peter Anvin" , Richard Weinberger , Anton Ivanov , Johannes Berg , Alexander Viro , Christian Brauner , Jan Kara , Xu Xin , Chengming Zhou , Michal Hocko , Paul Moore , Stephen Smalley , Ondrej Mosnacek , linux-snps-arc@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-hexagon@vger.kernel.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-um@lists.infradead.org, linux-fsdevel@vger.kernel.org, selinux@vger.kernel.org Subject: Re: [PATCH v3 17/23] mm: convert do_brk_flags() to use vma_flags_t Message-ID: References: <981ed1afcd19115432e61778e7d226a36f8f5c2b.1773846935.git.ljs@kernel.org> <1d300b3b-2476-4381-b8df-a680f486b284@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1d300b3b-2476-4381-b8df-a680f486b284@kernel.org> X-Rspam-User: X-Rspamd-Queue-Id: 27EB3A0015 X-Rspamd-Server: rspam08 X-Stat-Signature: aafoych6qsyx3igo3o59rhm6h46tm46m X-HE-Tag: 1774014193-631075 X-HE-Meta: U2FsdGVkX1+NWbihfXJSs4ocf73AIjEH1nyJYe8skEpitj7o3gheJMvfOGCSc2Bh+Gi+YsEgqLZKqxUDZAIYEV1/69ddaPhlh155jprnTgzZGccvZkxCPoS05Lx3jkCz9ocvqvxLGMpEEO6MboYqeExGsFNdMFexw7qoK2daO4+/Ooc47ZltufRKuxctp4WTsgVu/tKb5qbjx3kuf1uUJj0sRwBDxUjBi/0hQEyBUKoUtRWmgAbqW4qJ8BRBOwE0kTulQqVZ0WMv+rhwBpS9SSMwqSIrYWJbHg4Uhcf97Ob2BzjfrEAofcIHHxe0JrWE/nPqSIf7noQBbVhIjWk+Lr0s3mhUH7gN7dz28V9+UjC10SM419Vk4uDvftHihYT82TQEHkcfBQjAeZYl07tJ9yUc+thiD/meQ9Yh7ess1uT/ZGjZlGSa0EKscnAwUOybkIrGfwmR2SHQjt/QOMUgEw8q/L/br4VXtfpHp0NcA/LMI5/LV0Kw2tNYsMFaQ97xulivoHso275IYU27MHdsJICZnByeenc+N0ss4XNXAyGnoEYNfZZJmoHRyiC4a15JekOvcn3x2m+hszG/0v0914io6JSlcszp9sm5Dc9MW8c9v0FB0lBrkk+wE5WLFJaWqYTdTFywWhsdpJiFZLcEX8b7maoNFrUevMgcBgwLhQxKb7WrxfqiF8hn9Y9MW9oIHyZa58TuWBtQYC5RM+zPHa51N+IMcNNn+uv37fmmBmP5Ko7zdRswePPPE19+CmFTOARHXLrxazrTKFq2WaXi//ILZGCHM4q51PjfoOPEkbTOYM5NjX4aSl0nX8OOZHuJ+JNK2YIohs8ZWgfKecFRoayaZfvcmJLJ+aNAhJAdLmUrqfaFC+wylR1v/tc4weHcfmIq7+v0zSb/aOMXN5s6zERFqgn/MjhcEFJzEQLNpWhQick/whpvSN4UIfbPccyfcvQzEtG9gGaHOrPZeSV 9r7dWS+1 3wTQBPWNOYHA8euDohh7yf1SfxAbQRycz3EzV18dg6Wv2btmgYDdbRvc6sIlJjg8H5WPbLz1gy1YgX+/WQBqIxKVZ9NdYKoN2/F7PM6nIvKnUmPIhkzTaQgBADYWE3mTYVjP6corTwo9HVFauGIcUO/EETZHav4/ynYBgFUF+yq/Y/jQ4IOW6dLToLJtiUTviFTp+O65PMUHs9TaRpmq+bVI+x7Bj+4xRhaisuf3X6DBSX7k7U+YdZY72wVPBM6dCuT/BkecDcQni/FPb2SIi9j2vCT6iodDrCSglWFeP2PAxKb0F3kSa8WdnbspmSSIrGU55dmPvrahKY6pPgCRFKLijD8/0lb+eBsTsCaSu2390hb9w9z17OLE5n+DybHBq4QNNyCNsN4t3BMX+pxX9wXV0gFY3e220uGjn Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Fri, Mar 20, 2026 at 10:57:32AM +0100, Vlastimil Babka (SUSE) wrote: > On 3/18/26 16:50, Lorenzo Stoakes (Oracle) wrote: > > In order to be able to do this, we need to change VM_DATA_DEFAULT_FLAGS > > and friends and update the architecture-specific definitions also. > > > > We then have to update some KSM logic to handle VMA flags, and introduce > > VMA_STACK_FLAGS to define the vma_flags_t equivalent of VM_STACK_FLAGS. > > > > We also introduce two helper functions for use during the time we are > > converting legacy flags to vma_flags_t values - vma_flags_to_legacy() and > > legacy_to_vma_flags(). > > Nit: this was done by an earlier patch. Ack will fix up. > > > This enables us to iteratively make changes to break these changes up into > > separate parts. > > > > We use these explicitly here to keep VM_STACK_FLAGS around for certain > > users which need to maintain the legacy vm_flags_t values for the time > > being. > > > > We are no longer able to rely on the simple VM_xxx being set to zero if > > the feature is not enabled, so in the case of VM_DROPPABLE we introduce > > VMA_DROPPABLE as the vma_flags_t equivalent, which is set to > > EMPTY_VMA_FLAGS if the droppable flag is not available. > > > > While we're here, we make the description of do_brk_flags() into a kdoc > > comment, as it almost was already. > > > > We use vma_flags_to_legacy() to not need to update the vm_get_page_prot() > > logic as this time. > > > > Note that in create_init_stack_vma() we have to replace the BUILD_BUG_ON() > > with a VM_WARN_ON_ONCE() as the tested values are no longer build time > > available. > > > > We also update mprotect_fixup() to use VMA flags where possible, though we > > have to live with a little duplication between vm_flags_t and vma_flags_t > > values for the time being until further conversions are made. > > > > Finally, we update the VMA tests to reflect these changes. > > > > Acked-by: Paul Moore [SELinux] > > Signed-off-by: Lorenzo Stoakes (Oracle) > > Acked-by: Vlastimil Babka (SUSE) Thanks! > > More nits below: > > > diff --git a/arch/arm64/include/asm/page.h b/arch/arm64/include/asm/page.h > > index b39cc1127e1f..e25d0d18f6d7 100644 > > --- a/arch/arm64/include/asm/page.h > > +++ b/arch/arm64/include/asm/page.h > > @@ -46,7 +46,12 @@ int pfn_is_map_memory(unsigned long pfn); > > > > #endif /* !__ASSEMBLER__ */ > > > > -#define VM_DATA_DEFAULT_FLAGS (VM_DATA_FLAGS_TSK_EXEC | VM_MTE_ALLOWED) > > +#ifdef CONFIG_ARM64_MTE > > +#define VMA_DATA_DEFAULT_FLAGS append_vma_flags(VMA_DATA_FLAGS_TSK_EXEC, \ > > + VMA_MTE_ALLOWED_BIT) > > I wonder what's the bloat-o-meter impact of these #define's (this > arm64-specific one isn't the only one) being no longer compile-time-constants? I mean there's a precedent for this, but the compiler _should_ figure out this as a constant value, I have repeatedly confirmed that it's good at that in godbolt, via make foo/bar.S etc. So it should have no measureable impact at 64-bit VMA flags anyway, but I can give it a go and see before/after. > > > +#else > > +#define VMA_DATA_DEFAULT_FLAGS VMA_DATA_FLAGS_TSK_EXEC > > +#endif > > > > #include > > > > > --- a/include/linux/mm.h > > +++ b/include/linux/mm.h > > > > > +#define VMA_STACK_FLAGS append_vma_flags(VMA_STACK_DEFAULT_FLAGS, \ > > + VMA_STACK_BIT, VMA_ACCOUNT_BIT) > > + > > +/* Temporary until VMA flags conversion complete. */ > > +#define VM_STACK_FLAGS vma_flags_to_legacy(VMA_STACK_FLAGS) > > + > > #define VM_STARTGAP_FLAGS (VM_GROWSDOWN | VM_SHADOW_STACK) > > > > #ifdef CONFIG_MSEAL_SYSTEM_MAPPINGS > > @@ -536,8 +547,6 @@ enum { > > #define VM_SEALED_SYSMAP VM_NONE > > #endif > > > > -#define VM_STACK_FLAGS (VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT) > > - > > /* VMA basic access permission flags */ > > #define VM_ACCESS_FLAGS (VM_READ | VM_WRITE | VM_EXEC) > > #define VMA_ACCESS_FLAGS mk_vma_flags(VMA_READ_BIT, VMA_WRITE_BIT, VMA_EXEC_BIT) > > @@ -547,6 +556,9 @@ enum { > > */ > > #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP) > > > > +#define VMA_SPECIAL_FLAGS mk_vma_flags(VMA_IO_BIT, VMA_DONTEXPAND_BIT, \ > > + VMA_PFNMAP_BIT, VMA_MIXEDMAP_BIT) > > Should VM_SPECIAL be also redefined using vma_flags_to_legacy()? Could do! It should be a pretty clear indicator this is legacy. > > > + > > /* > > * Physically remapped pages are special. Tell the > > * rest of the world about it: > > @@ -1412,7 +1424,7 @@ static __always_inline void vma_desc_set_flags_mask(struct vm_area_desc *desc, > > * vm_area_desc object describing a proposed VMA, e.g.: > > * > > * vma_desc_set_flags(desc, VMA_IO_BIT, VMA_PFNMAP_BIT, VMA_DONTEXPAND_BIT, > > - * VMA_DONTDUMP_BIT); > > + * VMA_DONTDUMP_BIT); > > Looks like spurious tabs-to-space change inconsistent with other instances. Yeah that's a mistake, will fixup. > > > */ > > #define vma_desc_set_flags(desc, ...) \ > > vma_desc_set_flags_mask(desc, mk_vma_flags(__VA_ARGS__)) > > @@ -4059,7 +4071,6 @@ extern int replace_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file); > > extern struct file *get_mm_exe_file(struct mm_struct *mm); > > extern struct file *get_task_exe_file(struct task_struct *task); > > > > -extern bool may_expand_vm(struct mm_struct *, vm_flags_t, unsigned long npages); > > extern void vm_stat_account(struct mm_struct *, vm_flags_t, long npages); > > > > extern bool vma_is_special_mapping(const struct vm_area_struct *vma, > > diff --git a/mm/internal.h b/mm/internal.h > > index f98f4746ac41..80d8651441a7 100644 > > > diff --git a/mm/mprotect.c b/mm/mprotect.c > > index 9681f055b9fc..eaa724b99908 100644 > > --- a/mm/mprotect.c > > +++ b/mm/mprotect.c > > > @@ -773,19 +778,24 @@ mprotect_fixup(struct vma_iterator *vmi, struct mmu_gather *tlb, > > > > change_protection(tlb, vma, start, end, mm_cp_flags); > > > > - if ((oldflags & VM_ACCOUNT) && !(newflags & VM_ACCOUNT)) > > + if (vma_flags_test(&old_vma_flags, VMA_ACCOUNT_BIT) && > > + !vma_flags_test(&new_vma_flags, VMA_ACCOUNT_BIT)) > > vm_unacct_memory(nrpages); > > > > /* > > * Private VM_LOCKED VMA becoming writable: trigger COW to avoid major > > * fault on access. > > */ > > - if ((oldflags & (VM_WRITE | VM_SHARED | VM_LOCKED)) == VM_LOCKED && > > - (newflags & VM_WRITE)) { > > - populate_vma_page_range(vma, start, end, NULL); > > + if (vma_flags_test(&new_vma_flags, VMA_WRITE_BIT)) { > > + const vma_flags_t mask = > > + vma_flags_and(&old_vma_flags, VMA_WRITE_BIT, > > + VMA_SHARED_BIT, VMA_LOCKED_BIT); > > + > > + if (vma_flags_same(&mask, VMA_LOCKED_BIT)) > > That converts the original logic 1:1, but I wonder if it's now feasible to > write it more obviously as "VMA_LOCKED_BIT must be set, VM_WRITE_BIT and > VM_SHARED_BIT must not" ? Hmm, I'm not sure if I can express this more clearly, it's a pain either way. Could do: if (vma_flags_test(&new_vma_flags, VMA_WRITE_BIT) && !vma_flags_test_any(&old_vma_flags, VMA_WRITE_BIT, VMA_SHARED_BIT)) populate_vma_page_range(vma, start, end, NULL); > > > + populate_vma_page_range(vma, start, end, NULL); > > } > > > > - vm_stat_account(mm, oldflags, -nrpages); > > + vm_stat_account(mm, vma_flags_to_legacy(old_vma_flags), -nrpages); > > vm_stat_account(mm, newflags, nrpages); > > perf_event_mmap(vma); > > return 0; > > > diff --git a/mm/vma.h b/mm/vma.h > > index cf8926558bf6..1f2de6cb3b97 100644 > > --- a/mm/vma.h > > +++ b/mm/vma.h > > > +static inline bool is_data_mapping_vma_flags(const vma_flags_t *vma_flags) > > +{ > > + const vma_flags_t mask = vma_flags_and(vma_flags, > > + VMA_WRITE_BIT, VMA_SHARED_BIT, VMA_STACK_BIT); > > + > > + return vma_flags_same(&mask, VMA_WRITE_BIT); > > Ditto? I may do both as a follow up patch given the series is a pain to rework at this point and I want at least the first version to be like-for-like intentionally. > > > +} > > > > static inline void vma_iter_config(struct vma_iterator *vmi, > > unsigned long index, unsigned long last) > > diff --git a/mm/vma_exec.c b/mm/vma_exec.c > > index 8134e1afca68..5cee8b7efa0f 100644 Thanks, Lorenzo