From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 095F037AA82; Fri, 10 Jul 2026 20:17:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714677; cv=none; b=GGK4aXb8IWLueoeCkE7NRmrl5LQFPw2d4L4htVMApGoKvLXOIF/9QiGuhTAKYKecmRVyRGXK57a84SwWytF+0mSVUoMceIf867Kbq/hxMO5hqp+vhhEoPbrWslofp1f3uXqGeiZXG/KlBG3NYustBzVgVuvYfAR+E7R95F2G+Lk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714677; c=relaxed/simple; bh=TWkwoMMp5D7fMtC0wshgLRRXywv8s28zC1aXHfR5Epo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DhH4eXZpl9L0PcDbMA92uSkVP8TA8VMm9wlW2cuitYbhEXa5rkcyjxHWkjQ5QG/Vwh7CRTJAw/BmnztFhzPo87G0TBkLK6ozpCbEe5HwcbOUqOQ66RTfS6bgYzizUV371OvuA+IUDDROJNZ2ef6RLx6FKPY8XzKmkZhuZJ9boik= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=crprP81d; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="crprP81d" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E80C21F00A3A; Fri, 10 Jul 2026 20:17:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714675; bh=HxpK9XX46eW0L+tqH28ZLcMFfpOyeN/E3/HTbuiL4M0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=crprP81d+96c/TTwiZmsO+H7tWi1mNaoxDlqQRcSYZuQqqkg1QzqPt0iFZfttiZK+ t4WwILxuWLOXMO+/GKkcB6ADW67x/mjMGunr/40MELjJXsiE47AXvXvcbrM+Vx4Cul j8JCYVYPrR9sY+nQK75daNWNTYL4FEQtE5ns/5S1h27Vc+3t08PouRetPzb7JDKC5i daYQ5g0xkNxJDzAB2NgoXYWVT+B/NiJ59t8xKUhG7MwKImCSkPEbqyDKoutKTBdwY/ +NbNWFuSgmoYmeulGhIqH+uasLK9U97/UzQP8yowhigWXgAJhc53ZbipSOIbjNJikQ uAEHj6Dpl8Brg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:42 +0100 Subject: [PATCH v2 01/33] mm: move vma_start_pgoff() into mm.h and clean up Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-1-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2900; i=ljs@kernel.org; h=from:subject:message-id; bh=TWkwoMMp5D7fMtC0wshgLRRXywv8s28zC1aXHfR5Epo=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg62mKuRVT1v09eEFm5LHf4uv9XS48Nw4/CP+8KTV8 jk2Jm+md5SyMIhxMciKKbI8/yK+P0gkbF7nBX83mDmsTCBDGLg4BWAiz88w/OFb6tCz94OiVED+ k957fJLbm8tad3CHBZT0eOnuPfJ0x3xGht2H2C/WLgrb3V/0YZ7I7r2Tp79WjOxU1Yy53zet9Mf 8DCYA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 vma_last_pgoff() already lives there, so it's a bit odd to keep vma_start_pgoff() in mm/interval_tree.c. Move them together. These each return unsigned long, which pgoff_t is typedef'd to. Make this consistent and have these functions return pgoff_t instead. Additionally, express vma_last_pgoff() in terms of vma_start_pgoff(), since we wrap the vma->vm_pgoff access, we may as well use it here. Also while we're here, const-ify the VMA and cleanup a bit. Also update the VMA userland tests to reflect the change. No functional change intended. Reviewed-by: Gregory Price Acked-by: David Hildenbrand (Arm) Reviewed-by: Pedro Falcato Reviewed-by: Vlastimil Babka (SUSE) Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Liam R. Howlett (Oracle) Reviewed-by: Zi Yan --- include/linux/mm.h | 9 +++++++-- mm/interval_tree.c | 5 ----- tools/testing/vma/include/dup.h | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 25e669632d2c..09b06d8fea74 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4307,9 +4307,14 @@ static inline unsigned long vma_pages(const struct v= m_area_struct *vma) return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } =20 -static inline unsigned long vma_last_pgoff(struct vm_area_struct *vma) +static inline pgoff_t vma_start_pgoff(const struct vm_area_struct *vma) { - return vma->vm_pgoff + vma_pages(vma) - 1; + return vma->vm_pgoff; +} + +static inline pgoff_t vma_last_pgoff(const struct vm_area_struct *vma) +{ + return vma_start_pgoff(vma) + vma_pages(vma) - 1; } =20 static inline unsigned long vma_desc_size(const struct vm_area_desc *desc) diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 32bcfbfcf15f..344d1f5946c7 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -10,11 +10,6 @@ #include #include =20 -static inline unsigned long vma_start_pgoff(struct vm_area_struct *v) -{ - return v->vm_pgoff; -} - INTERVAL_TREE_DEFINE(struct vm_area_struct, shared.rb, unsigned long, shared.rb_subtree_last, vma_start_pgoff, vma_last_pgoff, /* empty */, vma_interval_tree) diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/du= p.h index bf26b3f48d3a..668650067c7c 100644 --- a/tools/testing/vma/include/dup.h +++ b/tools/testing/vma/include/dup.h @@ -1301,6 +1301,11 @@ static inline unsigned long vma_pages(const struct v= m_area_struct *vma) return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } =20 +static inline pgoff_t vma_start_pgoff(const struct vm_area_struct *vma) +{ + return vma->vm_pgoff; +} + static inline int vfs_mmap_prepare(struct file *file, struct vm_area_desc = *desc) { return file->f_op->mmap_prepare(desc); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DE01377566; Fri, 10 Jul 2026 20:18:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714700; cv=none; b=NmHUKS5/YKnTg6PZibaBBINLc3VhyBwBdIu8ShSyrZGouEOqJYH/WX1pfFYYCU3Z2/jtB+9CaC4h8n4dZZXW1xjyoqqMpXNUfGla5a+jFgASiJEoaDWVjFTAb7Ba5T3PxG5uK0DvotFfq8FmaIZCkIbBSlWkcebdO8KSOyARoWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714700; c=relaxed/simple; bh=Znpqu3j3n6WWkTacPqLkxSLWmIlM9cO5JY2coWFa+KE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lZUMqYNNuAu2QnKaZZ7RZzBs2F9YMmFgmZBlMZ9pxZpYmoZNOXzIZH1f2lQEbf/OwMhAx7nymMSNW77UXM++Rm6j/oJBhy18xlFpPmYPGCbo9xrvQ9mREwZ3UIl89OKwk+w2xRoPx5T1ukFxXXwRtVx140bM/vINs0MaKXnx3zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k9x6bBu/; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k9x6bBu/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09CF71F000E9; Fri, 10 Jul 2026 20:17:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714698; bh=v6HrE7a8m/FBNduG5UmQu6NM/Zihxq3N+Us3HpMrWf0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=k9x6bBu/aDqJclWvIhrAFa2Km3ddMPBAtjIwTK7nSswlBruWli5QcWTat4njQBiqs UVhnCczvDERlE2oktg41MRtRbDgpqFYyTvHyJEOwdN52fR0U9K7S4eEI+ivMMZHU/E s94TNQ/hFEIbzNFUeBRcARELcVpmMKv/c9ix0LYmMpx+ruxTa9urMXg6uzpqox4EYO awUT6IL8oiBtUsMRD+pvShNA/uBh90ZipA/LcmkSRwid0fnX76nmL6Z2mZUnWjHITr 8DDWg5TjJX1NwwQDiG4pGwsGAdk15hgBvBm5kFxh6llBtXDzCykxf9jf0N/TeK7v2a BiSwLHeUIJfNA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:43 +0100 Subject: [PATCH v2 02/33] mm: add kdoc comments for vma_start/last_pgoff() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-2-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2376; i=ljs@kernel.org; h=from:subject:message-id; bh=Znpqu3j3n6WWkTacPqLkxSLWmIlM9cO5JY2coWFa+KE=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg63ONn+VZLkzqWnvRdMkgYMTTO3mt5h3KcYekJN7x fl+5a25HaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZhIrxPDP8P9uUlGDz4+PJOx 4lprrMA30daSzh3bt045v8PEdtedDxoM/1Me7yloK9X/Z3C//Zau7XbuQmYP/4Xp92ZFPjFWLy3 bwQgA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Describe what vma_start_pgoff() and vma_last_pgoff() actually provide in detail. This is in order that we can differentiate this between functions that will be added in a subsequent patch which provide a different page offset. We go to lengths to describe the edge cases that can be run into here. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Liam R. Howlett (Oracle) Reviewed-by: Zi Yan --- include/linux/mm.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index 09b06d8fea74..abac72785277 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4307,11 +4307,41 @@ static inline unsigned long vma_pages(const struct = vm_area_struct *vma) return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } =20 +/** + * vma_start_pgoff() - Get the page offset of the start of @vma + * @vma: The VMA whose page offset is required. + * + * If the VMA is file-backed, this is the page offset into the file. + * + * If @vma is anonymous, this is the virtual page offset of the start of t= he + * VMA - if unfaulted, then vma->vm_start >> PAGE_SHIFT, if faulted then t= he + * virtual page offset at the time of first fault. + * + * If @vma is a MAP_PRIVATE file-backed mapping, then this returns the + * page offset within the file. + * + * Edge cases: nommu does not abide by these, MAP_PRIVATE-/dev/zero satisf= ies + * vma_is_anonymous() but has file-backed page offset, and MAP_PRIVATE-pfn= map + * regions have their page offset set to the first PFN in the range. + * + * Returns: The page offset of the start of @vma. + */ static inline pgoff_t vma_start_pgoff(const struct vm_area_struct *vma) { return vma->vm_pgoff; } =20 +/** + * vma_last_pgoff() - Get the page offset of the last page in @vma + * @vma: The VMA whose last page offset is required. + * + * This returns the last page offset contained within @vma. + * + * See the description of vma_start_pgoff() for a description of VMA page + * offsets. + * + * Returns: The last page offset of @vma. + */ static inline pgoff_t vma_last_pgoff(const struct vm_area_struct *vma) { return vma_start_pgoff(vma) + vma_pages(vma) - 1; --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF722394793; Fri, 10 Jul 2026 20:18:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714723; cv=none; b=XFJkWhPGLbIrfKZkRPuxQAoySAlXkdI6L04d08aqEL5LJJ4qlfD9gyeoyfNv+v3qwUH2J016USrTRvpj3s9uT1Y7d2kh19hVNZX+DAUjS5QqN0imE31PGjyV3udTG4PmXWKtOFvn9fPLHhRcBo6kHcUtKhbQIIIh39sIMnnb+aE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714723; c=relaxed/simple; bh=t8dkzQqXmue3OqugoX734wBWe/TkjwvXfzJD/QIoxFA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lDeW7YbzEWQJ2jLGrp/BNgXtBtJYD0vRY2NmTr6fcikkiRQ2x2pYWgzRDpc4ObMxIKK2tSQJBjKVBteTRXYl9HVuA6XINdRmQOh+qsYiAf/qLBYG98QlY7Y6ORtI6jjpeCNwYxUEh8UMu88fx4uqxRI6oj8qb0KCGHr6Ka29yZ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ut/jbAuZ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ut/jbAuZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C9B41F00A3A; Fri, 10 Jul 2026 20:18:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714721; bh=PmdsrY2tdwYxD0uvAcRTlLh9YiiTJVFUYVkIaWXdB+I=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Ut/jbAuZXYxfsPHDRbFG6AeYVoHfsMIi4RxevO30ikC2cXs/E8agujTPs3qJUINSg yYDdGP7J0SUmvYO63kOXh2z/L9hG8u5g7MHtuW0YfER/BpjKuMhgXjexnNCzjcv/ln VnOAWV3uW7KoliqwsBges9xe2WqrPKliwA294ZBCxF0pXsvujILvisVfI7ekVXl+EQ Z2s6qaiaghbmUvgw07AZmPOxnbKWpytV69wR0saxrOc2Rtxox2KidC0z+lYmGeWkh9 094VrJuJl2I4KGfxsnR1HSxyrqtLTIeJ/4bX4EPZkK7JTF7PwBAkviNWxcolJMEFWF hI700zBKOBohA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:44 +0100 Subject: [PATCH v2 03/33] tools/testing/vma: use vma_start_pgoff() in merge tests Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-3-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7049; i=ljs@kernel.org; h=from:subject:message-id; bh=t8dkzQqXmue3OqugoX734wBWe/TkjwvXfzJD/QIoxFA=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg60Snb1XWu/ZYcRmVV06yVxlXtOPOQLHsuzTDvwLt yq10sjrKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwESaLBkZ9s649GV6ldT5BxJc 1YF6TBY8E/jEUizPnmstcdBz/6jezfDfzcbaj0+/8kRMRdoSdrul2w5n/Hq/MWp76LXfnyWfbFv ACAA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Now we have the vma_start_pgoff() helper, update the merge tests to make use of it for consistency. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Liam R. Howlett (Oracle) Reviewed-by: Zi Yan --- tools/testing/vma/tests/merge.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tools/testing/vma/tests/merge.c b/tools/testing/vma/tests/merg= e.c index 03b6f9820e0a..f8666a755749 100644 --- a/tools/testing/vma/tests/merge.c +++ b/tools/testing/vma/tests/merge.c @@ -118,7 +118,7 @@ static bool test_simple_merge(void) =20 ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x3000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_FLAGS_SAME_MASK(&vma->flags, vma_flags); =20 detach_free_vma(vma); @@ -150,7 +150,7 @@ static bool test_simple_modify(void) =20 ASSERT_EQ(vma->vm_start, 0x1000); ASSERT_EQ(vma->vm_end, 0x2000); - ASSERT_EQ(vma->vm_pgoff, 1); + ASSERT_EQ(vma_start_pgoff(vma), 1); =20 /* * Now walk through the three split VMAs and make sure they are as @@ -162,7 +162,7 @@ static bool test_simple_modify(void) =20 ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x1000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); =20 detach_free_vma(vma); vma_iter_clear(&vmi); @@ -171,7 +171,7 @@ static bool test_simple_modify(void) =20 ASSERT_EQ(vma->vm_start, 0x1000); ASSERT_EQ(vma->vm_end, 0x2000); - ASSERT_EQ(vma->vm_pgoff, 1); + ASSERT_EQ(vma_start_pgoff(vma), 1); =20 detach_free_vma(vma); vma_iter_clear(&vmi); @@ -180,7 +180,7 @@ static bool test_simple_modify(void) =20 ASSERT_EQ(vma->vm_start, 0x2000); ASSERT_EQ(vma->vm_end, 0x3000); - ASSERT_EQ(vma->vm_pgoff, 2); + ASSERT_EQ(vma_start_pgoff(vma), 2); =20 detach_free_vma(vma); mtree_destroy(&mm.mm_mt); @@ -209,7 +209,7 @@ static bool test_simple_expand(void) =20 ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x3000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); =20 detach_free_vma(vma); mtree_destroy(&mm.mm_mt); @@ -231,7 +231,7 @@ static bool test_simple_shrink(void) =20 ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x1000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); =20 detach_free_vma(vma); mtree_destroy(&mm.mm_mt); @@ -324,7 +324,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x4000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 3); @@ -343,7 +343,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x5000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 3); @@ -364,7 +364,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0x6000); ASSERT_EQ(vma->vm_end, 0x9000); - ASSERT_EQ(vma->vm_pgoff, 6); + ASSERT_EQ(vma_start_pgoff(vma), 6); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 3); @@ -384,7 +384,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x9000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 2); @@ -404,7 +404,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0xa000); ASSERT_EQ(vma->vm_end, 0xc000); - ASSERT_EQ(vma->vm_pgoff, 0xa); + ASSERT_EQ(vma_start_pgoff(vma), 0xa); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 2); @@ -423,7 +423,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_TRUE(merged); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0xc000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 1); @@ -443,7 +443,7 @@ static bool __test_merge_new(bool is_sticky, bool a_is_= sticky, bool b_is_sticky, ASSERT_NE(vma, NULL); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0xc000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); =20 detach_free_vma(vma); @@ -805,7 +805,7 @@ static bool test_vma_merge_new_with_close(void) ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x5000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_EQ(vma->vm_ops, &vm_ops); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 2); @@ -865,7 +865,7 @@ static bool __test_merge_existing(bool prev_is_sticky, = bool middle_is_sticky, bo ASSERT_EQ(vma_next->anon_vma, &dummy_anon_vma); ASSERT_EQ(vma->vm_start, 0x2000); ASSERT_EQ(vma->vm_end, 0x3000); - ASSERT_EQ(vma->vm_pgoff, 2); + ASSERT_EQ(vma_start_pgoff(vma), 2); ASSERT_TRUE(vma_write_started(vma)); ASSERT_TRUE(vma_write_started(vma_next)); ASSERT_EQ(mm.map_count, 2); @@ -931,7 +931,7 @@ static bool __test_merge_existing(bool prev_is_sticky, = bool middle_is_sticky, bo ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma); ASSERT_EQ(vma->vm_start, 0x6000); ASSERT_EQ(vma->vm_end, 0x7000); - ASSERT_EQ(vma->vm_pgoff, 6); + ASSERT_EQ(vma_start_pgoff(vma), 6); ASSERT_TRUE(vma_write_started(vma_prev)); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 2); @@ -1416,7 +1416,7 @@ static bool test_merge_extend(void) ASSERT_EQ(vma_merge_extend(&vmi, vma, 0x2000), vma); ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x4000); - ASSERT_EQ(vma->vm_pgoff, 0); + ASSERT_EQ(vma_start_pgoff(vma), 0); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(mm.map_count, 1); =20 @@ -1456,7 +1456,7 @@ static bool test_expand_only_mode(void) ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma->vm_start, 0x3000); ASSERT_EQ(vma->vm_end, 0x9000); - ASSERT_EQ(vma->vm_pgoff, 3); + ASSERT_EQ(vma_start_pgoff(vma), 3); ASSERT_TRUE(vma_write_started(vma)); ASSERT_EQ(vma_iter_addr(&vmi), 0x3000); vma_assert_attached(vma); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D226395AC2; Fri, 10 Jul 2026 20:19:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714746; cv=none; b=dKIyLoiWQKTGtMJNWKsLOy1/X0GqRKlUs0kPpxrNXGJtIG57ORGgBdNGbg8d62fOHyFciW3T5I10U1fhj9SNGLtOt8YgV+Td8Ffg+IaYXpbM65JYeNqAOKXeuuPL27KnONCNUcaSIwH4iSep2vs5UBv1FBMY1Aqc8F8o3E8zxns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714746; c=relaxed/simple; bh=CFZAjloP4OpDX/vjHQ9xfGU3kS1+MIW18Lzf2dxH2BQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ecwEAqf+xTatpjdOlp7PC6G46aBAifhr8nkRr1WvStjMXWH4a1axYMF5MSrunDarmf50lujhjOyF6S85dwR17wVMiNN2OZjB8Arz1nhQLKLp3tW052CYHvV244hVvMuUj2XLrU/uvA5bpWdj1aBblFQAzL89x/nbGNUvyikTVYY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PNLB4wzm; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PNLB4wzm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 322B91F000E9; Fri, 10 Jul 2026 20:18:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714744; bh=5hYSYZL26i46R1YNC969ZGJ/HD8KnaWEcgglVNhE+Dg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=PNLB4wzmcFTj3lyqpCjpFNseunRPOUiWwMslZHwgnXN/dz1H6bINuUrT04kt5iEp1 +NIb6HuWlNuqv89DVOB740oeyMjE3pCofc2ChzUc2YR4KtFhvnDcCHt+4GCE+gyXWn 5N+MnWj5rOmm6UXVmu60Jc6I2MfPK0J7bSg9uQcFU6wtGwwH23rkV+6hwUKmgWbLk+ Tctr26pEiWgizGIADOVEl3UfVfSGQDtV+0/95Ja8Pr6D6O/cbPUvsrZRSsYIjPhVRH yBJazCl6C5Rhic0/GCGXO+3WaXAvZ1vidl5uvgn9Xm7ag6HsGdXlfnoynuPxHBZ7uA zki2RHAqu/Mww== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:45 +0100 Subject: [PATCH v2 04/33] mm: introduce and use vma_end_pgoff() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-4-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2641; i=ljs@kernel.org; h=from:subject:message-id; bh=CFZAjloP4OpDX/vjHQ9xfGU3kS1+MIW18Lzf2dxH2BQ=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg61qc+aHMPw9/vjPW+ln592Xp0tkZNzkUJwaKjbTT FZJejNnRykLgxgXg6yYIsvzL+L7g0TC5nVe8HeDmcPKBDKEgYtTACZy/Q3D/4hbiseXv3Ar8Z5d VZLvoZHiXn7OKMDymNMzVtav98Kv2TAy7BE9e6z/xf/4eWp7lK7lvvXZtTcj8M3OVfczJc+uddx 9iQ8A X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 We already have vma_last_pgoff() which retrieves the last page offset within a VMA. However, code often wishes to span a page offset range, which requires the exclusive end of this range. So provide this in vma_end_pgoff() and update vma_last_pgoff() to use this function. Also update the VMA userland tests to reflect the change. No functional change intended. Reviewed-by: Gregory Price Reviewed-by: Pedro Falcato Reviewed-by: Vlastimil Babka (SUSE) Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Zi Yan --- include/linux/mm.h | 19 ++++++++++++++++++- tools/testing/vma/include/dup.h | 5 +++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index abac72785277..c56ca22d406c 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4331,6 +4331,23 @@ static inline pgoff_t vma_start_pgoff(const struct v= m_area_struct *vma) return vma->vm_pgoff; } =20 +/** + * vma_end_pgoff() - Get the page offset of the exclusive end of @vma + * @vma: The VMA whose end page offset is required. + * + * This returns the exclusive end page offset of @vma, which is useful for + * expressing page offset ranges. + * + * See the description of vma_start_pgoff() for a description of VMA page + * offsets. + * + * Returns: The exclusive end page offset of @vma. + */ +static inline pgoff_t vma_end_pgoff(const struct vm_area_struct *vma) +{ + return vma_start_pgoff(vma) + vma_pages(vma); +} + /** * vma_last_pgoff() - Get the page offset of the last page in @vma * @vma: The VMA whose last page offset is required. @@ -4344,7 +4361,7 @@ static inline pgoff_t vma_start_pgoff(const struct vm= _area_struct *vma) */ static inline pgoff_t vma_last_pgoff(const struct vm_area_struct *vma) { - return vma_start_pgoff(vma) + vma_pages(vma) - 1; + return vma_end_pgoff(vma) - 1; } =20 static inline unsigned long vma_desc_size(const struct vm_area_desc *desc) diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/du= p.h index 668650067c7c..535747d7fee4 100644 --- a/tools/testing/vma/include/dup.h +++ b/tools/testing/vma/include/dup.h @@ -1306,6 +1306,11 @@ static inline pgoff_t vma_start_pgoff(const struct v= m_area_struct *vma) return vma->vm_pgoff; } =20 +static inline pgoff_t vma_end_pgoff(const struct vm_area_struct *vma) +{ + return vma_start_pgoff(vma) + vma_pages(vma); +} + static inline int vfs_mmap_prepare(struct file *file, struct vm_area_desc = *desc) { return file->f_op->mmap_prepare(desc); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B7933955C9; Fri, 10 Jul 2026 20:19:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714769; cv=none; b=p28BZ9Gu9AkttHILjCAYh3o9N9wtqYMNKf/KPnqZDj4A4Wp9rVXlIBpuqmEiClHZV/p0tjX/zNREqIZZF2Or5HKqV88/RlbtH+E22i+ipzppyIJ+EP5vfllN9/kyL8iMP0mGN9mTaZJ2zufsNpa3wHIRxHt5iuxtj4GUrFhdJKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714769; c=relaxed/simple; bh=VZjvr3kZlkmGcsP4WgHgMF6CSbykEZdr5f8GmL5Gfpw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rqJq/0jwu2kGQ0hUhxsyUk9A8ODpIfcxgBBdycEPxwEd5EJvkkisuZJ7bFbJ+b+VE9pUh8KYgixpe3FKEmtZSa59fiw3DyMpFU6vvlBmmKDaRNEBvNVS3C3j6pHJoTN3LMxF9Cwo/IUbxWaee+kn7oUVHnLY8h3kdoWN1QGIcEo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Pcf2+0VD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Pcf2+0VD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4A3FE1F00A3A; Fri, 10 Jul 2026 20:19:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714767; bh=VRLMqMtx0xVRr5vFgYMRw7ggTvxftRoyLyfFQKrqZ2w=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Pcf2+0VDkxZNuVa2Cy4lDGhsOB6+enWxg/0/q8e278R+fYuriXovlo2KoDVvNTmXN g4JAhfAyf+/GqazKK2Uv8OXmUynTFSmHR6W6xBEN/66hOOQ9qHTpJNIKcHYkKzMTU2 QBJnnCrQ/o681samcU8yVgyk3flhOlPsMk6gdUy3Rdu+/qVKxUkFThaEAuSIX2nFCL 4Mdnn84yxyjDLlKeMe+A760I8tmgSy5XzTprH0bZq3boIH+4a4l8yyrMOJmOvYIcFe pLrSEnpqwJ0ANXFpuT30ZIcg11rNlGJ8rauvY6XInvMseP5VWizouKSTmnJLUBPs+E OnWQ3HqWG7HFA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:46 +0100 Subject: [PATCH v2 05/33] mm/rmap: update mm/interval_tree.c comments Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-5-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1996; i=ljs@kernel.org; h=from:subject:message-id; bh=VZjvr3kZlkmGcsP4WgHgMF6CSbykEZdr5f8GmL5Gfpw=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg60dcjZeOiBw1zBs0RQu5dke2c4lqtMnRbPMFH73b FeeybNPHaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZiIdh8jw0RHC5MPwlHm7AG8 P7fdMTQJu75b6FP4F0bRMOkHZ69P3svIsM3ac13q3wB972cqVhfOZL1e1ZD0+WSGa4qYHlvxE6W rvAA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Update the file comment to clarify that both file-backed and anonymous interval trees are provided, referencing the relevant data types for clarity. Also add comments to indicate which parts of the file apply to each. While we're here, convert the VM_BUG_ON_VMA() to VM_WARN_ON_ONCE_VMA(). Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- mm/interval_tree.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 344d1f5946c7..2d50bc6228c4 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * mm/interval_tree.c - interval tree for mapping->i_mmap + * mm/interval_tree.c - interval tree for address_space->i_mmap and + * anon_vma->rb_root * * Copyright (C) 2012, Michel Lespinasse */ @@ -10,6 +11,8 @@ #include #include =20 +/* File-backed interval tree (address_space->i_mmap) */ + INTERVAL_TREE_DEFINE(struct vm_area_struct, shared.rb, unsigned long, shared.rb_subtree_last, vma_start_pgoff, vma_last_pgoff, /* empty */, vma_interval_tree) @@ -23,7 +26,7 @@ void vma_interval_tree_insert_after(struct vm_area_struct= *node, struct vm_area_struct *parent; unsigned long last =3D vma_last_pgoff(node); =20 - VM_BUG_ON_VMA(vma_start_pgoff(node) !=3D vma_start_pgoff(prev), node); + VM_WARN_ON_ONCE_VMA(vma_start_pgoff(node) !=3D vma_start_pgoff(prev), nod= e); =20 if (!prev->shared.rb.rb_right) { parent =3D prev; @@ -48,6 +51,8 @@ void vma_interval_tree_insert_after(struct vm_area_struct= *node, &vma_interval_tree_augment); } =20 +/* Anonymous interval tree (anon_vma->rb_root) */ + static inline unsigned long avc_start_pgoff(struct anon_vma_chain *avc) { return vma_start_pgoff(avc->vma); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32F1439769F; Fri, 10 Jul 2026 20:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714793; cv=none; b=mtk/SF/fzLTdm+fZAS5XVzPUJuOFBnmLr1uOn9OdeFfdIQBstYYY0oH5+d81SVLBPJhwbqiuGh2W/9t7KVxNUa3YmioAW7Wr4C06jhdYV1wYIeK6dRjY7Gt1Iyk2pL9xFd3YhBTMcY2XTYqshvRPJPjMfz8yVNMnHYDNa0KuZv0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714793; c=relaxed/simple; bh=l37OTGuevZc5gXyVHaBH6LTDa3GZBR26w5oXVQ6z530=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BliSbnBMSpS9vP67SyTL8/zTcOiixpiBmSXmqWPjqlivK+RhaqnA8HltL0AMU+oKwXyjUwbBpjgg2Z4gTV0A3eVBL3KaY0Tv3lndLvZfzmcOmj1D7HAqvP6xz5mmkdqCeqP7pbgBXLqrq0GuXpVe54FIoSM2mNRw8rkZQJrb8lc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dJG2R20R; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dJG2R20R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 623841F000E9; Fri, 10 Jul 2026 20:19:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714791; bh=yTpEXCYyEBDssM0LXmlPBhbdcFdvloAKFT95xd9ND2E=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=dJG2R20RS+ApyjgMsPxuzZUiPonPDpQSeCwtum1pQxYenuifhCDBec5AidB3GhKUO eCJ649sAicKn2q5tryjVOsVYFvIDOLvlTt++rEjL1v09Uf1kUXl5JoY5JdpXGso69C Ts/3B/u/d+o/c0gl4cya43kV3gK7sWCg5ncpfcUvZESCTWpk6G2Iaut6DI3fWKsQeC +DAYhKXzDEcXJqvM1ZywVW2Go90fdRor4SKKZ29CZjyk5M7G3cl+LS+k7oGPxHrZXB Ov9bXXWEnlI0qwJxKWM3r23dPvRJ83SJ+Z3LHjs87hJMKq4MdtK+x8EU0XbnCmNQwW pHyHNik67WVUw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:47 +0100 Subject: [PATCH v2 06/33] mm/rmap: parameterise vma_interval_tree_*() by address_space Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-6-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=23248; i=ljs@kernel.org; h=from:subject:message-id; bh=l37OTGuevZc5gXyVHaBH6LTDa3GZBR26w5oXVQ6z530=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg63PONzsnuP3/tlETZUjqzJ1pprsO16To7hp0k2bw spLtzbId5SyMIhxMciKKbI8/yK+P0gkbF7nBX83mDmsTCBDGLg4BWAiruwMv1lkF+a5CFZNcVFu 8r3BH8b/443PjTe9p1g3hfO4BcVFXmdk2G/4tdB7ukr3nD1/xKK2XHimqvrhznoZ3ZpFDxdH3+F i4wYA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 The file-backed mapping interval tree functions vma_interval_tree_*() accept a raw rb_root_cached pointer to determine the tree in which they are operating. However, in each case, this is always associated with an address_space data type. So simply pass a pointer to that instead to simplify the code, and more clearly differentiate between these operations and those concerning anonymous mappings. While we're here, make the generated interval tree functions static as they do not need to be used externally (any previously existing external users have now been removed). We also rename VMA parameters from 'node' to 'vma' as calling this a node is simply confusing, update the input index types to pgoff_t since they reference page offsets and rename the parameters to pgoff_start and pgoff_last. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- arch/arm/mm/fault-armv.c | 2 +- arch/arm/mm/flush.c | 2 +- arch/nios2/mm/cacheflush.c | 2 +- arch/parisc/kernel/cache.c | 2 +- fs/dax.c | 2 +- fs/hugetlbfs/inode.c | 15 +++++----- include/linux/mm.h | 34 ++++++++++++----------- kernel/events/uprobes.c | 2 +- mm/hugetlb.c | 4 +-- mm/interval_tree.c | 58 +++++++++++++++++++++++++++++------= ---- mm/khugepaged.c | 4 +-- mm/memory-failure.c | 7 ++--- mm/memory.c | 8 +++--- mm/mmap.c | 3 +- mm/nommu.c | 8 +++--- mm/pagewalk.c | 2 +- mm/rmap.c | 3 +- mm/vma.c | 14 ++++------ tools/testing/vma/include/stubs.h | 4 +-- 19 files changed, 100 insertions(+), 76 deletions(-) diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index 91e488767783..cd52cf7f8874 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c @@ -140,7 +140,7 @@ make_coherent(struct address_space *mapping, struct vm_= area_struct *vma, * cache coherency. */ flush_dcache_mmap_lock(mapping); - vma_interval_tree_foreach(mpnt, &mapping->i_mmap, pgoff, pgoff) { + vma_interval_tree_foreach(mpnt, mapping, pgoff, pgoff) { /* * If we are using split PTE locks, then we need to take the pte * lock. Otherwise we are using shared mm->page_table_lock which diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 4d7ef5cc36b6..8c593e9898ee 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c @@ -251,7 +251,7 @@ static void __flush_dcache_aliases(struct address_space= *mapping, struct folio * pgoff_end =3D pgoff + folio_nr_pages(folio) - 1; =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff_end) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff_end) { unsigned long start, offset, pfn; unsigned int nr; =20 diff --git a/arch/nios2/mm/cacheflush.c b/arch/nios2/mm/cacheflush.c index 8321182eb927..42e3bf892316 100644 --- a/arch/nios2/mm/cacheflush.c +++ b/arch/nios2/mm/cacheflush.c @@ -82,7 +82,7 @@ static void flush_aliases(struct address_space *mapping, = struct folio *folio) pgoff =3D folio->index; =20 flush_dcache_mmap_lock_irqsave(mapping, flags); - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff + nr - 1) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { unsigned long start; =20 if (vma->vm_mm !=3D mm) diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 0170b69a21d3..f28aa7884cbf 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -503,7 +503,7 @@ void flush_dcache_folio(struct folio *folio) * on machines that support equivalent aliasing */ flush_dcache_mmap_lock_irqsave(mapping, flags); - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff + nr - 1) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { unsigned long offset =3D pgoff - vma->vm_pgoff; unsigned long pfn =3D folio_pfn(folio); =20 diff --git a/fs/dax.c b/fs/dax.c index 6d175cd47a99..2f0818a68a7f 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1201,7 +1201,7 @@ static int dax_writeback_one(struct xa_state *xas, st= ruct dax_device *dax_dev, =20 /* Walk all mappings of a given index of a file and writeprotect them */ i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, &mapping->i_mmap, index, end) { + vma_interval_tree_foreach(vma, mapping, index, end) { pfn_mkclean_range(pfn, count, index, vma); cond_resched(); } diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 216e1a0dd0b2..4ea1798f1ffb 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -380,7 +380,6 @@ static void hugetlb_unmap_file_folio(struct hstate *h, struct address_space *mapping, struct folio *folio, pgoff_t index) { - struct rb_root_cached *root =3D &mapping->i_mmap; struct hugetlb_vma_lock *vma_lock; unsigned long pfn =3D folio_pfn(folio); struct vm_area_struct *vma; @@ -394,7 +393,7 @@ static void hugetlb_unmap_file_folio(struct hstate *h, i_mmap_lock_write(mapping); retry: vma_lock =3D NULL; - vma_interval_tree_foreach(vma, root, start, end - 1) { + vma_interval_tree_foreach(vma, mapping, start, end - 1) { v_start =3D vma_offset_start(vma, start); v_end =3D vma_offset_end(vma, end); =20 @@ -460,8 +459,8 @@ static void hugetlb_unmap_file_folio(struct hstate *h, } =20 static void -hugetlb_vmdelete_list(struct rb_root_cached *root, pgoff_t start, pgoff_t = end, - zap_flags_t zap_flags) +hugetlb_vmdelete_list(struct address_space *mapping, pgoff_t start, + pgoff_t end, zap_flags_t zap_flags) { struct vm_area_struct *vma; =20 @@ -470,7 +469,8 @@ hugetlb_vmdelete_list(struct rb_root_cached *root, pgof= f_t start, pgoff_t end, * unmapped. Note, end is exclusive, whereas the interval tree takes * an inclusive "last". */ - vma_interval_tree_foreach(vma, root, start, end ? end - 1 : ULONG_MAX) { + vma_interval_tree_foreach(vma, mapping, start, + end ? end - 1 : ULONG_MAX) { unsigned long v_start; unsigned long v_end; =20 @@ -615,8 +615,7 @@ static void hugetlb_vmtruncate(struct inode *inode, lof= f_t offset) i_size_write(inode, offset); i_mmap_lock_write(mapping); if (mapping_mapped(mapping)) - hugetlb_vmdelete_list(&mapping->i_mmap, pgoff, 0, - ZAP_FLAG_DROP_MARKER); + hugetlb_vmdelete_list(mapping, pgoff, 0, ZAP_FLAG_DROP_MARKER); i_mmap_unlock_write(mapping); remove_inode_hugepages(inode, offset, LLONG_MAX); } @@ -676,7 +675,7 @@ static long hugetlbfs_punch_hole(struct inode *inode, l= off_t offset, loff_t len) /* Unmap users of full pages in the hole. */ if (hole_end > hole_start) { if (mapping_mapped(mapping)) - hugetlb_vmdelete_list(&mapping->i_mmap, + hugetlb_vmdelete_list(mapping, hole_start >> PAGE_SHIFT, hole_end >> PAGE_SHIFT, 0); } diff --git a/include/linux/mm.h b/include/linux/mm.h index c56ca22d406c..da4b7540837d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4090,23 +4090,25 @@ extern atomic_long_t mmap_pages_allocated; extern int nommu_shrink_inode_mappings(struct inode *, size_t, size_t); =20 /* interval_tree.c */ -void vma_interval_tree_insert(struct vm_area_struct *node, - struct rb_root_cached *root); -void vma_interval_tree_insert_after(struct vm_area_struct *node, +void vma_interval_tree_insert(struct vm_area_struct *vma, + struct address_space *mapping); +void vma_interval_tree_insert_after(struct vm_area_struct *vma, struct vm_area_struct *prev, - struct rb_root_cached *root); -void vma_interval_tree_remove(struct vm_area_struct *node, - struct rb_root_cached *root); -struct vm_area_struct *vma_interval_tree_subtree_search(struct vm_area_str= uct *node, - unsigned long start, unsigned long last); -struct vm_area_struct *vma_interval_tree_iter_first(struct rb_root_cached = *root, - unsigned long start, unsigned long last); -struct vm_area_struct *vma_interval_tree_iter_next(struct vm_area_struct *= node, - unsigned long start, unsigned long last); - -#define vma_interval_tree_foreach(vma, root, start, last) \ - for (vma =3D vma_interval_tree_iter_first(root, start, last); \ - vma; vma =3D vma_interval_tree_iter_next(vma, start, last)) + struct address_space *mapping); +void vma_interval_tree_remove(struct vm_area_struct *vma, + struct address_space *mapping); +struct vm_area_struct * +vma_interval_tree_iter_first(struct address_space *mapping, + pgoff_t pgoff_start, pgoff_t pgoff_last); +struct vm_area_struct * +vma_interval_tree_iter_next(struct vm_area_struct *vma, + pgoff_t pgoff_start, pgoff_t pgoff_last); + +#define vma_interval_tree_foreach(vma, mapping, pgoff_start, pgoff_last) \ + for (vma =3D vma_interval_tree_iter_first(mapping, pgoff_start, \ + pgoff_last); \ + vma; vma =3D vma_interval_tree_iter_next(vma, pgoff_start, \ + pgoff_last)) =20 void anon_vma_interval_tree_insert(struct anon_vma_chain *node, struct rb_root_cached *root); diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 4084e926e284..50a96a4d812d 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1210,7 +1210,7 @@ build_map_info(struct address_space *mapping, loff_t = offset, bool is_register) =20 again: i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { if (!valid_vma(vma, is_register)) continue; =20 diff --git a/mm/hugetlb.c b/mm/hugetlb.c index a85ea663b192..9dddd4227dbf 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5454,7 +5454,7 @@ static void unmap_ref_private(struct mm_struct *mm, s= truct vm_area_struct *vma, * __unmap_hugepage_range() is called as the lock is already held */ i_mmap_lock_write(mapping); - vma_interval_tree_foreach(iter_vma, &mapping->i_mmap, pgoff, pgoff) { + vma_interval_tree_foreach(iter_vma, mapping, pgoff, pgoff) { /* Do not unmap the current VMA */ if (iter_vma =3D=3D vma) continue; @@ -6997,7 +6997,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm= _area_struct *vma, pte_t *pte; =20 i_mmap_lock_read(mapping); - vma_interval_tree_foreach(svma, &mapping->i_mmap, idx, idx) { + vma_interval_tree_foreach(svma, mapping, idx, idx) { if (svma =3D=3D vma) continue; =20 diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 2d50bc6228c4..ff36fd14ef37 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -14,19 +14,26 @@ /* File-backed interval tree (address_space->i_mmap) */ =20 INTERVAL_TREE_DEFINE(struct vm_area_struct, shared.rb, - unsigned long, shared.rb_subtree_last, - vma_start_pgoff, vma_last_pgoff, /* empty */, vma_interval_tree) + pgoff_t, shared.rb_subtree_last, + vma_start_pgoff, vma_last_pgoff, static, + __vma_interval_tree) =20 -/* Insert node immediately after prev in the interval tree */ -void vma_interval_tree_insert_after(struct vm_area_struct *node, +void vma_interval_tree_insert(struct vm_area_struct *vma, + struct address_space *mapping) +{ + __vma_interval_tree_insert(vma, &mapping->i_mmap); +} + +/* Insert vma immediately after prev in the interval tree */ +void vma_interval_tree_insert_after(struct vm_area_struct *vma, struct vm_area_struct *prev, - struct rb_root_cached *root) + struct address_space *mapping) { struct rb_node **link; struct vm_area_struct *parent; - unsigned long last =3D vma_last_pgoff(node); + const pgoff_t pgoff_last =3D vma_last_pgoff(vma); =20 - VM_WARN_ON_ONCE_VMA(vma_start_pgoff(node) !=3D vma_start_pgoff(prev), nod= e); + VM_WARN_ON_ONCE_VMA(vma_start_pgoff(vma) !=3D vma_start_pgoff(prev), vma); =20 if (!prev->shared.rb.rb_right) { parent =3D prev; @@ -34,21 +41,42 @@ void vma_interval_tree_insert_after(struct vm_area_stru= ct *node, } else { parent =3D rb_entry(prev->shared.rb.rb_right, struct vm_area_struct, shared.rb); - if (parent->shared.rb_subtree_last < last) - parent->shared.rb_subtree_last =3D last; + if (parent->shared.rb_subtree_last < pgoff_last) + parent->shared.rb_subtree_last =3D pgoff_last; while (parent->shared.rb.rb_left) { parent =3D rb_entry(parent->shared.rb.rb_left, struct vm_area_struct, shared.rb); - if (parent->shared.rb_subtree_last < last) - parent->shared.rb_subtree_last =3D last; + if (parent->shared.rb_subtree_last < pgoff_last) + parent->shared.rb_subtree_last =3D pgoff_last; } link =3D &parent->shared.rb.rb_left; } =20 - node->shared.rb_subtree_last =3D last; - rb_link_node(&node->shared.rb, &parent->shared.rb, link); - rb_insert_augmented(&node->shared.rb, &root->rb_root, - &vma_interval_tree_augment); + vma->shared.rb_subtree_last =3D pgoff_last; + rb_link_node(&vma->shared.rb, &parent->shared.rb, link); + rb_insert_augmented(&vma->shared.rb, &mapping->i_mmap.rb_root, + &__vma_interval_tree_augment); +} + +void vma_interval_tree_remove(struct vm_area_struct *vma, + struct address_space *mapping) +{ + __vma_interval_tree_remove(vma, &mapping->i_mmap); +} + +struct vm_area_struct * +vma_interval_tree_iter_first(struct address_space *mapping, + pgoff_t pgoff_start, pgoff_t pgoff_last) +{ + return __vma_interval_tree_iter_first(&mapping->i_mmap, + pgoff_start, pgoff_last); +} + +struct vm_area_struct * +vma_interval_tree_iter_next(struct vm_area_struct *vma, + pgoff_t pgoff_start, pgoff_t pgoff_last) +{ + return __vma_interval_tree_iter_next(vma, pgoff_start, pgoff_last); } =20 /* Anonymous interval tree (anon_vma->rb_root) */ diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 55157567dc4c..e5462e026642 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2141,7 +2141,7 @@ static void retract_page_tables(struct address_space = *mapping, pgoff_t pgoff) struct vm_area_struct *vma; =20 i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { struct mmu_notifier_range range; struct mm_struct *mm; unsigned long addr; @@ -2573,7 +2573,7 @@ static enum scan_result collapse_file(struct mm_struc= t *mm, unsigned long addr, * not be able to observe any missing pages due to the * previously inserted retry entries. */ - vma_interval_tree_foreach(vma, &mapping->i_mmap, start, end) { + vma_interval_tree_foreach(vma, mapping, start, end) { if (userfaultfd_missing(vma)) { result =3D SCAN_EXCEED_NONE_PTE; goto immap_locked; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index bf717ec59508..4358856e764f 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -598,8 +598,7 @@ static void collect_procs_file(const struct folio *foli= o, =20 if (!t) continue; - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, - pgoff) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { /* * Send early kill signal to tasks where a vma covers * the page but the corrupted page is not necessarily @@ -650,7 +649,7 @@ static void collect_procs_fsdax(const struct page *page, t =3D task_early_kill(tsk, true); if (!t) continue; - vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { + vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { if (vma->vm_mm =3D=3D t->mm) add_to_kill_fsdax(t, page, vma, to_kill, pgoff); } @@ -2297,7 +2296,7 @@ static void collect_procs_pfn(struct pfn_address_spac= e *pfn_space, t =3D task_early_kill(tsk, true); if (!t) continue; - vma_interval_tree_foreach(vma, &mapping->i_mmap, 0, ULONG_MAX) { + vma_interval_tree_foreach(vma, mapping, 0, ULONG_MAX) { pgoff_t pgoff; =20 if (vma->vm_mm =3D=3D t->mm && diff --git a/mm/memory.c b/mm/memory.c index 87db93f35bcf..6ce92badc38a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4360,7 +4360,7 @@ static vm_fault_t do_wp_page(struct vm_fault *vmf) return wp_page_copy(vmf); } =20 -static inline void unmap_mapping_range_tree(struct rb_root_cached *root, +static inline void unmap_mapping_range_tree(struct address_space *mapping, pgoff_t first_index, pgoff_t last_index, struct zap_details *details) @@ -4369,7 +4369,7 @@ static inline void unmap_mapping_range_tree(struct rb= _root_cached *root, unsigned long start, size; struct mmu_gather tlb; =20 - vma_interval_tree_foreach(vma, root, first_index, last_index) { + vma_interval_tree_foreach(vma, mapping, first_index, last_index) { const pgoff_t start_idx =3D max(first_index, vma->vm_pgoff); const pgoff_t end_idx =3D min(last_index, vma_last_pgoff(vma)) + 1; =20 @@ -4411,7 +4411,7 @@ void unmap_mapping_folio(struct folio *folio) =20 i_mmap_lock_read(mapping); if (unlikely(mapping_mapped(mapping))) - unmap_mapping_range_tree(&mapping->i_mmap, first_index, + unmap_mapping_range_tree(mapping, first_index, last_index, &details); i_mmap_unlock_read(mapping); } @@ -4441,7 +4441,7 @@ void unmap_mapping_pages(struct address_space *mappin= g, pgoff_t start, =20 i_mmap_lock_read(mapping); if (unlikely(mapping_mapped(mapping))) - unmap_mapping_range_tree(&mapping->i_mmap, first_index, + unmap_mapping_range_tree(mapping, first_index, last_index, &details); i_mmap_unlock_read(mapping); } diff --git a/mm/mmap.c b/mm/mmap.c index 2311ae7c2ff4..2f22fb0d068d 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1830,8 +1830,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, s= truct mm_struct *oldmm) mapping_allow_writable(mapping); flush_dcache_mmap_lock(mapping); /* insert tmp into the share list, just after mpnt */ - vma_interval_tree_insert_after(tmp, mpnt, - &mapping->i_mmap); + vma_interval_tree_insert_after(tmp, mpnt, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } diff --git a/mm/nommu.c b/mm/nommu.c index 852ec9bd0505..13023d73d1e4 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -569,7 +569,7 @@ static void setup_vma_to_mm(struct vm_area_struct *vma,= struct mm_struct *mm) =20 i_mmap_lock_write(mapping); flush_dcache_mmap_lock(mapping); - vma_interval_tree_insert(vma, &mapping->i_mmap); + vma_interval_tree_insert(vma, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } @@ -585,7 +585,7 @@ static void cleanup_vma_from_mm(struct vm_area_struct *= vma) =20 i_mmap_lock_write(mapping); flush_dcache_mmap_lock(mapping); - vma_interval_tree_remove(vma, &mapping->i_mmap); + vma_interval_tree_remove(vma, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } @@ -1843,7 +1843,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, = size_t size, i_mmap_lock_read(inode->i_mapping); =20 /* search for VMAs that fall within the dead zone */ - vma_interval_tree_foreach(vma, &inode->i_mapping->i_mmap, low, high) { + vma_interval_tree_foreach(vma, inode->i_mapping, low, high) { /* found one - only interested if it's shared out of the page * cache */ if (vma->vm_flags & VM_SHARED) { @@ -1859,7 +1859,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, = size_t size, * we don't check for any regions that start beyond the EOF as there * shouldn't be any */ - vma_interval_tree_foreach(vma, &inode->i_mapping->i_mmap, 0, ULONG_MAX) { + vma_interval_tree_foreach(vma, inode->i_mapping, 0, ULONG_MAX) { if (!(vma->vm_flags & VM_SHARED)) continue; =20 diff --git a/mm/pagewalk.c b/mm/pagewalk.c index 3ae2586ff45b..490a14691660 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c @@ -810,7 +810,7 @@ int walk_page_mapping(struct address_space *mapping, pg= off_t first_index, return -EINVAL; =20 lockdep_assert_held(&mapping->i_mmap_rwsem); - vma_interval_tree_foreach(vma, &mapping->i_mmap, first_index, + vma_interval_tree_foreach(vma, mapping, first_index, first_index + nr - 1) { /* Clip to the vma */ vba =3D vma->vm_pgoff; diff --git a/mm/rmap.c b/mm/rmap.c index 26166a6b8cb9..73673cd3961e 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -3053,8 +3053,7 @@ static void __rmap_walk_file(struct folio *folio, str= uct address_space *mapping, i_mmap_lock_read(mapping); } lookup: - vma_interval_tree_foreach(vma, &mapping->i_mmap, - pgoff_start, pgoff_end) { + vma_interval_tree_foreach(vma, mapping, pgoff_start, pgoff_end) { unsigned long address =3D vma_address(vma, pgoff_start, nr_pages); =20 VM_BUG_ON_VMA(address =3D=3D -EFAULT, vma); diff --git a/mm/vma.c b/mm/vma.c index 9eea2850818a..ce4ec4b71138 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -234,7 +234,7 @@ static void __vma_link_file(struct vm_area_struct *vma, mapping_allow_writable(mapping); =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_insert(vma, &mapping->i_mmap); + vma_interval_tree_insert(vma, mapping); flush_dcache_mmap_unlock(mapping); } =20 @@ -248,7 +248,7 @@ static void __remove_shared_vm_struct(struct vm_area_st= ruct *vma, mapping_unmap_writable(mapping); =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_remove(vma, &mapping->i_mmap); + vma_interval_tree_remove(vma, mapping); flush_dcache_mmap_unlock(mapping); } =20 @@ -319,10 +319,9 @@ static void vma_prepare(struct vma_prepare *vp) =20 if (vp->file) { flush_dcache_mmap_lock(vp->mapping); - vma_interval_tree_remove(vp->vma, &vp->mapping->i_mmap); + vma_interval_tree_remove(vp->vma, vp->mapping); if (vp->adj_next) - vma_interval_tree_remove(vp->adj_next, - &vp->mapping->i_mmap); + vma_interval_tree_remove(vp->adj_next, vp->mapping); } =20 } @@ -340,9 +339,8 @@ static void vma_complete(struct vma_prepare *vp, struct= vma_iterator *vmi, { if (vp->file) { if (vp->adj_next) - vma_interval_tree_insert(vp->adj_next, - &vp->mapping->i_mmap); - vma_interval_tree_insert(vp->vma, &vp->mapping->i_mmap); + vma_interval_tree_insert(vp->adj_next, vp->mapping); + vma_interval_tree_insert(vp->vma, vp->mapping); flush_dcache_mmap_unlock(vp->mapping); } =20 diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/= stubs.h index 64164e25658f..94442b29458d 100644 --- a/tools/testing/vma/include/stubs.h +++ b/tools/testing/vma/include/stubs.h @@ -258,12 +258,12 @@ static inline void vm_acct_memory(long pages) } =20 static inline void vma_interval_tree_insert(struct vm_area_struct *vma, - struct rb_root_cached *rb) + struct address_space *mapping) { } =20 static inline void vma_interval_tree_remove(struct vm_area_struct *vma, - struct rb_root_cached *rb) + struct address_space *mapping) { } =20 --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C794395AEB; Fri, 10 Jul 2026 20:20:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714815; cv=none; b=cI0sJPODuMRdD0U4W31EvZozuUBXQ3v8o7wD/+R8xq15NyAs67lc4vxs0jC45YLxDViLl6glkspBdTdSARNeFmm1GloyrpQD0jz5Dnp308j2343G9Zntly2Xm4WCmmhZEF8ds480tpp+sZNgvxuZzOBynfFs2rfEDbpqJvMJ62Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714815; c=relaxed/simple; bh=+vEjD5vk3USGS9eYkwFhK69Zz1FxHMWNBbZKQBCnxeY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oRo6uqrC9Ag9WkoLSLDYdI8xCcxbIXpj18x7gGqopRLGckZBHC1jOt/As9HicSc1zZoCJE4b1WM7K+G0X4mWjPxiBYZK5yK6SmoFWHUk5Wzr3pDKJLQqm2/9AjtHQ3B5k8HE1SMDZuQzcvmXEFiE9shjuq+5TX7+8rZtsMbbjBc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KklfwoQD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KklfwoQD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C9341F00AC4; Fri, 10 Jul 2026 20:19:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714814; bh=b6m+Kx9pTca8aDLZIa9EAYyuWtzQz4rBN6lpqZdjtOI=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=KklfwoQDYnFJiSgF8x/fmMsC82irr6fiC3vgvxdByDvRhoedHf7pQDn1c9NZI5DfX MOp1LTiHjHpzA9VLvkhYbildB4cu1vHCk5/KVbHKUSlprjpTaQUNMDmjsiOI1Te042 uo77hJ8LafjCsZg+xC7CeE0CvOqdnXPhDR3G8yHgib8IhAkNPTshHLMdz11XWgX0vK SiUbzRTgSYO80iNLU2glBBPv+CXZpdrT32nDMj1+31ugD/CwsX4SHX531HtcRV/aAa LS7f/v828c4J4dL0OksyoCQ6qMBgXKJbADW9m+mA8/97HyNxBJyN4JJFdTQqAIWyVR mgWAx34mGiLzg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:48 +0100 Subject: [PATCH v2 07/33] mm/rmap: elide unnecessary static inline's in interval_tree.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-7-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1497; i=ljs@kernel.org; h=from:subject:message-id; bh=+vEjD5vk3USGS9eYkwFhK69Zz1FxHMWNBbZKQBCnxeY=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg62zJyhL7JCZOvGsm/Q/rj3+70IOrpitfMx/uvyjz oi4HzwnOkpZGMS4GGTFFFmefxHfHyQSNq/zgr8bzBxWJpAhDFycAjCRdCeG/y41XWeYDhe96a2Z 3BWx1eDu9tse2jMKv71UKpp856v5jjuMDJ8f1fW/3H7zvFYYW6fsng/1loVifcVXfG1nbto7c1k vFwcA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 It's not necessary to declare these functions static inline as they are contained within a single compilation unit. This makes the anonymous interval tree code consistent with the newly updated file-backed interval tree code. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- mm/interval_tree.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mm/interval_tree.c b/mm/interval_tree.c index ff36fd14ef37..b387d39e0547 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -81,19 +81,19 @@ vma_interval_tree_iter_next(struct vm_area_struct *vma, =20 /* Anonymous interval tree (anon_vma->rb_root) */ =20 -static inline unsigned long avc_start_pgoff(struct anon_vma_chain *avc) +static unsigned long avc_start_pgoff(struct anon_vma_chain *avc) { return vma_start_pgoff(avc->vma); } =20 -static inline unsigned long avc_last_pgoff(struct anon_vma_chain *avc) +static unsigned long avc_last_pgoff(struct anon_vma_chain *avc) { return vma_last_pgoff(avc->vma); } =20 INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, unsigned long, rb_subtree_= last, avc_start_pgoff, avc_last_pgoff, - static inline, __anon_vma_interval_tree) + static, __anon_vma_interval_tree) =20 void anon_vma_interval_tree_insert(struct anon_vma_chain *node, struct rb_root_cached *root) --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A571638E8B5; Fri, 10 Jul 2026 20:20:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714839; cv=none; b=iQjRxdVdvmrBxZjR4r+O0FFn/Dd3lMdUyumWWZMuRYIWewnhk3ExFMPmYJ7SsYeHFM2qCKZG+ktfPllqPhVs78HucUii7SnPT/DrjaiuhkrDlNbY/7S/hOzgZp9mmO5UlJYorjCb31VMoVX/BY7QQ11RP53ZZGu7f8bqhsfST2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714839; c=relaxed/simple; bh=NGir1YzSu95tIryD8ttAylxZ9DhWUH4kYxuWYXIxsQg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XvOCh8xLn0MPe4QIx/sC73VaYvk29BnKqwEspi/bZZ/NNRdBo9A8rRKDc/ySBK83qQLy6LhmiZc0LZyT0QYofJzMesd2n2uGJtc1NvbgRlkxABZuzLLytZPgNtvowq3bVKlExyYKlAum9q2mpvdzu9qil1I77qdg798C7HBYegk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZH1nApuP; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZH1nApuP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A2C21F000E9; Fri, 10 Jul 2026 20:20:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714837; bh=ZXEEecnLaKE6h4XeKdlR4nDvBvNTcWsABqUFAmimjJ0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=ZH1nApuPVTF1D1B+iN8EbTPp/3uwPW9yotrcDoJEcJAJwLcMvVQhYsTyYOukc5mDm MvOatc/5ADIDZbbRw9nApLZT+1iPKP7tqTJoxz+9eX5qrz/mMNU79eiY/+7IxNrKNg DRK9JIXhtJ0NMHwPgyY3CkcnuBcIDoAMiq2D5IMCwDIV7M5EP9LT2Q61+izj5QwFSz KlhCZsnpr92nIfLGpy8nJTth124ZNJJerEpgSayMqHUpoafEYlpJbtrsDzMfqlXYcP Rinv0zxgaWGvMvqRwpbJtq7nQCt76GLZ+sgFswAVpINsg9nhT/t5oWJGYvQ8T5FZb4 0bjb7DGgoSHWw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:49 +0100 Subject: [PATCH v2 08/33] mm/rmap: rename vma_interval_tree_*() to mapping_rmap_tree_*() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-8-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=18824; i=ljs@kernel.org; h=from:subject:message-id; bh=NGir1YzSu95tIryD8ttAylxZ9DhWUH4kYxuWYXIxsQg=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg60deXMcvb12mxouTP6eLPbc7qr1rs+XQ/3bNMrWb 1hwN+FGRykLgxgXg6yYIsvzL+L7g0TC5nVe8HeDmcPKBDKEgYtTACbCy8LwT1f4/LSaabMP/IiR z5x+uTlturXPWkcVuW/HX+g4vRGdXMDwzyJGbX0F+8ucT7ziPMYH6peVLr5izHS3paU6ubRs6uw XbAA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 The family of vma_interval_tree_() functions manipulate the address_space (which, of course, is generally referred to as 'mapping') reverse mapping, but are named the 'VMA' interval tree. VMAs may be mapped by an anon_vma, an address_space, or both. Therefore calling the mapping interval tree a 'VMA' interval tree is rather confusing. This is also inconsistent with the anon_vma_interval_tree_*() functions which explicitly reference the rmap object to which they pertain. Rename the vma_interval_tree_*() functions to mapping_rmap_tree_*() to correct this. We will rename the anon rmap functions similarly in a subsequent patch. No functional change intended. Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- arch/arm/mm/fault-armv.c | 2 +- arch/arm/mm/flush.c | 2 +- arch/nios2/mm/cacheflush.c | 2 +- arch/parisc/kernel/cache.c | 2 +- fs/dax.c | 2 +- fs/hugetlbfs/inode.c | 4 ++-- include/linux/mm.h | 16 ++++++++-------- kernel/events/uprobes.c | 2 +- mm/hugetlb.c | 4 ++-- mm/interval_tree.c | 22 +++++++++++----------- mm/khugepaged.c | 4 ++-- mm/memory-failure.c | 6 +++--- mm/memory.c | 2 +- mm/mmap.c | 2 +- mm/nommu.c | 8 ++++---- mm/pagewalk.c | 2 +- mm/rmap.c | 2 +- mm/vma.c | 12 ++++++------ tools/testing/vma/include/stubs.h | 4 ++-- 19 files changed, 50 insertions(+), 50 deletions(-) diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index cd52cf7f8874..b505f1fd7984 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c @@ -140,7 +140,7 @@ make_coherent(struct address_space *mapping, struct vm_= area_struct *vma, * cache coherency. */ flush_dcache_mmap_lock(mapping); - vma_interval_tree_foreach(mpnt, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(mpnt, mapping, pgoff, pgoff) { /* * If we are using split PTE locks, then we need to take the pte * lock. Otherwise we are using shared mm->page_table_lock which diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 8c593e9898ee..66270904f874 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c @@ -251,7 +251,7 @@ static void __flush_dcache_aliases(struct address_space= *mapping, struct folio * pgoff_end =3D pgoff + folio_nr_pages(folio) - 1; =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff_end) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff_end) { unsigned long start, offset, pfn; unsigned int nr; =20 diff --git a/arch/nios2/mm/cacheflush.c b/arch/nios2/mm/cacheflush.c index 42e3bf892316..10232476031f 100644 --- a/arch/nios2/mm/cacheflush.c +++ b/arch/nios2/mm/cacheflush.c @@ -82,7 +82,7 @@ static void flush_aliases(struct address_space *mapping, = struct folio *folio) pgoff =3D folio->index; =20 flush_dcache_mmap_lock_irqsave(mapping, flags); - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { unsigned long start; =20 if (vma->vm_mm !=3D mm) diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index f28aa7884cbf..98200b6b5b82 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -503,7 +503,7 @@ void flush_dcache_folio(struct folio *folio) * on machines that support equivalent aliasing */ flush_dcache_mmap_lock_irqsave(mapping, flags); - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff + nr - 1) { unsigned long offset =3D pgoff - vma->vm_pgoff; unsigned long pfn =3D folio_pfn(folio); =20 diff --git a/fs/dax.c b/fs/dax.c index 2f0818a68a7f..4ea3384ecefd 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1201,7 +1201,7 @@ static int dax_writeback_one(struct xa_state *xas, st= ruct dax_device *dax_dev, =20 /* Walk all mappings of a given index of a file and writeprotect them */ i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, mapping, index, end) { + mapping_rmap_tree_foreach(vma, mapping, index, end) { pfn_mkclean_range(pfn, count, index, vma); cond_resched(); } diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ea1798f1ffb..9fddd1e0b813 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -393,7 +393,7 @@ static void hugetlb_unmap_file_folio(struct hstate *h, i_mmap_lock_write(mapping); retry: vma_lock =3D NULL; - vma_interval_tree_foreach(vma, mapping, start, end - 1) { + mapping_rmap_tree_foreach(vma, mapping, start, end - 1) { v_start =3D vma_offset_start(vma, start); v_end =3D vma_offset_end(vma, end); =20 @@ -469,7 +469,7 @@ hugetlb_vmdelete_list(struct address_space *mapping, pg= off_t start, * unmapped. Note, end is exclusive, whereas the interval tree takes * an inclusive "last". */ - vma_interval_tree_foreach(vma, mapping, start, + mapping_rmap_tree_foreach(vma, mapping, start, end ? end - 1 : ULONG_MAX) { unsigned long v_start; unsigned long v_end; diff --git a/include/linux/mm.h b/include/linux/mm.h index da4b7540837d..d4ac9dc83ddd 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4090,24 +4090,24 @@ extern atomic_long_t mmap_pages_allocated; extern int nommu_shrink_inode_mappings(struct inode *, size_t, size_t); =20 /* interval_tree.c */ -void vma_interval_tree_insert(struct vm_area_struct *vma, +void mapping_rmap_tree_insert(struct vm_area_struct *vma, struct address_space *mapping); -void vma_interval_tree_insert_after(struct vm_area_struct *vma, +void mapping_rmap_tree_insert_after(struct vm_area_struct *vma, struct vm_area_struct *prev, struct address_space *mapping); -void vma_interval_tree_remove(struct vm_area_struct *vma, +void mapping_rmap_tree_remove(struct vm_area_struct *vma, struct address_space *mapping); struct vm_area_struct * -vma_interval_tree_iter_first(struct address_space *mapping, +mapping_rmap_tree_iter_first(struct address_space *mapping, pgoff_t pgoff_start, pgoff_t pgoff_last); struct vm_area_struct * -vma_interval_tree_iter_next(struct vm_area_struct *vma, +mapping_rmap_tree_iter_next(struct vm_area_struct *vma, pgoff_t pgoff_start, pgoff_t pgoff_last); =20 -#define vma_interval_tree_foreach(vma, mapping, pgoff_start, pgoff_last) \ - for (vma =3D vma_interval_tree_iter_first(mapping, pgoff_start, \ +#define mapping_rmap_tree_foreach(vma, mapping, pgoff_start, pgoff_last) \ + for (vma =3D mapping_rmap_tree_iter_first(mapping, pgoff_start, \ pgoff_last); \ - vma; vma =3D vma_interval_tree_iter_next(vma, pgoff_start, \ + vma; vma =3D mapping_rmap_tree_iter_next(vma, pgoff_start, \ pgoff_last)) =20 void anon_vma_interval_tree_insert(struct anon_vma_chain *node, diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 50a96a4d812d..ac340a703d06 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1210,7 +1210,7 @@ build_map_info(struct address_space *mapping, loff_t = offset, bool is_register) =20 again: i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff) { if (!valid_vma(vma, is_register)) continue; =20 diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 9dddd4227dbf..92796c0cd89e 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5454,7 +5454,7 @@ static void unmap_ref_private(struct mm_struct *mm, s= truct vm_area_struct *vma, * __unmap_hugepage_range() is called as the lock is already held */ i_mmap_lock_write(mapping); - vma_interval_tree_foreach(iter_vma, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(iter_vma, mapping, pgoff, pgoff) { /* Do not unmap the current VMA */ if (iter_vma =3D=3D vma) continue; @@ -6997,7 +6997,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm= _area_struct *vma, pte_t *pte; =20 i_mmap_lock_read(mapping); - vma_interval_tree_foreach(svma, mapping, idx, idx) { + mapping_rmap_tree_foreach(svma, mapping, idx, idx) { if (svma =3D=3D vma) continue; =20 diff --git a/mm/interval_tree.c b/mm/interval_tree.c index b387d39e0547..39e020555910 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -16,16 +16,16 @@ INTERVAL_TREE_DEFINE(struct vm_area_struct, shared.rb, pgoff_t, shared.rb_subtree_last, vma_start_pgoff, vma_last_pgoff, static, - __vma_interval_tree) + __mapping_rmap_tree) =20 -void vma_interval_tree_insert(struct vm_area_struct *vma, +void mapping_rmap_tree_insert(struct vm_area_struct *vma, struct address_space *mapping) { - __vma_interval_tree_insert(vma, &mapping->i_mmap); + __mapping_rmap_tree_insert(vma, &mapping->i_mmap); } =20 /* Insert vma immediately after prev in the interval tree */ -void vma_interval_tree_insert_after(struct vm_area_struct *vma, +void mapping_rmap_tree_insert_after(struct vm_area_struct *vma, struct vm_area_struct *prev, struct address_space *mapping) { @@ -55,28 +55,28 @@ void vma_interval_tree_insert_after(struct vm_area_stru= ct *vma, vma->shared.rb_subtree_last =3D pgoff_last; rb_link_node(&vma->shared.rb, &parent->shared.rb, link); rb_insert_augmented(&vma->shared.rb, &mapping->i_mmap.rb_root, - &__vma_interval_tree_augment); + &__mapping_rmap_tree_augment); } =20 -void vma_interval_tree_remove(struct vm_area_struct *vma, +void mapping_rmap_tree_remove(struct vm_area_struct *vma, struct address_space *mapping) { - __vma_interval_tree_remove(vma, &mapping->i_mmap); + __mapping_rmap_tree_remove(vma, &mapping->i_mmap); } =20 struct vm_area_struct * -vma_interval_tree_iter_first(struct address_space *mapping, +mapping_rmap_tree_iter_first(struct address_space *mapping, pgoff_t pgoff_start, pgoff_t pgoff_last) { - return __vma_interval_tree_iter_first(&mapping->i_mmap, + return __mapping_rmap_tree_iter_first(&mapping->i_mmap, pgoff_start, pgoff_last); } =20 struct vm_area_struct * -vma_interval_tree_iter_next(struct vm_area_struct *vma, +mapping_rmap_tree_iter_next(struct vm_area_struct *vma, pgoff_t pgoff_start, pgoff_t pgoff_last) { - return __vma_interval_tree_iter_next(vma, pgoff_start, pgoff_last); + return __mapping_rmap_tree_iter_next(vma, pgoff_start, pgoff_last); } =20 /* Anonymous interval tree (anon_vma->rb_root) */ diff --git a/mm/khugepaged.c b/mm/khugepaged.c index e5462e026642..912be3daf37e 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2141,7 +2141,7 @@ static void retract_page_tables(struct address_space = *mapping, pgoff_t pgoff) struct vm_area_struct *vma; =20 i_mmap_lock_read(mapping); - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff) { struct mmu_notifier_range range; struct mm_struct *mm; unsigned long addr; @@ -2573,7 +2573,7 @@ static enum scan_result collapse_file(struct mm_struc= t *mm, unsigned long addr, * not be able to observe any missing pages due to the * previously inserted retry entries. */ - vma_interval_tree_foreach(vma, mapping, start, end) { + mapping_rmap_tree_foreach(vma, mapping, start, end) { if (userfaultfd_missing(vma)) { result =3D SCAN_EXCEED_NONE_PTE; goto immap_locked; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 4358856e764f..66ae93c6d4b2 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -598,7 +598,7 @@ static void collect_procs_file(const struct folio *foli= o, =20 if (!t) continue; - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff) { /* * Send early kill signal to tasks where a vma covers * the page but the corrupted page is not necessarily @@ -649,7 +649,7 @@ static void collect_procs_fsdax(const struct page *page, t =3D task_early_kill(tsk, true); if (!t) continue; - vma_interval_tree_foreach(vma, mapping, pgoff, pgoff) { + mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff) { if (vma->vm_mm =3D=3D t->mm) add_to_kill_fsdax(t, page, vma, to_kill, pgoff); } @@ -2296,7 +2296,7 @@ static void collect_procs_pfn(struct pfn_address_spac= e *pfn_space, t =3D task_early_kill(tsk, true); if (!t) continue; - vma_interval_tree_foreach(vma, mapping, 0, ULONG_MAX) { + mapping_rmap_tree_foreach(vma, mapping, 0, ULONG_MAX) { pgoff_t pgoff; =20 if (vma->vm_mm =3D=3D t->mm && diff --git a/mm/memory.c b/mm/memory.c index 6ce92badc38a..b7e9a7e53516 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4369,7 +4369,7 @@ static inline void unmap_mapping_range_tree(struct ad= dress_space *mapping, unsigned long start, size; struct mmu_gather tlb; =20 - vma_interval_tree_foreach(vma, mapping, first_index, last_index) { + mapping_rmap_tree_foreach(vma, mapping, first_index, last_index) { const pgoff_t start_idx =3D max(first_index, vma->vm_pgoff); const pgoff_t end_idx =3D min(last_index, vma_last_pgoff(vma)) + 1; =20 diff --git a/mm/mmap.c b/mm/mmap.c index 2f22fb0d068d..91eaa0c9e7ee 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1830,7 +1830,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, s= truct mm_struct *oldmm) mapping_allow_writable(mapping); flush_dcache_mmap_lock(mapping); /* insert tmp into the share list, just after mpnt */ - vma_interval_tree_insert_after(tmp, mpnt, mapping); + mapping_rmap_tree_insert_after(tmp, mpnt, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } diff --git a/mm/nommu.c b/mm/nommu.c index 13023d73d1e4..f51a4a375c8c 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -569,7 +569,7 @@ static void setup_vma_to_mm(struct vm_area_struct *vma,= struct mm_struct *mm) =20 i_mmap_lock_write(mapping); flush_dcache_mmap_lock(mapping); - vma_interval_tree_insert(vma, mapping); + mapping_rmap_tree_insert(vma, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } @@ -585,7 +585,7 @@ static void cleanup_vma_from_mm(struct vm_area_struct *= vma) =20 i_mmap_lock_write(mapping); flush_dcache_mmap_lock(mapping); - vma_interval_tree_remove(vma, mapping); + mapping_rmap_tree_remove(vma, mapping); flush_dcache_mmap_unlock(mapping); i_mmap_unlock_write(mapping); } @@ -1843,7 +1843,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, = size_t size, i_mmap_lock_read(inode->i_mapping); =20 /* search for VMAs that fall within the dead zone */ - vma_interval_tree_foreach(vma, inode->i_mapping, low, high) { + mapping_rmap_tree_foreach(vma, inode->i_mapping, low, high) { /* found one - only interested if it's shared out of the page * cache */ if (vma->vm_flags & VM_SHARED) { @@ -1859,7 +1859,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, = size_t size, * we don't check for any regions that start beyond the EOF as there * shouldn't be any */ - vma_interval_tree_foreach(vma, inode->i_mapping, 0, ULONG_MAX) { + mapping_rmap_tree_foreach(vma, inode->i_mapping, 0, ULONG_MAX) { if (!(vma->vm_flags & VM_SHARED)) continue; =20 diff --git a/mm/pagewalk.c b/mm/pagewalk.c index 490a14691660..7e7819cf5a3a 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c @@ -810,7 +810,7 @@ int walk_page_mapping(struct address_space *mapping, pg= off_t first_index, return -EINVAL; =20 lockdep_assert_held(&mapping->i_mmap_rwsem); - vma_interval_tree_foreach(vma, mapping, first_index, + mapping_rmap_tree_foreach(vma, mapping, first_index, first_index + nr - 1) { /* Clip to the vma */ vba =3D vma->vm_pgoff; diff --git a/mm/rmap.c b/mm/rmap.c index 73673cd3961e..d3d3d6cb17b8 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -3053,7 +3053,7 @@ static void __rmap_walk_file(struct folio *folio, str= uct address_space *mapping, i_mmap_lock_read(mapping); } lookup: - vma_interval_tree_foreach(vma, mapping, pgoff_start, pgoff_end) { + mapping_rmap_tree_foreach(vma, mapping, pgoff_start, pgoff_end) { unsigned long address =3D vma_address(vma, pgoff_start, nr_pages); =20 VM_BUG_ON_VMA(address =3D=3D -EFAULT, vma); diff --git a/mm/vma.c b/mm/vma.c index ce4ec4b71138..d99e2088de4e 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -234,7 +234,7 @@ static void __vma_link_file(struct vm_area_struct *vma, mapping_allow_writable(mapping); =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_insert(vma, mapping); + mapping_rmap_tree_insert(vma, mapping); flush_dcache_mmap_unlock(mapping); } =20 @@ -248,7 +248,7 @@ static void __remove_shared_vm_struct(struct vm_area_st= ruct *vma, mapping_unmap_writable(mapping); =20 flush_dcache_mmap_lock(mapping); - vma_interval_tree_remove(vma, mapping); + mapping_rmap_tree_remove(vma, mapping); flush_dcache_mmap_unlock(mapping); } =20 @@ -319,9 +319,9 @@ static void vma_prepare(struct vma_prepare *vp) =20 if (vp->file) { flush_dcache_mmap_lock(vp->mapping); - vma_interval_tree_remove(vp->vma, vp->mapping); + mapping_rmap_tree_remove(vp->vma, vp->mapping); if (vp->adj_next) - vma_interval_tree_remove(vp->adj_next, vp->mapping); + mapping_rmap_tree_remove(vp->adj_next, vp->mapping); } =20 } @@ -339,8 +339,8 @@ static void vma_complete(struct vma_prepare *vp, struct= vma_iterator *vmi, { if (vp->file) { if (vp->adj_next) - vma_interval_tree_insert(vp->adj_next, vp->mapping); - vma_interval_tree_insert(vp->vma, vp->mapping); + mapping_rmap_tree_insert(vp->adj_next, vp->mapping); + mapping_rmap_tree_insert(vp->vma, vp->mapping); flush_dcache_mmap_unlock(vp->mapping); } =20 diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/= stubs.h index 94442b29458d..37f81b11e8b7 100644 --- a/tools/testing/vma/include/stubs.h +++ b/tools/testing/vma/include/stubs.h @@ -257,12 +257,12 @@ static inline void vm_acct_memory(long pages) { } =20 -static inline void vma_interval_tree_insert(struct vm_area_struct *vma, +static inline void mapping_rmap_tree_insert(struct vm_area_struct *vma, struct address_space *mapping) { } =20 -static inline void vma_interval_tree_remove(struct vm_area_struct *vma, +static inline void mapping_rmap_tree_remove(struct vm_area_struct *vma, struct address_space *mapping) { } --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAB4C3955E1; Fri, 10 Jul 2026 20:21:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714862; cv=none; b=cjM/l8BVyrUDVhA4163pUjbysk2+IQxJirz3m4Xzm/WTEINDr/v0oCWTks/lkJP9OqIxu/bMX8Q9zQw/0KGQGIVeWU/gD7aoochdWBYH+PXPSbyDFIZlJ0+XtedwgbamtRGrdPPwJ4uvGH5pV4JmB9Ymf/04cwtywmia3gAi8Gg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714862; c=relaxed/simple; bh=wi2G0r+Tf1SXo7NAyf6w+thcPpRxIn45P/FeJkvlXvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=txW5Dt2n0bYZRRSLDK50wTeQetB0Kk8wXXIdgHzVbfy2DXZ2OYoub39AM6iKLTGEAbgviHLzqnbzfnDdWn0FXV7/weOSf0DREg5W3jiOXnl5Nktyp/FMwUa1vT0stpIDLvQ9J7UGEsbsgyV+ayWciTQ1QzsBhOFT0D0eyKQ8HdQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=j+OB8juR; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="j+OB8juR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4EF31F00A3A; Fri, 10 Jul 2026 20:20:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714860; bh=R0tTV3BrWU6tIJ5l/Y9xEK4eNmbUwb9R0gFk9DgeDT4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=j+OB8juROnaYGwXLfZwFoBlv1YPzENHjDtEQkcu6v7D6M5XCrlouzYfKBbNPTK57l cvMVR7x9p01YpTlj2sD7SYouV5KI3q5N8JqZ3t9uP7cbPHtgoV6F2pS496toVu9qjS lZ+nD/bFg0kUcCh4cIhFV/vzZR3W0GQQZMOQiCoqLBXASzmRI6FZS3+1RKf8r/agma y9qTR4W3TcNfjYX2rfIw4Pbk0yLLw1PTsPgeqKxpXoAB69AXAEsyqP4jQ9SW9aXp4U ucid0ZBJvLx2AZIB48G5FV70lMXpTGTs8SO5iH5G6rkUHQBP97XHnI17hWc5f1RIPu txMAUAjdf1xLQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:50 +0100 Subject: [PATCH v2 09/33] mm/rmap: parameterise anon_vma_interval_tree_*() by anon_vma Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-9-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8188; i=ljs@kernel.org; h=from:subject:message-id; bh=wi2G0r+Tf1SXo7NAyf6w+thcPpRxIn45P/FeJkvlXvk=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg61nzf1xcNZvTSezhx0laz3SFlw5+/6jqXrH0eVVH 777WNhN6yhlYRDjYpAVU2R5/kV8f5BI2LzOC/5uMHNYmUCGMHBxCsBErpoyMnR+fSF54xTX95Z9 D1abHLWVjdpcM0dZjL9w38PNaoZ6Nb4M//0ZeGwMe6a3c22SdX/vcWZFmJ6B9j+/j8mSBxI/S3X v5AIA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Similar to what we did with mapping_rmap_tree*(), let's declare anon_vma_interval_tree*() in terms of anon_vma rather than rb_root_cached. In each case the rb tree referenced is &anon_vma->rb_root, so just pass anon_vma and the functions can figure this out themselves. Also update the VMA userland tests to reflect the change. No functional change intended. Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- include/linux/mm.h | 11 ++++++----- mm/interval_tree.c | 13 +++++++------ mm/ksm.c | 7 ++----- mm/memory-failure.c | 3 +-- mm/rmap.c | 11 +++++------ mm/vma.c | 4 ++-- tools/testing/vma/include/stubs.h | 4 ++-- 7 files changed, 25 insertions(+), 28 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index d4ac9dc83ddd..5d825824f7e4 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4111,14 +4111,15 @@ mapping_rmap_tree_iter_next(struct vm_area_struct *= vma, pgoff_last)) =20 void anon_vma_interval_tree_insert(struct anon_vma_chain *node, - struct rb_root_cached *root); + struct anon_vma *anon_vma); void anon_vma_interval_tree_remove(struct anon_vma_chain *node, - struct rb_root_cached *root); + struct anon_vma *anon_vma); struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct rb_root_cached *root, +anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, unsigned long start, unsigned long last); -struct anon_vma_chain *anon_vma_interval_tree_iter_next( - struct anon_vma_chain *node, unsigned long start, unsigned long last); +struct anon_vma_chain * +anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, + unsigned long start, unsigned long last); #ifdef CONFIG_DEBUG_VM_RB void anon_vma_interval_tree_verify(struct anon_vma_chain *node); #endif diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 39e020555910..b82d2a0d9c4e 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -96,26 +96,27 @@ INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, unsigne= d long, rb_subtree_last, static, __anon_vma_interval_tree) =20 void anon_vma_interval_tree_insert(struct anon_vma_chain *node, - struct rb_root_cached *root) + struct anon_vma *anon_vma) { #ifdef CONFIG_DEBUG_VM_RB node->cached_vma_start =3D avc_start_pgoff(node); node->cached_vma_last =3D avc_last_pgoff(node); #endif - __anon_vma_interval_tree_insert(node, root); + __anon_vma_interval_tree_insert(node, &anon_vma->rb_root); } =20 void anon_vma_interval_tree_remove(struct anon_vma_chain *node, - struct rb_root_cached *root) + struct anon_vma *anon_vma) { - __anon_vma_interval_tree_remove(node, root); + __anon_vma_interval_tree_remove(node, &anon_vma->rb_root); } =20 struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct rb_root_cached *root, +anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, unsigned long first, unsigned long last) { - return __anon_vma_interval_tree_iter_first(root, first, last); + return __anon_vma_interval_tree_iter_first(&anon_vma->rb_root, + first, last); } =20 struct anon_vma_chain * diff --git a/mm/ksm.c b/mm/ksm.c index 41ab25aa2a82..10fccc22e5f3 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -3187,8 +3187,7 @@ void rmap_walk_ksm(struct folio *folio, struct rmap_w= alk_control *rwc) anon_vma_lock_read(anon_vma); } =20 - anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root, - 0, ULONG_MAX) { + anon_vma_interval_tree_foreach(vmac, anon_vma, 0, ULONG_MAX) { =20 cond_resched(); vma =3D vmac->vma; @@ -3249,9 +3248,7 @@ void collect_procs_ksm(const struct folio *folio, con= st struct page *page, task_early_kill(tsk, force_early); if (!t) continue; - anon_vma_interval_tree_foreach(vmac, &av->rb_root, 0, - ULONG_MAX) - { + anon_vma_interval_tree_foreach(vmac, av, 0, ULONG_MAX) { vma =3D vmac->vma; if (vma->vm_mm =3D=3D t->mm) { addr =3D rmap_item->address & PAGE_MASK; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 66ae93c6d4b2..24d660c32058 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -564,8 +564,7 @@ static void collect_procs_anon(const struct folio *foli= o, =20 if (!t) continue; - anon_vma_interval_tree_foreach(vmac, &av->rb_root, - pgoff, pgoff) { + anon_vma_interval_tree_foreach(vmac, av, pgoff, pgoff) { vma =3D vmac->vma; if (vma->vm_mm !=3D t->mm) continue; diff --git a/mm/rmap.c b/mm/rmap.c index d3d3d6cb17b8..6d4423a16c8b 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -211,7 +211,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma) if (likely(!vma->anon_vma)) { vma->anon_vma =3D anon_vma; anon_vma_chain_assign(vma, avc, anon_vma); - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); anon_vma->num_active_vmas++; allocated =3D NULL; avc =3D NULL; @@ -354,7 +354,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct v= m_area_struct *src, list_for_each_entry_reverse(avc, &dst->anon_vma_chain, same_vma) { struct anon_vma *anon_vma =3D avc->anon_vma; =20 - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); if (operation =3D=3D VMA_OP_FORK) maybe_reuse_anon_vma(dst, anon_vma); } @@ -434,7 +434,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm= _area_struct *pvma) anon_vma_chain_assign(vma, avc, anon_vma); /* Now let rmap see it. */ anon_vma_lock_write(anon_vma); - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); anon_vma->parent->num_children++; anon_vma_unlock_write(anon_vma); =20 @@ -499,7 +499,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma) list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) { struct anon_vma *anon_vma =3D avc->anon_vma; =20 - anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); + anon_vma_interval_tree_remove(avc, anon_vma); =20 /* * Leave empty anon_vmas on the list - we'll need @@ -2988,8 +2988,7 @@ static void rmap_walk_anon(struct folio *folio, =20 pgoff_start =3D folio_pgoff(folio); pgoff_end =3D pgoff_start + folio_nr_pages(folio) - 1; - anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, - pgoff_start, pgoff_end) { + anon_vma_interval_tree_foreach(avc, anon_vma, pgoff_start, pgoff_end) { struct vm_area_struct *vma =3D avc->vma; unsigned long address =3D vma_address(vma, pgoff_start, folio_nr_pages(folio)); diff --git a/mm/vma.c b/mm/vma.c index d99e2088de4e..2cd70f1d4db7 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -272,7 +272,7 @@ anon_vma_interval_tree_pre_update_vma(struct vm_area_st= ruct *vma) struct anon_vma_chain *avc; =20 list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_remove(avc, &avc->anon_vma->rb_root); + anon_vma_interval_tree_remove(avc, avc->anon_vma); } =20 static void @@ -281,7 +281,7 @@ anon_vma_interval_tree_post_update_vma(struct vm_area_s= truct *vma) struct anon_vma_chain *avc; =20 list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_insert(avc, &avc->anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, avc->anon_vma); } =20 /* diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/= stubs.h index 37f81b11e8b7..3a11547b5bd1 100644 --- a/tools/testing/vma/include/stubs.h +++ b/tools/testing/vma/include/stubs.h @@ -272,12 +272,12 @@ static inline void flush_dcache_mmap_unlock(struct ad= dress_space *mapping) } =20 static inline void anon_vma_interval_tree_insert(struct anon_vma_chain *av= c, - struct rb_root_cached *rb) + struct anon_vma *anon_vma) { } =20 static inline void anon_vma_interval_tree_remove(struct anon_vma_chain *av= c, - struct rb_root_cached *rb) + struct anon_vma *anon_vma) { } =20 --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E95A63955E1; Fri, 10 Jul 2026 20:21:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714885; cv=none; b=UZs9TiSYrOBrazHMYwZGqgvcPkbszlCV8Q61zXCDCmwjhxwsUfzZA6NKpiwBEc2MrHyuXSBUmZuPASLHrSPv7ti8rVBOhPO430P7+Jdj1kILV0oY2OKy0/FY/JY8JnvbHvUlnYEcR1ynOWbQxmtty3QqnNQ8UN8wRUAqg3uK7mQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714885; c=relaxed/simple; bh=BHX0baiEr9bg7gCqCCxbadqLVVJLcigeq+b/x/sekB0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I+dV/zC0t0xP+BUkoo69vLe+vrLJz8ZCFycsgxtuLviVifPghruM9XValNEeAZdRAhjGLCe6dhE84EZmK3fd7mm2wiuAsk0GA3gWmkqXxC54Mt+LZpuORFJ8bp2amqCkAg8wfKaoajbfrcKV3MWYRaI4sCN4NcQR/bRlHMKsSeE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YA5DDqaf; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YA5DDqaf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D21581F000E9; Fri, 10 Jul 2026 20:21:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714883; bh=gVQmK7W6QoKtw/kGvaitEcUKY+xFpiYNr8Q5ruqmHhg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YA5DDqafLIqNPLP9XGD/K2+Z42mVK146zNneUnUQphi9T6ZT5dS9mtuvVEfhJDTSi s//g62lEPa/5fM6Rj+MfHLeFXY4lmP8YRRNVv/IBUuJF+3suQJzo279O+JLZ3oR0g8 17RPG3oi0R+HZ04oSDHcjxfiOvDAfUyl/59WBZGvYlcTsOfv5QtyYXwRI0mROoCNg6 bDmWqupn7Bivg41Bjy1cY8FcRJcw1cPUnFVaTBUJXi8e+rHys2oigCKJ0ZN7zH42Qh xqfydxdwf+sygnAcS/tTpUOLud5oxgOgbKSoUNdV2wDLWFryUxryD6cA7pwzceYtQs toirvlGHi640Q== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:51 +0100 Subject: [PATCH v2 10/33] mm/rmap: rename anon_vma_interval_tree_*() params and use pgoff_t Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-10-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5211; i=ljs@kernel.org; h=from:subject:message-id; bh=BHX0baiEr9bg7gCqCCxbadqLVVJLcigeq+b/x/sekB0=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg62/nLvR48oWtTJvwtcdDA9nW79gPecs6J5qwZB8n +XZu7VdHaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZgIkw4jQxvjWqM9y/w8s1l1 C5JkljBK2jl9eq/WKbJLfeZ/rp9NCxn+GTsztZksXHtZye1dF8fVwCnL321Zn9aseENRcKXNgt5 7/AA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Rename parameters used by anon_vma_interval_tree_*() functions: 'node' to 'avc', 'start/first' to 'pgoff_start', and 'last' to 'pgoff_last' to make clear what is being passed. Also, express page offsets in terms of pgoff_t to be consistent. No functional change intended. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- include/linux/mm.h | 19 +++++++++++-------- mm/interval_tree.c | 34 +++++++++++++++++----------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 5d825824f7e4..ae7c976b516a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4110,23 +4110,26 @@ mapping_rmap_tree_iter_next(struct vm_area_struct *= vma, vma; vma =3D mapping_rmap_tree_iter_next(vma, pgoff_start, \ pgoff_last)) =20 -void anon_vma_interval_tree_insert(struct anon_vma_chain *node, +void anon_vma_interval_tree_insert(struct anon_vma_chain *avc, struct anon_vma *anon_vma); -void anon_vma_interval_tree_remove(struct anon_vma_chain *node, +void anon_vma_interval_tree_remove(struct anon_vma_chain *avc, struct anon_vma *anon_vma); + struct anon_vma_chain * anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, - unsigned long start, unsigned long last); + pgoff_t pgoff_start, pgoff_t pgoff_last); struct anon_vma_chain * anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, - unsigned long start, unsigned long last); + pgoff_t pgoff_start, pgoff_t pgoff_last); #ifdef CONFIG_DEBUG_VM_RB -void anon_vma_interval_tree_verify(struct anon_vma_chain *node); +void anon_vma_interval_tree_verify(struct anon_vma_chain *avc); #endif =20 -#define anon_vma_interval_tree_foreach(avc, root, start, last) \ - for (avc =3D anon_vma_interval_tree_iter_first(root, start, last); \ - avc; avc =3D anon_vma_interval_tree_iter_next(avc, start, last)) +#define anon_vma_interval_tree_foreach(avc, anon_vma, pgoff_start, pgoff_l= ast) \ + for (avc =3D anon_vma_interval_tree_iter_first(anon_vma, pgoff_start, \ + pgoff_last); \ + avc; avc =3D anon_vma_interval_tree_iter_next(avc, pgoff_start, \ + pgoff_last)) =20 /* mmap.c */ extern int __vm_enough_memory(const struct mm_struct *mm, long pages, int = cap_sys_admin); diff --git a/mm/interval_tree.c b/mm/interval_tree.c index b82d2a0d9c4e..5bfe95b5cd28 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -81,55 +81,55 @@ mapping_rmap_tree_iter_next(struct vm_area_struct *vma, =20 /* Anonymous interval tree (anon_vma->rb_root) */ =20 -static unsigned long avc_start_pgoff(struct anon_vma_chain *avc) +static pgoff_t avc_start_pgoff(struct anon_vma_chain *avc) { return vma_start_pgoff(avc->vma); } =20 -static unsigned long avc_last_pgoff(struct anon_vma_chain *avc) +static pgoff_t avc_last_pgoff(struct anon_vma_chain *avc) { return vma_last_pgoff(avc->vma); } =20 -INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, unsigned long, rb_subtree_= last, +INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, pgoff_t, rb_subtree_last, avc_start_pgoff, avc_last_pgoff, static, __anon_vma_interval_tree) =20 -void anon_vma_interval_tree_insert(struct anon_vma_chain *node, +void anon_vma_interval_tree_insert(struct anon_vma_chain *avc, struct anon_vma *anon_vma) { #ifdef CONFIG_DEBUG_VM_RB - node->cached_vma_start =3D avc_start_pgoff(node); - node->cached_vma_last =3D avc_last_pgoff(node); + avc->cached_vma_start =3D avc_start_pgoff(avc); + avc->cached_vma_last =3D avc_last_pgoff(avc); #endif - __anon_vma_interval_tree_insert(node, &anon_vma->rb_root); + __anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); } =20 -void anon_vma_interval_tree_remove(struct anon_vma_chain *node, +void anon_vma_interval_tree_remove(struct anon_vma_chain *avc, struct anon_vma *anon_vma) { - __anon_vma_interval_tree_remove(node, &anon_vma->rb_root); + __anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); } =20 struct anon_vma_chain * anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, - unsigned long first, unsigned long last) + pgoff_t pgoff_start, pgoff_t pgoff_last) { return __anon_vma_interval_tree_iter_first(&anon_vma->rb_root, - first, last); + pgoff_start, pgoff_last); } =20 struct anon_vma_chain * -anon_vma_interval_tree_iter_next(struct anon_vma_chain *node, - unsigned long first, unsigned long last) +anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, + pgoff_t pgoff_start, pgoff_t pgoff_last) { - return __anon_vma_interval_tree_iter_next(node, first, last); + return __anon_vma_interval_tree_iter_next(avc, pgoff_start, pgoff_last); } =20 #ifdef CONFIG_DEBUG_VM_RB -void anon_vma_interval_tree_verify(struct anon_vma_chain *node) +void anon_vma_interval_tree_verify(struct anon_vma_chain *avc) { - WARN_ON_ONCE(node->cached_vma_start !=3D avc_start_pgoff(node)); - WARN_ON_ONCE(node->cached_vma_last !=3D avc_last_pgoff(node)); + WARN_ON_ONCE(avc->cached_vma_start !=3D avc_start_pgoff(avc)); + WARN_ON_ONCE(avc->cached_vma_last !=3D avc_last_pgoff(avc)); } #endif --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7F2737F01F; Fri, 10 Jul 2026 20:21:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714908; cv=none; b=HJCXfBBkTP0Bv1nnYv7OYrgETDE7/yuZOyDRefQvkQlI17jUopaHA1rpCFWKih7k8RaDHTHTswsSP/XNCBNoS3+F+CHZMLBUGl9fu0kHfzFvuEa7Bec8Nz1K8RAqUqVlCoW7GceUeoKaPQC/Fl6dMCUIKHtcNmvfOyes/NPZXh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714908; c=relaxed/simple; bh=QIh/wHED/x3vUIojrTapMUaEqiLB6lsiBuz6hviQqKk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HwlMmteAJaoKkl+mptW7dedNN/1EYYxeexzxdSO3JCHEdfvSzxU5i4rOxxiZkBXKQwbRJ6c3V8OfTK1w8fGx5phw5VAhvyj0XDy1ZJr6YImeDgrPBJGjm0EVCFdH7snAtUVyXp6wiTRPX9M2HbbpJ/2NoQ6CrtR2Vu2/4k+LnKM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RwSqHlF5; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RwSqHlF5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0BBF1F00A3A; Fri, 10 Jul 2026 20:21:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714906; bh=6ADg/hEbWmy/12b61reEQKb2Q6dpfi0RDajVlCkBx9A=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=RwSqHlF5RvJEEn4ErgWmKYOk3ZNA/NYs5iVUHanpU0fENasllQUkcW9jyApuwPJUj a7eN9NLCu0Ex40SgOC5Ag9dwZYp5JwadBsKdnIjIVVwzeZspTkROWs7QVeMFZz1mWO hqbxrwH6VSB6kjD1KbfafnfAZjTH35xRIjD2wl9XlX0sHE9H/MpiCs2YTpkCNQ6Ud5 ZkLqfA1kVv4k2FJ2Zq63YpAwgUQJzKyU02SjWFjZAvR9kBXwvtaLKtdvbq9aMQe7Rr aAdi7K9V3jayk8hMKG/qxFbOcOJLwhTs28jRl/n/kTh025kbHDI8CVvk0Tzb/sgyMd XUZVvVRrktafA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:52 +0100 Subject: [PATCH v2 11/33] mm/rmap: rename anon_vma_interval_tree_*() to anon_rmap_tree_*() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-11-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=12674; i=ljs@kernel.org; h=from:subject:message-id; bh=QIh/wHED/x3vUIojrTapMUaEqiLB6lsiBuz6hviQqKk=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg613Kvj0Tr805Y/Xh4rOO3+1f705tfZh9qG2VVk5t VemTC2r6ShlYRDjYpAVU2R5/kV8f5BI2LzOC/5uMHNYmUCGMHBxCsBEiqUZ/vs37Vacemxfzzrm 6T/Lfz6Oe8A7ScOt3yXny/Gd75l+TghnZFj+cFFc/HN+7gsK87a/nZDv+dvTXND9o8d81k1TdnL bBfABAA== X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 To be consistent with the newly renamed mapping_rmap_tree_*(), rename the anon_vma_interval_tree_*() helpers to anon_rmap_tree_*(). No functional change intended. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- include/linux/mm.h | 27 ++++++++++++--------------- mm/interval_tree.c | 30 +++++++++++++++--------------- mm/ksm.c | 4 ++-- mm/memory-failure.c | 2 +- mm/rmap.c | 10 +++++----- mm/vma.c | 30 +++++++++++++++--------------- tools/testing/vma/include/stubs.h | 8 ++++---- 7 files changed, 54 insertions(+), 57 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index ae7c976b516a..3d69b597b9b1 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4110,26 +4110,23 @@ mapping_rmap_tree_iter_next(struct vm_area_struct *= vma, vma; vma =3D mapping_rmap_tree_iter_next(vma, pgoff_start, \ pgoff_last)) =20 -void anon_vma_interval_tree_insert(struct anon_vma_chain *avc, - struct anon_vma *anon_vma); -void anon_vma_interval_tree_remove(struct anon_vma_chain *avc, - struct anon_vma *anon_vma); - +void anon_rmap_tree_insert(struct anon_vma_chain *avc, + struct anon_vma *anon_vma); +void anon_rmap_tree_remove(struct anon_vma_chain *avc, + struct anon_vma *anon_vma); struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, - pgoff_t pgoff_start, pgoff_t pgoff_last); +anon_rmap_tree_iter_first(struct anon_vma *anon_vma, + pgoff_t pgoff_start, pgoff_t pgoff_last); struct anon_vma_chain * -anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, - pgoff_t pgoff_start, pgoff_t pgoff_last); +anon_rmap_tree_iter_next(struct anon_vma_chain *avc, + pgoff_t pgoff_start, pgoff_t pgoff_last); #ifdef CONFIG_DEBUG_VM_RB -void anon_vma_interval_tree_verify(struct anon_vma_chain *avc); +void anon_rmap_tree_verify(struct anon_vma_chain *avc); #endif =20 -#define anon_vma_interval_tree_foreach(avc, anon_vma, pgoff_start, pgoff_l= ast) \ - for (avc =3D anon_vma_interval_tree_iter_first(anon_vma, pgoff_start, \ - pgoff_last); \ - avc; avc =3D anon_vma_interval_tree_iter_next(avc, pgoff_start, \ - pgoff_last)) +#define anon_rmap_tree_foreach(avc, anon_vma, pgoff_start, pgoff_last) \ + for (avc =3D anon_rmap_tree_iter_first(anon_vma, pgoff_start, pgoff_last)= ; \ + avc; avc =3D anon_rmap_tree_iter_next(avc, pgoff_start, pgoff_last)) =20 /* mmap.c */ extern int __vm_enough_memory(const struct mm_struct *mm, long pages, int = cap_sys_admin); diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 5bfe95b5cd28..3ae9e106d3af 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -93,41 +93,41 @@ static pgoff_t avc_last_pgoff(struct anon_vma_chain *av= c) =20 INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, pgoff_t, rb_subtree_last, avc_start_pgoff, avc_last_pgoff, - static, __anon_vma_interval_tree) + static, __anon_rmap_tree) =20 -void anon_vma_interval_tree_insert(struct anon_vma_chain *avc, - struct anon_vma *anon_vma) +void anon_rmap_tree_insert(struct anon_vma_chain *avc, + struct anon_vma *anon_vma) { #ifdef CONFIG_DEBUG_VM_RB avc->cached_vma_start =3D avc_start_pgoff(avc); avc->cached_vma_last =3D avc_last_pgoff(avc); #endif - __anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + __anon_rmap_tree_insert(avc, &anon_vma->rb_root); } =20 -void anon_vma_interval_tree_remove(struct anon_vma_chain *avc, - struct anon_vma *anon_vma) +void anon_rmap_tree_remove(struct anon_vma_chain *avc, + struct anon_vma *anon_vma) { - __anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); + __anon_rmap_tree_remove(avc, &anon_vma->rb_root); } =20 struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, - pgoff_t pgoff_start, pgoff_t pgoff_last) +anon_rmap_tree_iter_first(struct anon_vma *anon_vma, + pgoff_t pgoff_start, pgoff_t pgoff_last) { - return __anon_vma_interval_tree_iter_first(&anon_vma->rb_root, - pgoff_start, pgoff_last); + return __anon_rmap_tree_iter_first(&anon_vma->rb_root, + pgoff_start, pgoff_last); } =20 struct anon_vma_chain * -anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, - pgoff_t pgoff_start, pgoff_t pgoff_last) +anon_rmap_tree_iter_next(struct anon_vma_chain *avc, + pgoff_t pgoff_start, pgoff_t pgoff_last) { - return __anon_vma_interval_tree_iter_next(avc, pgoff_start, pgoff_last); + return __anon_rmap_tree_iter_next(avc, pgoff_start, pgoff_last); } =20 #ifdef CONFIG_DEBUG_VM_RB -void anon_vma_interval_tree_verify(struct anon_vma_chain *avc) +void anon_rmap_tree_verify(struct anon_vma_chain *avc) { WARN_ON_ONCE(avc->cached_vma_start !=3D avc_start_pgoff(avc)); WARN_ON_ONCE(avc->cached_vma_last !=3D avc_last_pgoff(avc)); diff --git a/mm/ksm.c b/mm/ksm.c index 10fccc22e5f3..b3fb59a0e0d1 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -3187,7 +3187,7 @@ void rmap_walk_ksm(struct folio *folio, struct rmap_w= alk_control *rwc) anon_vma_lock_read(anon_vma); } =20 - anon_vma_interval_tree_foreach(vmac, anon_vma, 0, ULONG_MAX) { + anon_rmap_tree_foreach(vmac, anon_vma, 0, ULONG_MAX) { =20 cond_resched(); vma =3D vmac->vma; @@ -3248,7 +3248,7 @@ void collect_procs_ksm(const struct folio *folio, con= st struct page *page, task_early_kill(tsk, force_early); if (!t) continue; - anon_vma_interval_tree_foreach(vmac, av, 0, ULONG_MAX) { + anon_rmap_tree_foreach(vmac, av, 0, ULONG_MAX) { vma =3D vmac->vma; if (vma->vm_mm =3D=3D t->mm) { addr =3D rmap_item->address & PAGE_MASK; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 24d660c32058..aaf14608b30e 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -564,7 +564,7 @@ static void collect_procs_anon(const struct folio *foli= o, =20 if (!t) continue; - anon_vma_interval_tree_foreach(vmac, av, pgoff, pgoff) { + anon_rmap_tree_foreach(vmac, av, pgoff, pgoff) { vma =3D vmac->vma; if (vma->vm_mm !=3D t->mm) continue; diff --git a/mm/rmap.c b/mm/rmap.c index 6d4423a16c8b..e854679553b9 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -211,7 +211,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma) if (likely(!vma->anon_vma)) { vma->anon_vma =3D anon_vma; anon_vma_chain_assign(vma, avc, anon_vma); - anon_vma_interval_tree_insert(avc, anon_vma); + anon_rmap_tree_insert(avc, anon_vma); anon_vma->num_active_vmas++; allocated =3D NULL; avc =3D NULL; @@ -354,7 +354,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct v= m_area_struct *src, list_for_each_entry_reverse(avc, &dst->anon_vma_chain, same_vma) { struct anon_vma *anon_vma =3D avc->anon_vma; =20 - anon_vma_interval_tree_insert(avc, anon_vma); + anon_rmap_tree_insert(avc, anon_vma); if (operation =3D=3D VMA_OP_FORK) maybe_reuse_anon_vma(dst, anon_vma); } @@ -434,7 +434,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm= _area_struct *pvma) anon_vma_chain_assign(vma, avc, anon_vma); /* Now let rmap see it. */ anon_vma_lock_write(anon_vma); - anon_vma_interval_tree_insert(avc, anon_vma); + anon_rmap_tree_insert(avc, anon_vma); anon_vma->parent->num_children++; anon_vma_unlock_write(anon_vma); =20 @@ -499,7 +499,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma) list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) { struct anon_vma *anon_vma =3D avc->anon_vma; =20 - anon_vma_interval_tree_remove(avc, anon_vma); + anon_rmap_tree_remove(avc, anon_vma); =20 /* * Leave empty anon_vmas on the list - we'll need @@ -2988,7 +2988,7 @@ static void rmap_walk_anon(struct folio *folio, =20 pgoff_start =3D folio_pgoff(folio); pgoff_end =3D pgoff_start + folio_nr_pages(folio) - 1; - anon_vma_interval_tree_foreach(avc, anon_vma, pgoff_start, pgoff_end) { + anon_rmap_tree_foreach(avc, anon_vma, pgoff_start, pgoff_end) { struct vm_area_struct *vma =3D avc->vma; unsigned long address =3D vma_address(vma, pgoff_start, folio_nr_pages(folio)); diff --git a/mm/vma.c b/mm/vma.c index 2cd70f1d4db7..35ba3475128f 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -258,30 +258,30 @@ static void __remove_shared_vm_struct(struct vm_area_= struct *vma, * * Before updating the vma's vm_start / vm_end / vm_pgoff fields, the * vma must be removed from the anon_vma's interval trees using - * anon_vma_interval_tree_pre_update_vma(). + * anon_rmap_tree_pre_update_vma(). * * After the update, the vma will be reinserted using - * anon_vma_interval_tree_post_update_vma(). + * anon_rmap_tree_post_update_vma(). * * The entire update must be protected by exclusive mmap_lock and by * the root anon_vma's mutex. */ static void -anon_vma_interval_tree_pre_update_vma(struct vm_area_struct *vma) +anon_rmap_tree_pre_update_vma(struct vm_area_struct *vma) { struct anon_vma_chain *avc; =20 list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_remove(avc, avc->anon_vma); + anon_rmap_tree_remove(avc, avc->anon_vma); } =20 static void -anon_vma_interval_tree_post_update_vma(struct vm_area_struct *vma) +anon_rmap_tree_post_update_vma(struct vm_area_struct *vma) { struct anon_vma_chain *avc; =20 list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_insert(avc, avc->anon_vma); + anon_rmap_tree_insert(avc, avc->anon_vma); } =20 /* @@ -312,9 +312,9 @@ static void vma_prepare(struct vma_prepare *vp) =20 if (vp->anon_vma) { anon_vma_lock_write(vp->anon_vma); - anon_vma_interval_tree_pre_update_vma(vp->vma); + anon_rmap_tree_pre_update_vma(vp->vma); if (vp->adj_next) - anon_vma_interval_tree_pre_update_vma(vp->adj_next); + anon_rmap_tree_pre_update_vma(vp->adj_next); } =20 if (vp->file) { @@ -359,9 +359,9 @@ static void vma_complete(struct vma_prepare *vp, struct= vma_iterator *vmi, } =20 if (vp->anon_vma) { - anon_vma_interval_tree_post_update_vma(vp->vma); + anon_rmap_tree_post_update_vma(vp->vma); if (vp->adj_next) - anon_vma_interval_tree_post_update_vma(vp->adj_next); + anon_rmap_tree_post_update_vma(vp->adj_next); anon_vma_unlock_write(vp->anon_vma); } =20 @@ -677,7 +677,7 @@ void validate_mm(struct mm_struct *mm) if (anon_vma) { anon_vma_lock_read(anon_vma); list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_verify(avc); + anon_rmap_tree_verify(avc); anon_vma_unlock_read(anon_vma); } #endif @@ -3177,11 +3177,11 @@ int expand_upwards(struct vm_area_struct *vma, unsi= gned long address) if (vma_test(vma, VMA_LOCKED_BIT)) mm->locked_vm +=3D grow; vm_stat_account(mm, vma->vm_flags, grow); - anon_vma_interval_tree_pre_update_vma(vma); + anon_rmap_tree_pre_update_vma(vma); vma->vm_end =3D address; /* Overwrite old entry in mtree. */ vma_iter_store_overwrite(&vmi, vma); - anon_vma_interval_tree_post_update_vma(vma); + anon_rmap_tree_post_update_vma(vma); =20 perf_event_mmap(vma); } @@ -3256,12 +3256,12 @@ int expand_downwards(struct vm_area_struct *vma, un= signed long address) if (vma_test(vma, VMA_LOCKED_BIT)) mm->locked_vm +=3D grow; vm_stat_account(mm, vma->vm_flags, grow); - anon_vma_interval_tree_pre_update_vma(vma); + anon_rmap_tree_pre_update_vma(vma); vma->vm_start =3D address; vma->vm_pgoff -=3D grow; /* Overwrite old entry in mtree. */ vma_iter_store_overwrite(&vmi, vma); - anon_vma_interval_tree_post_update_vma(vma); + anon_rmap_tree_post_update_vma(vma); =20 perf_event_mmap(vma); } diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/= stubs.h index 3a11547b5bd1..d6136e19a8af 100644 --- a/tools/testing/vma/include/stubs.h +++ b/tools/testing/vma/include/stubs.h @@ -271,13 +271,13 @@ static inline void flush_dcache_mmap_unlock(struct ad= dress_space *mapping) { } =20 -static inline void anon_vma_interval_tree_insert(struct anon_vma_chain *av= c, - struct anon_vma *anon_vma) +static inline void anon_rmap_tree_insert(struct anon_vma_chain *avc, + struct anon_vma *anon_vma) { } =20 -static inline void anon_vma_interval_tree_remove(struct anon_vma_chain *av= c, - struct anon_vma *anon_vma) +static inline void anon_rmap_tree_remove(struct anon_vma_chain *avc, + struct anon_vma *anon_vma) { } =20 --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2418E397E91; Fri, 10 Jul 2026 20:22:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714931; cv=none; b=kYsonPpPfU5mQE0Utq0REg2eRsaKDJ4gkKZ6utc0l3MQjyqFaO0T663T/DukQLtwo55gERvUrgh5uhCh8xl9geRYzusENph7W8Pof0AFM80GMt/JPLndtMQHzA0Se81Fz7JOn/N8wxmqA4GCP1Qsunkp8RScHGorreIH5QvCKOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714931; c=relaxed/simple; bh=mLgNYeeooTfeSgODnN2j9KxYGDmFa4rlCkKK11Bijx0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aKPMplDrFDG7cuwO9kVR1OwFPe1/KROXroAoe/uYn/1kRHNBW3mzWlCZwcI2cd13vltgl6zxKgnoTTRK4OvpBQ5bJi18FllI21qI993rC/YCM2jiE8NS34h2ucQrMUSdkC7AnTdToKNl4emL5DGsPAw3d5dYZKOSOiDXb2NLF84= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YNDixLET; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YNDixLET" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 161461F000E9; Fri, 10 Jul 2026 20:21:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714929; bh=mp2XcEzmrsUMsE6Z8vlg0yAD1+XKOgCHxsSBkhx0qCg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YNDixLETTihnC81MSj5vI2w82St/z2bpWmYfKR8ywUGWm3Jp3GYvqd7wjfiVfTRbg J4IfC7fCrwanGf6IJfkBZoOzbWd5REyZOciwm+c+SNLmMSkNXr9JC6qBv7H5tO6MlJ XLpER1fSQILJDtWnNEHpFgaEaCQjFjRgc57TuNj+cVvkEcW55HnugAjEYQRCVU4Sn8 lrJn3V6v4WujodJw3PNzBE6sug/YLghVyz4gNrEl98e/IZkI9SyBn7OYmnBLAraswy RRmsSaDGg2eFi7Dr/+iUd6PPljAxeHSxrN/6w5OIhDkKLEDsrKLlceKXQkUDBzcxxx I2w5Kwx8etXxw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:53 +0100 Subject: [PATCH v2 12/33] MAINTAINERS: Move mm/interval_tree.c to rmap section Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-12-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=909; i=ljs@kernel.org; h=from:subject:message-id; bh=mLgNYeeooTfeSgODnN2j9KxYGDmFa4rlCkKK11Bijx0=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg62b0rarxqkEWXU1vhHT+ft4/uldajUyJw9vXaP5a L3kyaT/HaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZgIuxrD/0qvjxoNTUff7Xl0 ND5tn1zYsuAJxRs7+ez43wsU8Sldfs7I8OLfR6m7kr8nLuTfXF7/67wLy+JVk03/vGQyPpKWZui gxg8A X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 This file implements code for the interval trees used by the file and anon rmap implementation, so belongs in the rmap section. Acked-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Liam R. Howlett (Oracle) Acked-by: Christian K=C3=B6nig Acked-by: Vlastimil Babka (SUSE) Acked-by: Zi Yan --- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index c3e535ca4bef..ef168b583325 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -17208,6 +17208,7 @@ R: Lance Yang L: linux-mm@kvack.org S: Maintained F: include/linux/rmap.h +F: mm/interval_tree.c F: mm/page_vma_mapped.c F: mm/rmap.c F: tools/testing/selftests/mm/rmap.c @@ -17313,7 +17314,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/gi= t/akpm/mm F: include/trace/events/mmap.h F: fs/proc/task_mmu.c F: fs/proc/task_nommu.c -F: mm/interval_tree.c F: mm/mincore.c F: mm/mlock.c F: mm/mmap.c --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 456EB44998C; Fri, 10 Jul 2026 20:22:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714954; cv=none; b=uC/UtVy2Kocy+EvbAsOhsx6/biCI+2T9DmY7LiNEiwuFxffIwjJfsCAwPXQOIqOW0175my48o+lRb2aJ1RhzHCZNkllXCtOmyL2nwzoN5OxCQsudSG6jE7DugKHGncRtu5VKnwxtI9PEQZGjoYr+94js4Rp905Y+x0mKK7KGOu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714954; c=relaxed/simple; bh=9w7HTwMbIR3XlC1PY7gTQx5p4l7ISN45M8ruExx6jwU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U7ya52f6F+8cxVhIV/gteOboBG4LbvxUt4qy+017mkB6LhA/y367xg417mG981zArelgWgsmSEKLrmEfRIw0DL6rOkT4/Rghn+gW7NB5C4utDdw4y6OwrD98QW46RYqOGtvfKwXcHKva+DzgqIMSQMuELf9YhLv8UhRldxnRcQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cmnlAT5w; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cmnlAT5w" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 41A311F00A3A; Fri, 10 Jul 2026 20:22:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714952; bh=pXMh/gI7Ejl6sQaq6pNCmizKlHMxVh3sNzK86kWl2h4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=cmnlAT5wzlYt3brmt40tysj0J5B1gKaWPdvxMOyfuvulZ+5sH8m2RssNtYd7kJ9hM 3JEic/R7P0blm57mcQ0VabhZOtCOAB4dhCKn5vcEPWkjCnXEjOckc/MFsTHkCovBo4 dEg/4zgFADMecv/GyNsJqD96QSHp1WhhbtMbrSCjAIUGp0fIoob9V7aAjMbXb5Yjae iBWFOm0BbeaaXFduRQLeC1gA41fycIKRojdC7cmdk7PU3JZWYDX4zaGQz3M2yYKf1w SU3WfX6qJrW400SI9+5KSdVXY3Bp5Pl2jDAeKWzdIH9ZClW5J9NYnrxx0HvA7R6dwl m3LRjk41KWVYQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:54 +0100 Subject: [PATCH v2 13/33] mm/vma: introduce and use vmg_pages(), vmg_[start, end]_pgoff() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-13-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3014; i=ljs@kernel.org; h=from:subject:message-id; bh=9w7HTwMbIR3XlC1PY7gTQx5p4l7ISN45M8ruExx6jwU=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg61/Za29l6e37xfjD8NZsUc+LmZ86SXA+JLr6YcvJ poWjBckOkpZGMS4GGTFFFmefxHfHyQSNq/zgr8bzBxWJpAhDFycAjARbUmG/9VbDidYv8s915f2 n5N9N+szsfC93vKXTXQ3b1lYeO7JPxtGhmm3bFJOBQZ+EvJqXVpxqdBDXn1u0dxHp0v5fk/fOXu jNCcA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 In the VMA logic we often need to determine the number of pages in the specified merge range, as well as the start and end page offsets of that range. Introduce and use helpers for these purposes. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- mm/vma.c | 11 ++++------- mm/vma.h | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 35ba3475128f..995de8198fbb 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -197,11 +197,9 @@ static void init_multi_vma_prep(struct vma_prepare *vp, */ static bool can_vma_merge_before(struct vma_merge_struct *vmg) { - pgoff_t pglen =3D PHYS_PFN(vmg->end - vmg->start); - if (is_mergeable_vma(vmg, /* merge_next =3D */ true) && is_mergeable_anon_vma(vmg, /* merge_next =3D */ true)) { - if (vmg->next->vm_pgoff =3D=3D vmg->pgoff + pglen) + if (vmg_end_pgoff(vmg) =3D=3D vma_start_pgoff(vmg->next)) return true; } =20 @@ -221,7 +219,7 @@ static bool can_vma_merge_after(struct vma_merge_struct= *vmg) { if (is_mergeable_vma(vmg, /* merge_next =3D */ false) && is_mergeable_anon_vma(vmg, /* merge_next =3D */ false)) { - if (vmg->prev->vm_pgoff + vma_pages(vmg->prev) =3D=3D vmg->pgoff) + if (vma_end_pgoff(vmg->prev) =3D=3D vmg_start_pgoff(vmg)) return true; } return false; @@ -759,7 +757,7 @@ static int commit_merge(struct vma_merge_struct *vmg) */ vma_adjust_trans_huge(vma, vmg->start, vmg->end, vmg->__adjust_middle_start ? vmg->middle : NULL); - vma_set_range(vma, vmg->start, vmg->end, vmg->pgoff); + vma_set_range(vma, vmg->start, vmg->end, vmg_start_pgoff(vmg)); vmg_adjust_set_range(vmg); vma_iter_store_overwrite(vmg->vmi, vmg->target); =20 @@ -962,8 +960,7 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( * middle next * shrink/delete extend */ - - pgoff_t pglen =3D PHYS_PFN(vmg->end - vmg->start); + const pgoff_t pglen =3D vmg_pages(vmg); =20 VM_WARN_ON_VMG(!merge_right, vmg); /* If we are offset into a VMA, then prev must be middle. */ diff --git a/mm/vma.h b/mm/vma.h index 8e4b61a7304c..527716c8739d 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -230,6 +230,23 @@ static inline bool vmg_nomem(struct vma_merge_struct *= vmg) return vmg->state =3D=3D VMA_MERGE_ERROR_NOMEM; } =20 +static inline pgoff_t vmg_start_pgoff(const struct vma_merge_struct *vmg) +{ + return vmg->pgoff; +} + +static inline pgoff_t vmg_pages(const struct vma_merge_struct *vmg) +{ + const unsigned long size =3D vmg->end - vmg->start; + + return size >> PAGE_SHIFT; +} + +static inline pgoff_t vmg_end_pgoff(const struct vma_merge_struct *vmg) +{ + return vmg_start_pgoff(vmg) + vmg_pages(vmg); +} + /* Assumes addr >=3D vma->vm_start. */ static inline pgoff_t vma_pgoff_offset(struct vm_area_struct *vma, unsigned long addr) --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6987544998C; Fri, 10 Jul 2026 20:22:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714977; cv=none; b=D0+WY/rbAeduXB1e1yCNmrRd31RuVYnrOnitUQ7rYimdRwkw/5Gyd/kNzGiFxZ/4YDiCAlhR6GQUZjvpxc6WGJfyvNUdvQjTocvhavBO2yT0B/iBnfn9pJ8A17/zLTq5gBdkC7vE/+CGvyTT8R8JTthc8tcv4WcFXgC66/fNDUk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783714977; c=relaxed/simple; bh=Ckq9F1B5R4ctEUJqWXYT1jV2i9Vim92hn6PkYJsjcDc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QvhB/8j2xglgO6RbQMop7fwUrxcbfK6JuMHyESNHhgZSaSrv0OYjmnMIxj1ePJHB3p6Xed9j/mno9lNMcIMvkEEZT9lQGTWdmMNoEVJDdgATLjCNS9amt4WDKtkYRGdGgDEa4aNlYo7DhPh6U1O1L2hdR+VEGgOnHK3Q7zyiDh0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BygF57wD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BygF57wD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C69F1F000E9; Fri, 10 Jul 2026 20:22:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714976; bh=g95Hx/jZszTYl/mqKEmmLN3wpFLfcUCiQ7oLxyYPtwI=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=BygF57wD+F4oIx2IjGBmXSgdeyH+kDz20QKqfZkY+JeciaIqrpYGeXs92Dhu1bJQg yDrXtWAFvHrGJ01GVLJpGEYigWux3ULkArB6G87U6BG+mND6GeRsCRQIqxn7ZB/Co7 WX5bQzX3DHLJV8P5v5PFCfG2UwKM4+ICy3syuuKgzN0aQLrIra+79BjIq5f/isekmS 4O/AIhZQ8j5j/Q1gq+aeN84CaAkEZVoCKAwBtKJrHGY5odfGQwzjga9mJoIKacknvz VLOYvIoanmU23sKzVnBYRU2knQpn2FpJ7GQeLdVOWXN6EA1E/tTlccruzKODHlic/F MkoQCxvPMfndg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:55 +0100 Subject: [PATCH v2 14/33] mm/vma: clean up anon_vma_compatible() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-14-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1642; i=ljs@kernel.org; h=from:subject:message-id; bh=Ckq9F1B5R4ctEUJqWXYT1jV2i9Vim92hn6PkYJsjcDc=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg20UN7HtLM/vyXsTFrxVYsWpHDm18w4P5+XM12s5+ WWHrvf0jlIWBjEuBlkxRZbnX8T3B4mEzeu84O8GM4eVCWQIAxenANzkqYwMU33rlv+/mL9e+HWT WHxes/ljhqb8yMyVr44wrbuqccd5DcNfmT/8Ns92pKWUmxwKXbLj7ZqLidpWFw45HF1j+zc0qX0 fGwA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Break up the existing very large conditional, add comments and use vma_[start/end]_pgoff() to make clearer what we're doing here. No functional change intended. Reviewed-by: Gregory Price Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) Reviewed-by: Zi Yan --- mm/vma.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 995de8198fbb..084afdf37385 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -1967,14 +1967,25 @@ static int anon_vma_compatible(struct vm_area_struc= t *a, struct vm_area_struct * { vma_flags_t diff =3D vma_flags_diff_pair(&a->flags, &b->flags); =20 + /* Ignore flags that mprotect() can change. */ vma_flags_clear_mask(&diff, VMA_ACCESS_FLAGS); + /* Ignore flags that do not impact merging. */ vma_flags_clear_mask(&diff, VMA_IGNORE_MERGE_FLAGS); =20 - return a->vm_end =3D=3D b->vm_start && - mpol_equal(vma_policy(a), vma_policy(b)) && - a->vm_file =3D=3D b->vm_file && - vma_flags_empty(&diff) && - b->vm_pgoff =3D=3D a->vm_pgoff + ((b->vm_start - a->vm_start) >> PAGE_SH= IFT); + /* Must be adjacent. */ + if (a->vm_end !=3D b->vm_start) + return false; + /* Must have matching policy. */ + if (!mpol_equal(vma_policy(a), vma_policy(b))) + return false; + /* Must both be anon or map the same file (MAP_PRIVATE case). */ + if (a->vm_file !=3D b->vm_file) + return false; + /* Flags must be equivalent modulo mprotect(). */ + if (!vma_flags_empty(&diff)) + return false; + /* Page offset must align. */ + return vma_end_pgoff(a) =3D=3D vma_start_pgoff(b); } =20 /* --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8759A3955E1; Fri, 10 Jul 2026 20:23:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715000; cv=none; b=AbD3dPiGYUUMoajjzmPs8ZLdX4hOmXAIkEWMVwe3AlaMV+xM2ymtY+K264lSz8wpzmfq3MKERi4CJ8is2axs5yeAlKShv0NTcZ/viHEESuHdgzRJdw42L+uC+JFRgn2bynaqcJqvTyH1lRVZLpDx6UH/KYb8jR5PLiYBClzHW8w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715000; c=relaxed/simple; bh=/OET8/zUpzsJ/XNmWkLK0gsvh8paST29XGIok8Z8NBo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FodfT/UdlO2qhgkLqLF+SWWUhdRSP/wHiz/qLHsSXxf2yAuPnS3WtUuSm8deTI0MO3eQZ3wZ8B+5Y0cZa+1lahkx4AvfQrl8BbgyKI6/yEXGIU3Osq8KJyNv0oGF8uTc6ooMHiJeWadIhHXQOy1EGQS01M96B0UJkjh0Jn9W368= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S1DwmzxW; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S1DwmzxW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 751431F00A3A; Fri, 10 Jul 2026 20:22:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783714999; bh=8inNSEODGbyh/+vAWll7hEmDowJfY2XIaIfPLAyfMv8=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=S1DwmzxWKK/EvOlvmXiaNgzfe9uDLXmTCD+WOfUbIAIznmeNow2bwHsqtQNnJDz6P rqHs9qpnmDqZ7AXsBeyQzhFBN9oQXnRABs+LJNq40HsMI5lnNl+DSPJGinGwGnULCx 78OgKDP4iyqp5wUZhtC+twh9ggQujW01mEbzw5nIUKY4aWS4GEh9yM5cAf3VYB8bQx mMyUoAKHPGwt0QsRpaNGnK2kAqbELgSA+bpm+oAZ4D8FAeyJdaN8Ea3X9Nm3YToX6X LgnaMPze03tseVbPBRg/fzdp8E+k83ZRinjxnRZ9sKzJ6gvhECaFRdAXhf2O5a1uOD zoICWtvDCZyZQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:56 +0100 Subject: [PATCH v2 15/33] mm/vma: refactor vmg_adjust_set_range() for clarity Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-15-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2561; i=ljs@kernel.org; h=from:subject:message-id; bh=/OET8/zUpzsJ/XNmWkLK0gsvh8paST29XGIok8Z8NBo=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg21eWBnkBU3wWsq2iz/TO8ZQcE3VnwrbFNZv12IU1 viv6S/tKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwEQeuDEyfLi5azmfhOuak/Y7 /x39eSMlunV7+X2dpoxbEw5qHn3m0MXI8NngWsiVLEV5+0l6Sf1f61cyr3mWXucy4WDe1De3LqV uZQMA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Add comments with ASCII diagrams to describe what we're doing, avoid dubious use of PHYS_PFN(), and use vma_start_pgoff(). The most complicated scenario represented here is vmg->__adjust_next_start - when this is set, vmg->[start, end] actually indicate the range to be retained, so take special care to describe this accurately. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 084afdf37385..7265a054cfa3 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -704,11 +704,54 @@ static void vmg_adjust_set_range(struct vma_merge_str= uct *vmg) pgoff_t pgoff; =20 if (vmg->__adjust_middle_start) { - adjust =3D vmg->middle; - pgoff =3D adjust->vm_pgoff + PHYS_PFN(vmg->end - adjust->vm_start); + /* + * vmg->start vmg->end + * | | + * v merge v + * <-------------> + * delta + * <------> + * |------|----------------| + * | prev | middle | + * |------|----------------| + * ^ + * | + * middle->vm_start + */ + struct vm_area_struct *middle =3D vmg->middle; + const unsigned long delta =3D vmg->end - middle->vm_start; + + pgoff =3D vma_start_pgoff(middle) + (delta >> PAGE_SHIFT); + adjust =3D middle; } else if (vmg->__adjust_next_start) { - adjust =3D vmg->next; - pgoff =3D adjust->vm_pgoff - PHYS_PFN(adjust->vm_start - vmg->end); + /* + * Originally: + * + * vmg->start vmg->end + * | | + * v merge v + * <------------> + * . . + * merge_existing_range() updates to: + * . . + * vmg->start vmg->end . + * | | . + * v retain v . + * <----------> . + * delta . + * <-----> . + * |----------------|------| + * | middle | next | + * |----------------|------| + * ^ + * | + * next->vm_start + */ + struct vm_area_struct *next =3D vmg->next; + const unsigned long delta =3D next->vm_start - vmg->end; + + pgoff =3D vma_start_pgoff(next) - (delta >> PAGE_SHIFT); + adjust =3D next; } else { return; } --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A0CEC399CFD; Fri, 10 Jul 2026 20:23:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715023; cv=none; b=T7PQhiJ7kFjT9wRmWUeHIngpEW3AAFEIMzCMXdEkgpE7vsJuQHu3smXH+b66+v2xwFzz4tORNgtvJq4WVUXitxwNFEBuPrW0UOnEWoI9fd+72kVfShoBJhWNOPOZiGjqWqJnedqr4FFzGIkO+NyZ1p0CwVIm0KQGDZ3kzBTVgrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715023; c=relaxed/simple; bh=fynty0cOXQIbsI8Im1dMU82VMgwlvpXxQo8CNb014Ng=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gFd97vgE2HaLZqKCL9xhiRYzJovhY3RTzCYjWy/Prga1YNYpvcZ8H+9Ta93wfXw/M6uemA3/luzSW8T88JcDnTqtAAksd62eC8TCOUqTUo+PcDGn0tObq/+6W1SsNvKrBnzR1jcJ+XXYpI303lUWNah4S5fMlALkyjVEswJzO4o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d3dTLtbw; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="d3dTLtbw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A19E1F000E9; Fri, 10 Jul 2026 20:23:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715022; bh=2aND6ZTrK5aCnF0vB/hvCQzWPNkI/PGqvLHzAGyQuss=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=d3dTLtbwHpud6iwAczcr/G9qOssm4UAuvj4AITz+zWpoo3DzOVp4gv/8j/t3INWRl h2iqumoE+G4TsrZXl0JhrXm1DZwp+Xg3/+wksbc2t0H/PLF/RGB/5vKhFzP677NytU q6MV3RVJSQRNxvQnBeZzwMXbXmKkia3AIRewaLGVCnf5X62tPiyvXhyTzEoOmXSEGC 7JJiwAJmtNQpNHVWkspiwndBidkwdss3Ra2oN97KJrOwhYLngF5H0St0YiV3hmYCXT mfa+HnPzm/yNr4CqvgKrXrsT0Jsexbb8zALJKBx2Z3Z8c8MYQaM3JxOThN0dU2Lcc2 ZnfBU5TdzppUw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:57 +0100 Subject: [PATCH v2 16/33] mm/vma: minor cleanup of expand_[upwards, downwards]() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-16-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2119; i=ljs@kernel.org; h=from:subject:message-id; bh=fynty0cOXQIbsI8Im1dMU82VMgwlvpXxQo8CNb014Ng=; b=kA0DAAoWz53NioHifxQByyZiAGpRUzzIuaLaCaR4CfWWXA/TVMCwmdk5sAWWI2+fuF7yBKZGo 4h1BAAWCgAdFiEE5/QXv1IUVp6J0E9Gz53NioHifxQFAmpRUzwACgkQz53NioHifxSSHwEA7mlE x52NRnGbJn2diesM85ALQpE3tCi1SqD0qgxp4fkBAMrSm0IQy3xvIXv/5PUxUHYQwVkEyzhhVNm YRBxFnqAF X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Adjust the stack expansion functions expand_upwards() and expand_downwards() such that they are expressed in terms of named constant values, and make use of vma_start_pgoff(). This clearly documents that we are referencing the page offset of the start of the VMA. Additionally this cleans up the overflow check in expand_upwards(). No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 7265a054cfa3..5d5e60ea8a25 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -3216,13 +3216,12 @@ int expand_upwards(struct vm_area_struct *vma, unsi= gned long address) =20 /* Somebody else might have raced and expanded it already */ if (address > vma->vm_end) { - unsigned long size, grow; - - size =3D address - vma->vm_start; - grow =3D (address - vma->vm_end) >> PAGE_SHIFT; + const unsigned long size =3D address - vma->vm_start; + const unsigned long grow =3D (address - vma->vm_end) >> PAGE_SHIFT; + const pgoff_t pgoff =3D vma_start_pgoff(vma); =20 error =3D -ENOMEM; - if (vma->vm_pgoff + (size >> PAGE_SHIFT) >=3D vma->vm_pgoff) { + if (pgoff + (size >> PAGE_SHIFT) >=3D pgoff) { error =3D acct_stack_growth(vma, size, grow); if (!error) { if (vma_test(vma, VMA_LOCKED_BIT)) @@ -3295,13 +3294,11 @@ int expand_downwards(struct vm_area_struct *vma, un= signed long address) =20 /* Somebody else might have raced and expanded it already */ if (address < vma->vm_start) { - unsigned long size, grow; - - size =3D vma->vm_end - address; - grow =3D (vma->vm_start - address) >> PAGE_SHIFT; + const unsigned long size =3D vma->vm_end - address; + const unsigned long grow =3D (vma->vm_start - address) >> PAGE_SHIFT; =20 error =3D -ENOMEM; - if (grow <=3D vma->vm_pgoff) { + if (grow <=3D vma_start_pgoff(vma)) { error =3D acct_stack_growth(vma, size, grow); if (!error) { if (vma_test(vma, VMA_LOCKED_BIT)) --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFBCF39A066; Fri, 10 Jul 2026 20:24:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715047; cv=none; b=bqjRyKhX2BJMIi00Z4F+z8tAxVLiMu6bQf1v2x4mrcFoT86oBpooJtTqegaXl0BbsWpRU5zKOCJ9EuA1Y99f4MOdSqVeFwe77iwYa9NTG1KClSw1EqUAQ+SiI/92t045tNcpttX11YWOWeAIsnAk+xPPmdTfqpDNHaVmwuFTHEk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715047; c=relaxed/simple; bh=RyHoLL9QYKzn8GmfhUypF1HMy7j9yuNgRKqt7m0CxCM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gt6qLkPGSWZHpqXpQ8ljeV6DnVA1yDQ68fTn/Sc7emNbcx2HRfOHH97+sxVvVrPrarR9ur+mpkhIxNuEnXZGTPUSYfs0iXZkLdyoaeC+YCjlmhY8wSGtf6LhbMsn2YSECm7T2/azGmmBvYI9ArXejKY0VFlxlLLbO9I8acSGWio= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Yvcme1ie; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Yvcme1ie" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B448D1F00A3A; Fri, 10 Jul 2026 20:23:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715045; bh=7rHiUFVguoq1IEHDVydiWk+wjTNnrgUwNwUljwJg4jE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Yvcme1ieNXyFDoo+lIS03nV9pipt34r5wD+C/clXyI1xGd4MIhe9cWBew+GBWRUkJ OfNs6ewKzvo+PT4kUyxpZzl1C28zcBojxJSpeoM1fltsLT4Q3YftMtg84J6KqN16lM i6bmnzRy3cNRGNjTONoKz6tAu0Xm9REPzvoTin9cYBi7f97Cr3waoYlROrRJyJh08B iFqx09yKxv+YjA7GXu/KYTgZod4stmW3dMbcoBXT5wmPGSf8M/ZsOcAn4azvutQbxN YKaBXd6IIQNWqpqMBTU8pGx5qikO6e/CXGgvZLiiCoSPGHjrXioIbjQ0XF2RIK/9G/ CmjN3WgETetvA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:58 +0100 Subject: [PATCH v2 17/33] mm: introduce and use linear_page_delta() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-17-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King , Ackerley Tng X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2722; i=ljs@kernel.org; h=from:subject:message-id; bh=RyHoLL9QYKzn8GmfhUypF1HMy7j9yuNgRKqt7m0CxCM=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg20sa5N6ffOdZY/uuM49Q6T0gTqfSuNy/0tvAlWFV naFqt7oKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwEQiUhj+CqbqT5iddiQ5f9qS CascLV90qXjKHGEJqw4LrAm3UHI/xcjwb/6q1bkn6llcu88Ye2TFXFveuNVaLfBPeaex5DqGCYy MAA== X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 It's often useful to obtain the number of pages a given address lies at within a VMA. Add linear_page_delta() to determine this and update linear_page_index() to make use of it. Add comments to describe both linear_page_delta() and linear_page_index(). We refer the reader to the comment for vma_start_pgoff() so we don't duplicate information about the meaning of a VMA's page offset, which is also less likely to result in bitrot. No functional change intended. Reviewed-by: Ackerley Tng Reviewed-by: Gregory Price Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- include/linux/pagemap.h | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 2c3718d592d6..a950070b045f 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -1063,11 +1063,40 @@ static inline pgoff_t folio_pgoff(const struct foli= o *folio) return folio->index; } =20 +/** + * linear_page_delta() - Determine the relative page offset of @address wi= thin + * @vma. + * @vma: The VMA in which @address resides. + * @address: The address whose relative page offset is required. + * + * The result is identical for both file-backed and anonymous mappings and + * simply determines how many pages @address lies from @vma->vm_start. + * + * Returns: The number of pages @address is offset by within @vma. + */ +static inline pgoff_t linear_page_delta(const struct vm_area_struct *vma, + const unsigned long address) +{ + return (address - vma->vm_start) >> PAGE_SHIFT; +} + +/** + * linear_page_index() - Determine the absolute page offset of @address wi= thin + * @vma. + * @vma: The VMA in which @address resides. + * @address: The address whose absolute page offset is required. + * + * See the comment for vma_start_pgoff() for a description of what the page + * offset signifies. + * + * Returns: The absolute page offset of @address within @vma. + */ static inline pgoff_t linear_page_index(const struct vm_area_struct *vma, const unsigned long address) { pgoff_t pgoff; - pgoff =3D (address - vma->vm_start) >> PAGE_SHIFT; + + pgoff =3D linear_page_delta(vma, address); pgoff +=3D vma->vm_pgoff; return pgoff; } @@ -1219,7 +1248,7 @@ static inline vm_fault_t folio_lock_or_retry(struct f= olio *folio, void folio_wait_bit(struct folio *folio, int bit_nr); int folio_wait_bit_killable(struct folio *folio, int bit_nr); =20 -/*=20 +/* * Wait for a folio to be unlocked. * * This must be called with the caller "holding" the folio, --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7A7239C632; Fri, 10 Jul 2026 20:24:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715071; cv=none; b=MXLBqNsK53NoQISSjnNQlUrTcHm+/KlsJ1eNLoz5RUkTA5KvrHLs84DOuylcmCRwnPLQHvNkuVintcuF7t3Q/FcxayrCq/NWQC4XSB6ROe3GpYApc4qAfqq8Kf7Q96zJ/84mMufmuaNJ/mk3P8Htv4uNQWGvggU95MZrlluQB7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715071; c=relaxed/simple; bh=rKOwkwD1MT9ko/73T9Gwlp9PQTP+UA4dlbMuAhZn7p0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=e6BjXM18npHA2zAKnyf8Q07fraAYHlNw7l+4adlIvTmpQUimkskZF1nSfdqYpGVECXgSvNya4UwAHxm6X23zxhzxAet0r/LGIfamm4C+L5WglMteVsS9D66F6aMFnO2S4KBFfunUxFw0LFP6hmy+TwWdOKgfUR5N5yRznJat8/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fO/0r1DL; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fO/0r1DL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 069A31F00A3F; Fri, 10 Jul 2026 20:24:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715068; bh=bjkfDpfHAUpgl/iZpWEg536DG4CNTbwjWyWDryptZiM=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=fO/0r1DL4fCgi00mH7JcivwwVa0NtA7gWxDhKu/UslTiJOcVZxnTm5AhEq/6RKkgL GKbBP8TgytJGGi5FsG85kFxyTZjx61g2VX6dZmnUMxkWN/mhFIH8Hhj/F0DXOqPft5 KZXe7t645JQH3DNi4voaNJXoNAEsYrVOfvaSsMx3wK7kEvGt3OkbXPoulhhyp0PgMl 3SeHsp5Tq7kWCxvgIleVRWqrdKtaCQzYQS2HuW5Y2GafB/staGHTLwAZnTMRid2Y9k w57uxea5v0YRtqwGpwl2yZ04XHsf5kX4/ajs8KOezcOwlSzxyQAVPm9lZ9yVjRMlFW VHv8zqdIUK8+w== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:16:59 +0100 Subject: [PATCH v2 18/33] mm/vma: use vma_start_pgoff(), linear_page_index() in mm code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-18-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=27816; i=ljs@kernel.org; h=from:subject:message-id; bh=rKOwkwD1MT9ko/73T9Gwlp9PQTP+UA4dlbMuAhZn7p0=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg23aor14dGS+zapqL5jQ8ebHitlH7rsJ7pnq+4H/X 9Brtb+SHaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZjI/L0M/5R81tlz6OyyePs4 r+q+6OmNp5aEPJ+Quqv06cRlNhLvmhwYGWbtMptY495ekrcnXGfNC4ntgenq9rW7eGd6PLny4dR 6Sx4A X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 There are many instances in which linear_page_index() (as well as linear_page_delta()) is open-coded, which is confusing and inconsistent. Additionally, vma->vm_pgoff doesn't necessarily make it clear that this is the page offset of the start of the VMA range. Doing so also aids greppability. So use vma_start_pgoff() in favour of directly accessing vma->vm_pgoff, and linear_page_index() where we can. This also lays the ground for future changes which will add an anonymous page offset in order to be able to index MAP_PRIVATE-file backed anon folios in terms of their virtual page offset. No functional change intended. Reviewed-by: Gregory Price Reviewed-by: SJ Park Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- include/linux/huge_mm.h | 1 + include/linux/hugetlb.h | 3 +-- include/linux/pagemap.h | 2 +- mm/damon/vaddr.c | 5 +++-- mm/debug.c | 2 +- mm/filemap.c | 7 ++++--- mm/huge_memory.c | 2 +- mm/hugetlb.c | 11 ++++------- mm/internal.h | 24 ++++++++++++++---------- mm/khugepaged.c | 3 ++- mm/madvise.c | 6 +++--- mm/mapping_dirty_helpers.c | 2 +- mm/memory.c | 25 +++++++++++++------------ mm/mempolicy.c | 13 +++++++------ mm/mremap.c | 12 ++++-------- mm/msync.c | 4 ++-- mm/nommu.c | 7 ++++--- mm/pagewalk.c | 2 +- mm/shmem.c | 9 +++++---- mm/userfaultfd.c | 4 ++-- mm/util.c | 4 ++-- mm/vma.c | 15 +++++++-------- mm/vma_exec.c | 4 ++-- mm/vma_init.c | 2 +- 24 files changed, 86 insertions(+), 83 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 19a7bfce279e..cae97c307280 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -230,6 +230,7 @@ static inline bool thp_vma_suitable_order(struct vm_are= a_struct *vma, =20 /* Don't have to check pgoff for anonymous vma */ if (!vma_is_anonymous(vma)) { + /* vma_start_pgoff() in mm.h so not available. */ if (!IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff, hpage_size >> PAGE_SHIFT)) return false; diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 4115076e4922..32901236ab0f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -801,8 +801,7 @@ static inline pgoff_t hugetlb_linear_page_index(struct = vm_area_struct *vma, { struct hstate *h =3D hstate_vma(vma); =20 - return ((address - vma->vm_start) >> huge_page_shift(h)) + - (vma->vm_pgoff >> huge_page_order(h)); + return linear_page_index(vma, address) >> huge_page_order(h); } =20 static inline bool order_is_gigantic(unsigned int order) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index a950070b045f..c6fc783aaee5 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -1097,7 +1097,7 @@ static inline pgoff_t linear_page_index(const struct = vm_area_struct *vma, pgoff_t pgoff; =20 pgoff =3D linear_page_delta(vma, address); - pgoff +=3D vma->vm_pgoff; + pgoff +=3D vma_start_pgoff(vma); return pgoff; } =20 diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 2058db9c01d5..d10b8042adb5 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include =20 @@ -623,8 +624,8 @@ static void damos_va_migrate_dests_add(struct folio *fo= lio, } =20 order =3D folio_order(folio); - ilx =3D vma->vm_pgoff >> order; - ilx +=3D (addr - vma->vm_start) >> (PAGE_SHIFT + order); + ilx =3D vma_start_pgoff(vma) >> order; + ilx +=3D linear_page_delta(vma, addr) >> order; =20 for (i =3D 0; i < dests->nr_dests; i++) weight_total +=3D dests->weight_arr[i]; diff --git a/mm/debug.c b/mm/debug.c index 77fa8fe1d641..497654b36f1a 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -163,7 +163,7 @@ void dump_vma(const struct vm_area_struct *vma) "flags: %#lx(%pGv)\n", vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_mm, (unsigned long)pgprot_val(vma->vm_page_prot), - vma->anon_vma, vma->vm_ops, vma->vm_pgoff, + vma->anon_vma, vma->vm_ops, vma_start_pgoff(vma), vma->vm_file, vma->vm_private_data, #ifdef CONFIG_PER_VMA_LOCK refcount_read(&vma->vm_refcnt), diff --git a/mm/filemap.c b/mm/filemap.c index b39111abdc4b..1dbb4c6f824e 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3411,8 +3411,8 @@ static struct file *do_sync_mmap_readahead(struct vm_= fault *vmf) * of memory. */ struct vm_area_struct *vma =3D vmf->vma; - unsigned long start =3D vma->vm_pgoff; - unsigned long end =3D start + vma_pages(vma); + const unsigned long start =3D vma_start_pgoff(vma); + const unsigned long end =3D vma_end_pgoff(vma); unsigned long ra_end; =20 ra->order =3D exec_folio_order(); @@ -3930,7 +3930,8 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf, goto out; } =20 - addr =3D vma->vm_start + ((start_pgoff - vma->vm_pgoff) << PAGE_SHIFT); + addr =3D vma->vm_start + + ((start_pgoff - vma_start_pgoff(vma)) << PAGE_SHIFT); vmf->pte =3D pte_offset_map_lock(vma->vm_mm, vmf->pmd, addr, &vmf->ptl); if (!vmf->pte) { folio_unlock(folio); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 25612af72dca..790d2720b9e3 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -180,7 +180,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area= _struct *vma, */ if (!in_pf && shmem_file(vma->vm_file)) return orders & shmem_allowable_huge_orders(file_inode(vma->vm_file), - vma, vma->vm_pgoff, 0, + vma, vma_start_pgoff(vma), 0, forced_collapse); =20 if (!vma_is_anonymous(vma)) { diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 92796c0cd89e..30f257a2bfee 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1011,8 +1011,7 @@ static long region_count(struct resv_map *resv, long = f, long t) static pgoff_t vma_hugecache_offset(struct hstate *h, struct vm_area_struct *vma, unsigned long address) { - return ((address - vma->vm_start) >> huge_page_shift(h)) + - (vma->vm_pgoff >> huge_page_order(h)); + return linear_page_index(vma, address) >> huge_page_order(h); } =20 /* @@ -5444,8 +5443,7 @@ static void unmap_ref_private(struct mm_struct *mm, s= truct vm_area_struct *vma, * from page cache lookup which is in HPAGE_SIZE units. */ address =3D address & huge_page_mask(h); - pgoff =3D ((address - vma->vm_start) >> PAGE_SHIFT) + - vma->vm_pgoff; + pgoff =3D linear_page_index(vma, address); mapping =3D vma->vm_file->f_mapping; =20 /* @@ -6904,7 +6902,7 @@ static unsigned long page_table_shareable(struct vm_a= rea_struct *svma, struct vm_area_struct *vma, unsigned long addr, pgoff_t idx) { - unsigned long saddr =3D ((idx - svma->vm_pgoff) << PAGE_SHIFT) + + unsigned long saddr =3D ((idx - vma_start_pgoff(svma)) << PAGE_SHIFT) + svma->vm_start; unsigned long sbase =3D saddr & PUD_MASK; unsigned long s_end =3D sbase + PUD_SIZE; @@ -6989,8 +6987,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm= _area_struct *vma, unsigned long addr, pud_t *pud) { struct address_space *mapping =3D vma->vm_file->f_mapping; - pgoff_t idx =3D ((addr - vma->vm_start) >> PAGE_SHIFT) + - vma->vm_pgoff; + const pgoff_t idx =3D linear_page_index(vma, addr); struct vm_area_struct *svma; unsigned long saddr; pte_t *spte =3D NULL; diff --git a/mm/internal.h b/mm/internal.h index 3d30650a8440..01a762bcc2b2 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1004,26 +1004,28 @@ static inline bool folio_within_range(struct folio *folio, struct vm_area_struct *vma, unsigned long start, unsigned long end) { - pgoff_t pgoff, addr; - unsigned long vma_pglen =3D vma_pages(vma); + const unsigned long vma_pglen =3D vma_pages(vma); + pgoff_t pgoff_folio, pgoff_vma_start; + unsigned long addr; =20 VM_WARN_ON_FOLIO(folio_test_ksm(folio), folio); if (start > end) return false; =20 + pgoff_folio =3D folio_pgoff(folio); + pgoff_vma_start =3D vma_start_pgoff(vma); + if (start < vma->vm_start) start =3D vma->vm_start; =20 if (end > vma->vm_end) end =3D vma->vm_end; =20 - pgoff =3D folio_pgoff(folio); - /* if folio start address is not in vma range */ - if (!in_range(pgoff, vma->vm_pgoff, vma_pglen)) + if (!in_range(pgoff_folio, pgoff_vma_start, vma_pglen)) return false; =20 - addr =3D vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); + addr =3D vma->vm_start + ((pgoff_folio - pgoff_vma_start) << PAGE_SHIFT); =20 return !(addr < start || end - addr < folio_size(folio)); } @@ -1095,15 +1097,16 @@ extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm= _area_struct *vma); static inline unsigned long vma_address(const struct vm_area_struct *vma, pgoff_t pgoff, unsigned long nr_pages) { + const pgoff_t pgoff_start =3D vma_start_pgoff(vma); unsigned long address; =20 - if (pgoff >=3D vma->vm_pgoff) { + if (pgoff >=3D pgoff_start) { address =3D vma->vm_start + - ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); + ((pgoff - pgoff_start) << PAGE_SHIFT); /* Check for address beyond vma (or wrapped through 0?) */ if (address < vma->vm_start || address >=3D vma->vm_end) address =3D -EFAULT; - } else if (pgoff + nr_pages - 1 >=3D vma->vm_pgoff) { + } else if (pgoff + nr_pages - 1 >=3D pgoff_start) { /* Test above avoids possibility of wrap to 0 on 32-bit */ address =3D vma->vm_start; } else { @@ -1127,7 +1130,8 @@ static inline unsigned long vma_address_end(struct pa= ge_vma_mapped_walk *pvmw) return pvmw->address + PAGE_SIZE; =20 pgoff =3D pvmw->pgoff + pvmw->nr_pages; - address =3D vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); + address =3D vma->vm_start + + ((pgoff - vma_start_pgoff(vma)) << PAGE_SHIFT); /* Check for address beyond vma (or wrapped through 0?) */ if (address < vma->vm_start || address > vma->vm_end) address =3D vma->vm_end; diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 912be3daf37e..45e8245d80da 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2150,7 +2150,8 @@ static void retract_page_tables(struct address_space = *mapping, pgoff_t pgoff) spinlock_t *ptl; bool success =3D false; =20 - addr =3D vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); + addr =3D vma->vm_start + + ((pgoff - vma_start_pgoff(vma)) << PAGE_SHIFT); if (addr & ~HPAGE_PMD_MASK || vma->vm_end < addr + HPAGE_PMD_SIZE) continue; diff --git a/mm/madvise.c b/mm/madvise.c index 9292f60b19aa..917f764fef80 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -253,7 +253,7 @@ static void shmem_swapin_range(struct vm_area_struct *v= ma, continue; =20 addr =3D vma->vm_start + - ((xas.xa_index - vma->vm_pgoff) << PAGE_SHIFT); + ((xas.xa_index - vma_start_pgoff(vma)) << PAGE_SHIFT); xas_pause(&xas); rcu_read_unlock(); =20 @@ -318,7 +318,7 @@ static long madvise_willneed(struct madvise_behavior *m= adv_behavior) mark_mmap_lock_dropped(madv_behavior); get_file(file); offset =3D (loff_t)(start - vma->vm_start) - + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); + + ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT); mmap_read_unlock(mm); vfs_fadvise(file, offset, end - start, POSIX_FADV_WILLNEED); fput(file); @@ -1022,7 +1022,7 @@ static long madvise_remove(struct madvise_behavior *m= adv_behavior) return -EACCES; =20 offset =3D (loff_t)(start - vma->vm_start) - + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); + + ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT); =20 /* * Filesystem's fallocate may need to take i_rwsem. We need to diff --git a/mm/mapping_dirty_helpers.c b/mm/mapping_dirty_helpers.c index 737c407f4081..e0efa36e0a07 100644 --- a/mm/mapping_dirty_helpers.c +++ b/mm/mapping_dirty_helpers.c @@ -95,7 +95,7 @@ static int clean_record_pte(pte_t *pte, unsigned long add= r, =20 if (pte_dirty(ptent)) { pgoff_t pgoff =3D ((addr - walk->vma->vm_start) >> PAGE_SHIFT) + - walk->vma->vm_pgoff - cwalk->bitmap_pgoff; + vma_start_pgoff(walk->vma) - cwalk->bitmap_pgoff; pte_t old_pte =3D ptep_modify_prot_start(walk->vma, addr, pte); =20 ptent =3D pte_mkclean(old_pte); diff --git a/mm/memory.c b/mm/memory.c index b7e9a7e53516..fb7a246487ac 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -725,10 +725,10 @@ static inline struct page *__vm_normal_page(struct vm= _area_struct *vma, if (!pfn_valid(pfn)) return NULL; } else { - unsigned long off =3D (addr - vma->vm_start) >> PAGE_SHIFT; + const pgoff_t index =3D linear_page_index(vma, addr); =20 /* Only CoW'ed anon folios are "normal". */ - if (pfn =3D=3D vma->vm_pgoff + off) + if (pfn =3D=3D index) return NULL; if (!is_cow_mapping(vma->vm_flags)) return NULL; @@ -2663,7 +2663,7 @@ static int __vm_map_pages(struct vm_area_struct *vma,= struct page **pages, int vm_map_pages(struct vm_area_struct *vma, struct page **pages, unsigned long num) { - return __vm_map_pages(vma, pages, num, vma->vm_pgoff); + return __vm_map_pages(vma, pages, num, vma_start_pgoff(vma)); } EXPORT_SYMBOL(vm_map_pages); =20 @@ -3318,7 +3318,8 @@ int vm_iomap_memory(struct vm_area_struct *vma, phys_= addr_t start, unsigned long unsigned long pfn; int err; =20 - err =3D __simple_ioremap_prep(vm_len, vma->vm_pgoff, start, len, &pfn); + err =3D __simple_ioremap_prep(vm_len, vma_start_pgoff(vma), start, len, + &pfn); if (err) return err; =20 @@ -4366,15 +4367,15 @@ static inline void unmap_mapping_range_tree(struct = address_space *mapping, struct zap_details *details) { struct vm_area_struct *vma; - unsigned long start, size; struct mmu_gather tlb; =20 mapping_rmap_tree_foreach(vma, mapping, first_index, last_index) { - const pgoff_t start_idx =3D max(first_index, vma->vm_pgoff); + const pgoff_t start_idx =3D max(first_index, vma_start_pgoff(vma)); const pgoff_t end_idx =3D min(last_index, vma_last_pgoff(vma)) + 1; - - start =3D vma->vm_start + ((start_idx - vma->vm_pgoff) << PAGE_SHIFT); - size =3D (end_idx - start_idx) << PAGE_SHIFT; + const pgoff_t offset =3D start_idx - vma_start_pgoff(vma); + const unsigned long offset_bytes =3D offset << PAGE_SHIFT; + const unsigned long start =3D vma->vm_start + offset_bytes; + const unsigned long size =3D (end_idx - start_idx) << PAGE_SHIFT; =20 tlb_gather_mmu(&tlb, vma->vm_mm); zap_vma_range_batched(&tlb, vma, start, size, details); @@ -5712,7 +5713,7 @@ vm_fault_t finish_fault(struct vm_fault *vmf) } else if (nr_pages > 1) { pgoff_t idx =3D folio_page_idx(folio, page); /* The page offset of vmf->address within the VMA. */ - pgoff_t vma_off =3D vmf->pgoff - vmf->vma->vm_pgoff; + pgoff_t vma_off =3D vmf->pgoff - vma_start_pgoff(vmf->vma); /* The index of the entry in the pagetable for fault page. */ pgoff_t pte_off =3D pte_index(vmf->address); =20 @@ -5824,7 +5825,7 @@ static vm_fault_t do_fault_around(struct vm_fault *vm= f) pgoff_t nr_pages =3D READ_ONCE(fault_around_pages); pgoff_t pte_off =3D pte_index(vmf->address); /* The page offset of vmf->address within the VMA. */ - pgoff_t vma_off =3D vmf->pgoff - vmf->vma->vm_pgoff; + pgoff_t vma_off =3D vmf->pgoff - vma_start_pgoff(vmf->vma); pgoff_t from_pte, to_pte; vm_fault_t ret; =20 @@ -7352,7 +7353,7 @@ void print_vma_addr(char *prefix, unsigned long ip) if (vma && vma->vm_file) { struct file *f =3D vma->vm_file; ip -=3D vma->vm_start; - ip +=3D vma->vm_pgoff << PAGE_SHIFT; + ip +=3D vma_start_pgoff(vma) << PAGE_SHIFT; printk("%s%pD[%lx,%lx+%lx]", prefix, f, ip, vma->vm_start, vma->vm_end - vma->vm_start); diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 914f81863db5..bf6608309cea 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -2049,8 +2049,8 @@ struct mempolicy *get_vma_policy(struct vm_area_struc= t *vma, pol =3D get_task_policy(current); if (pol->mode =3D=3D MPOL_INTERLEAVE || pol->mode =3D=3D MPOL_WEIGHTED_INTERLEAVE) { - *ilx +=3D vma->vm_pgoff >> order; - *ilx +=3D (addr - vma->vm_start) >> (PAGE_SHIFT + order); + *ilx +=3D vma_start_pgoff(vma) >> order; + *ilx +=3D linear_page_delta(vma, addr) >> order; } return pol; } @@ -3244,16 +3244,17 @@ EXPORT_SYMBOL_FOR_MODULES(mpol_shared_policy_init, = "kvm"); int mpol_set_shared_policy(struct shared_policy *sp, struct vm_area_struct *vma, struct mempolicy *pol) { - int err; + const pgoff_t pgoff =3D vma_start_pgoff(vma); + const pgoff_t pgoff_end =3D vma_end_pgoff(vma); struct sp_node *new =3D NULL; - unsigned long sz =3D vma_pages(vma); + int err; =20 if (pol) { - new =3D sp_alloc(vma->vm_pgoff, vma->vm_pgoff + sz, pol); + new =3D sp_alloc(pgoff, pgoff_end, pol); if (!new) return -ENOMEM; } - err =3D shared_policy_replace(sp, vma->vm_pgoff, vma->vm_pgoff + sz, new); + err =3D shared_policy_replace(sp, pgoff, pgoff_end, new); if (err && new) sp_free(new); return err; diff --git a/mm/mremap.c b/mm/mremap.c index 8a46ec5831c8..384ef4cc2195 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -957,8 +957,7 @@ static unsigned long vrm_set_new_addr(struct vma_remap_= struct *vrm) struct vm_area_struct *vma =3D vrm->vma; unsigned long map_flags =3D 0; /* Page Offset _into_ the VMA. */ - pgoff_t internal_pgoff =3D (vrm->addr - vma->vm_start) >> PAGE_SHIFT; - pgoff_t pgoff =3D vma->vm_pgoff + internal_pgoff; + const pgoff_t pgoff =3D linear_page_index(vma, vrm->addr); unsigned long new_addr =3D vrm_implies_new_addr(vrm) ? vrm->new_addr : 0; unsigned long res; =20 @@ -1264,12 +1263,10 @@ static void unmap_source_vma(struct vma_remap_struc= t *vrm) static int copy_vma_and_data(struct vma_remap_struct *vrm, struct vm_area_struct **new_vma_ptr) { - unsigned long internal_offset =3D vrm->addr - vrm->vma->vm_start; - unsigned long internal_pgoff =3D internal_offset >> PAGE_SHIFT; - unsigned long new_pgoff =3D vrm->vma->vm_pgoff + internal_pgoff; - unsigned long moved_len; + const unsigned long new_pgoff =3D linear_page_index(vrm->vma, vrm->addr); struct vm_area_struct *vma =3D vrm->vma; struct vm_area_struct *new_vma; + unsigned long moved_len; int err =3D 0; PAGETABLE_MOVE(pmc, NULL, NULL, vrm->addr, vrm->new_addr, vrm->old_len); =20 @@ -1811,8 +1808,7 @@ static int check_prep_vma(struct vma_remap_struct *vr= m) vrm->populate_expand =3D true; =20 /* Need to be careful about a growing mapping */ - pgoff =3D (addr - vma->vm_start) >> PAGE_SHIFT; - pgoff +=3D vma->vm_pgoff; + pgoff =3D linear_page_index(vma, addr); if (pgoff + (new_len >> PAGE_SHIFT) < pgoff) return -EINVAL; =20 diff --git a/mm/msync.c b/mm/msync.c index ac4c9bfea2e7..90b491a27a14 100644 --- a/mm/msync.c +++ b/mm/msync.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include =20 @@ -85,8 +86,7 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len,= int, flags) goto out_unlock; } file =3D vma->vm_file; - fstart =3D (start - vma->vm_start) + - ((loff_t)vma->vm_pgoff << PAGE_SHIFT); + fstart =3D (loff_t)linear_page_index(vma, start) << PAGE_SHIFT; fend =3D fstart + (min(end, vma->vm_end) - start) - 1; start =3D vma->vm_end; if ((flags & MS_SYNC) && file && diff --git a/mm/nommu.c b/mm/nommu.c index f51a4a375c8c..52074ea90acb 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -975,7 +975,7 @@ static int do_mmap_private(struct vm_area_struct *vma, /* read the contents of a file into the copy */ loff_t fpos; =20 - fpos =3D vma->vm_pgoff; + fpos =3D vma_start_pgoff(vma); fpos <<=3D PAGE_SHIFT; =20 ret =3D kernel_read(vma->vm_file, base, len, &fpos); @@ -1378,7 +1378,8 @@ static int split_vma(struct vma_iterator *vmi, struct= vm_area_struct *vma, delete_nommu_region(vma->vm_region); if (new_below) { vma->vm_region->vm_start =3D vma->vm_start =3D addr; - vma->vm_region->vm_pgoff =3D vma->vm_pgoff +=3D npages; + vma->vm_pgoff +=3D npages; + vma->vm_region->vm_pgoff =3D vma_start_pgoff(vma); } else { vma->vm_region->vm_end =3D vma->vm_end =3D addr; vma->vm_region->vm_top =3D addr; @@ -1630,7 +1631,7 @@ int vm_iomap_memory(struct vm_area_struct *vma, phys_= addr_t start, unsigned long unsigned long pfn =3D start >> PAGE_SHIFT; unsigned long vm_len =3D vma->vm_end - vma->vm_start; =20 - pfn +=3D vma->vm_pgoff; + pfn +=3D vma_start_pgoff(vma); return io_remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_p= rot); } EXPORT_SYMBOL(vm_iomap_memory); diff --git a/mm/pagewalk.c b/mm/pagewalk.c index 7e7819cf5a3a..dd854c734877 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c @@ -813,7 +813,7 @@ int walk_page_mapping(struct address_space *mapping, pg= off_t first_index, mapping_rmap_tree_foreach(vma, mapping, first_index, first_index + nr - 1) { /* Clip to the vma */ - vba =3D vma->vm_pgoff; + vba =3D vma_start_pgoff(vma); vea =3D vba + vma_pages(vma); cba =3D first_index; cba =3D max(cba, vba); diff --git a/mm/shmem.c b/mm/shmem.c index 3fb6dbbfa20b..c8e2011e0ce6 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1032,6 +1032,8 @@ unsigned long shmem_swap_usage(struct vm_area_struct = *vma) struct inode *inode =3D file_inode(vma->vm_file); struct shmem_inode_info *info =3D SHMEM_I(inode); struct address_space *mapping =3D inode->i_mapping; + const pgoff_t pgoff =3D vma_start_pgoff(vma); + const pgoff_t pgoff_end =3D vma_end_pgoff(vma); unsigned long swapped; =20 /* Be careful as we don't hold info->lock */ @@ -1045,12 +1047,11 @@ unsigned long shmem_swap_usage(struct vm_area_struc= t *vma) if (!swapped) return 0; =20 - if (!vma->vm_pgoff && vma->vm_end - vma->vm_start >=3D inode->i_size) + if (!pgoff && vma->vm_end - vma->vm_start >=3D inode->i_size) return swapped << PAGE_SHIFT; =20 /* Here comes the more involved part */ - return shmem_partial_swap_usage(mapping, vma->vm_pgoff, - vma->vm_pgoff + vma_pages(vma)); + return shmem_partial_swap_usage(mapping, pgoff, pgoff_end); } =20 /* @@ -2840,7 +2841,7 @@ static struct mempolicy *shmem_get_policy(struct vm_a= rea_struct *vma, * by page order, as in shmem_get_pgoff_policy() and get_vma_policy()). */ *ilx =3D inode->i_ino; - index =3D ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; + index =3D linear_page_index(vma, addr); return mpol_shared_policy_lookup(&SHMEM_I(inode)->policy, index); } =20 diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 73f32299453b..8fd24c8b428e 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -481,7 +481,7 @@ static void mfill_retry_state_save(struct mfill_retry_s= tate *s, { s->flags =3D vma_flags_and_mask(&vma->flags, MFILL_RETRY_STATE_VMA_FLAGS); s->ops =3D vma_uffd_ops(vma); - s->pgoff =3D vma->vm_pgoff; + s->pgoff =3D vma_start_pgoff(vma); =20 if (vma->vm_file) s->file =3D get_file(vma->vm_file); @@ -507,7 +507,7 @@ static bool mfill_retry_state_changed(struct mfill_retr= y_state *state, =20 /* VMA was file backed, but file, inode or offset has changed */ if (!vma->vm_file || vma->vm_file->f_inode !=3D state->file->f_inode || - state->file !=3D vma->vm_file || vma->vm_pgoff !=3D state->pgoff) + state->file !=3D vma->vm_file || vma_start_pgoff(vma) !=3D state->pgo= ff) return true; =20 return false; diff --git a/mm/util.c b/mm/util.c index 34cb43b3eaa4..5090457542ca 100644 --- a/mm/util.c +++ b/mm/util.c @@ -1188,7 +1188,7 @@ void compat_set_desc_from_vma(struct vm_area_desc *de= sc, desc->start =3D vma->vm_start; desc->end =3D vma->vm_end; =20 - desc->pgoff =3D vma->vm_pgoff; + desc->pgoff =3D vma_start_pgoff(vma); desc->vm_file =3D vma->vm_file; desc->vma_flags =3D vma->flags; desc->page_prot =3D vma->vm_page_prot; @@ -1379,7 +1379,7 @@ static int call_vma_mapped(struct vm_area_struct *vma) if (!vm_ops || !vm_ops->mapped) return 0; =20 - err =3D vm_ops->mapped(vma->vm_start, vma->vm_end, vma->vm_pgoff, + err =3D vm_ops->mapped(vma->vm_start, vma->vm_end, vma_start_pgoff(vma), vma->vm_file, &vm_private_data); if (err) return err; diff --git a/mm/vma.c b/mm/vma.c index 5d5e60ea8a25..4a4d096ba86a 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -967,10 +967,9 @@ static __must_check struct vm_area_struct *vma_merge_e= xisting_range( * prev middle next * extend delete delete */ - vmg->start =3D prev->vm_start; vmg->end =3D next->vm_end; - vmg->pgoff =3D prev->vm_pgoff; + vmg->pgoff =3D vma_start_pgoff(prev); =20 /* * We already ensured anon_vma compatibility above, so now it's @@ -987,9 +986,8 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( * prev middle * extend shrink/delete */ - vmg->start =3D prev->vm_start; - vmg->pgoff =3D prev->vm_pgoff; + vmg->pgoff =3D vma_start_pgoff(prev); =20 if (!vmg->__remove_middle) vmg->__adjust_middle_start =3D true; @@ -1011,13 +1009,13 @@ static __must_check struct vm_area_struct *vma_merg= e_existing_range( =20 if (vmg->__remove_middle) { vmg->end =3D next->vm_end; - vmg->pgoff =3D next->vm_pgoff - pglen; + vmg->pgoff =3D vma_start_pgoff(next) - pglen; } else { /* We shrink middle and expand next. */ vmg->__adjust_next_start =3D true; vmg->start =3D middle->vm_start; vmg->end =3D start; - vmg->pgoff =3D middle->vm_pgoff; + vmg->pgoff =3D vma_start_pgoff(middle); } =20 err =3D dup_anon_vma(next, middle, &anon_dup); @@ -1126,7 +1124,7 @@ struct vm_area_struct *vma_merge_new_range(struct vma= _merge_struct *vmg) if (can_merge_left) { vmg->start =3D prev->vm_start; vmg->target =3D prev; - vmg->pgoff =3D prev->vm_pgoff; + vmg->pgoff =3D vma_start_pgoff(prev); =20 /* * If this merge would result in removal of the next VMA but we @@ -1957,7 +1955,8 @@ struct vm_area_struct *copy_vma(struct vm_area_struct= **vmap, VM_BUG_ON_VMA(faulted_in_anon_vma, new_vma); *vmap =3D vma =3D new_vma; } - *need_rmap_locks =3D (new_vma->vm_pgoff <=3D vma->vm_pgoff); + *need_rmap_locks =3D + (vma_start_pgoff(new_vma) <=3D vma_start_pgoff(vma)); } else { new_vma =3D vm_area_dup(vma); if (!new_vma) diff --git a/mm/vma_exec.c b/mm/vma_exec.c index 5cee8b7efa0f..e3644a3042e2 100644 --- a/mm/vma_exec.c +++ b/mm/vma_exec.c @@ -37,7 +37,7 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigne= d long shift) unsigned long new_end =3D old_end - shift; VMA_ITERATOR(vmi, mm, new_start); VMG_STATE(vmg, mm, &vmi, new_start, old_end, EMPTY_VMA_FLAGS, - vma->vm_pgoff); + vma_start_pgoff(vma)); struct vm_area_struct *next; struct mmu_gather tlb; PAGETABLE_MOVE(pmc, vma, vma, old_start, new_start, length); @@ -89,7 +89,7 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigne= d long shift) =20 vma_prev(&vmi); /* Shrink the vma to just the new range */ - return vma_shrink(&vmi, vma, new_start, new_end, vma->vm_pgoff); + return vma_shrink(&vmi, vma, new_start, new_end, vma_start_pgoff(vma)); } =20 /* diff --git a/mm/vma_init.c b/mm/vma_init.c index 3c0b65950510..a459669a1654 100644 --- a/mm/vma_init.c +++ b/mm/vma_init.c @@ -46,7 +46,7 @@ static void vm_area_init_from(const struct vm_area_struct= *src, dest->vm_start =3D src->vm_start; dest->vm_end =3D src->vm_end; dest->anon_vma =3D src->anon_vma; - dest->vm_pgoff =3D src->vm_pgoff; + dest->vm_pgoff =3D vma_start_pgoff(src); dest->vm_file =3D src->vm_file; dest->vm_private_data =3D src->vm_private_data; vm_flags_init(dest, src->vm_flags); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D89E639B97B; Fri, 10 Jul 2026 20:24:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715094; cv=none; b=VtI3vutpGMmzVrhBlqhm0t33kBut9n0tmKkEvx1M9NRY9vahFgr0fPoChRX0pJSP1xqsVseYkPTjB4tsAK37QQJXgO4u6MHdlBD4hgObpULoU6cVl7XDuyicCm2zPrPCUd2pTjXarmvQF/eEZ5+y49V/VUZwI67hsbCMFQMKAxk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715094; c=relaxed/simple; bh=0R0W7VTOgU1IPpg8ezqD30zdmiulVdYqX8Tjb5nSXd4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FCLZIkReyD1HA+F+HFT0cIDOm04RykOM4W+85QNHcNS9hxH4v/sc8lXJFFZYy51XNLfs8Jf9IubOpIE0eRkPj8yFIl44rkQkO3BCGYBAEdmJsUWKHyWLTMn24uPTh/NwOv9tKPNZXrP8t8w7E0RXQHkGLefj0nV2Ona25H2waL0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W7uhOJok; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="W7uhOJok" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1E3C11F00A3A; Fri, 10 Jul 2026 20:24:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715091; bh=C9U7hTVIV5hnW3Iy6tzDPxArKTc/td9u7V5EE/DSgA8=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=W7uhOJokhKc2gJUfGeoUmCzknt4Uxys2U+9X59vh+pxKi5io2g2zMfJcd7yhqe+Rz PJuzoJIGnd3IH7hewvWSxE5ZTmcXH6LdeBTOkn/+XgwR9cqd6axeVqm1wxysu08ieN MLVpRkBnA0838K8Rrt8GC8FcdYZk8MTw62dLxILsRnOz2/SC4Dv9NtLxpF37T0uAdj VJEdaWU+Rv29jCHBWZafM0pjlpkfNbnmHg4dVJxwp5wGPBCtM2aP7vZJ7HTPwMkCkm XljXzGGXS0Cpa8u/2enRoxyu8aqSQAUNeUJ1sSuPOzOysHNf2I58eZf7+Fp8a5rNPh 318DpOBchn2jQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:00 +0100 Subject: [PATCH v2 19/33] mm: prefer vma_[start,end]_pgoff() to vma->vm_pgoff in kernel/ Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-19-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=11256; i=ljs@kernel.org; h=from:subject:message-id; bh=0R0W7VTOgU1IPpg8ezqD30zdmiulVdYqX8Tjb5nSXd4=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg230KqLcZxxjPdSmk3RkvUZI5Yr7Siffuqxo/H0xZ G121+RZHaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZiIdRfDHy537lDf6d4PPjFf OW++NrVRreKvwy6H2xnT9ZK8tjoWRTL8M5XKqlxwI3v6u/lWb176Vz6e9TjqwvY3u9v4rzx8zvi XnxsA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Be consistent in using vma_start_pgoff() and vma_end_pgoff(), which clearly indicates which part of the VMA the page offset refers to and aids greppability. This is part of a broader series laying the ground to provide a virtual page offset for MAP_PRIVATE-file backed anon folios. No functional change intended. Acked-by: Marek Szyprowski # for kernel/dma Reviewed-by: Gregory Price Acked-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- kernel/dma/coherent.c | 7 ++++--- kernel/dma/direct.c | 6 ++++-- kernel/dma/mapping.c | 8 +++++--- kernel/dma/ops_helpers.c | 4 ++-- kernel/events/core.c | 20 +++++++++++--------- kernel/events/uprobes.c | 11 +++++++---- kernel/kcov.c | 2 +- kernel/trace/ring_buffer.c | 3 ++- 8 files changed, 36 insertions(+), 25 deletions(-) diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index bcdc0f76d2e8..2d3195eb7e83 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -236,14 +236,15 @@ static int __dma_mmap_from_coherent(struct dma_cohere= nt_mem *mem, { if (mem && vaddr >=3D mem->virt_base && vaddr + size <=3D (mem->virt_base + ((dma_addr_t)mem->size << PAGE_SHIFT))) { - unsigned long off =3D vma->vm_pgoff; + const pgoff_t pgoff_start =3D vma_start_pgoff(vma); + const pgoff_t pgoff_end =3D vma_end_pgoff(vma); int start =3D (vaddr - mem->virt_base) >> PAGE_SHIFT; unsigned long user_count =3D vma_pages(vma); int count =3D PAGE_ALIGN(size) >> PAGE_SHIFT; =20 *ret =3D -ENXIO; - if (off < count && user_count <=3D count - off) { - unsigned long pfn =3D mem->pfn_base + start + off; + if (pgoff_start < count && pgoff_end <=3D count) { + unsigned long pfn =3D mem->pfn_base + start + pgoff_start; *ret =3D remap_pfn_range(vma, vma->vm_start, pfn, user_count << PAGE_SHIFT, vma->vm_page_prot); diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 4391b797d4db..436310d6e4a2 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -534,6 +534,8 @@ int dma_direct_mmap(struct device *dev, struct vm_area_= struct *vma, unsigned long user_count =3D vma_pages(vma); unsigned long count =3D PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long pfn =3D PHYS_PFN(dma_to_phys(dev, dma_addr)); + const pgoff_t pgoff_start =3D vma_start_pgoff(vma); + const pgoff_t pgoff_end =3D vma_end_pgoff(vma); int ret =3D -ENXIO; =20 vma->vm_page_prot =3D dma_pgprot(dev, vma->vm_page_prot, attrs); @@ -545,9 +547,9 @@ int dma_direct_mmap(struct device *dev, struct vm_area_= struct *vma, if (dma_mmap_from_global_coherent(vma, cpu_addr, size, &ret)) return ret; =20 - if (vma->vm_pgoff >=3D count || user_count > count - vma->vm_pgoff) + if (pgoff_start >=3D count || pgoff_end > count) return -ENXIO; - return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, + return remap_pfn_range(vma, vma->vm_start, pfn + pgoff_start, user_count << PAGE_SHIFT, vma->vm_page_prot); } =20 diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4fe04669e5e6..c986639044e9 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -761,12 +761,14 @@ EXPORT_SYMBOL_GPL(dma_free_pages); int dma_mmap_pages(struct device *dev, struct vm_area_struct *vma, size_t size, struct page *page) { - unsigned long count =3D PAGE_ALIGN(size) >> PAGE_SHIFT; + const pgoff_t pgoff_start =3D vma_start_pgoff(vma); + const pgoff_t pgoff_end =3D vma_end_pgoff(vma); + const unsigned long count =3D PAGE_ALIGN(size) >> PAGE_SHIFT; =20 - if (vma->vm_pgoff >=3D count || vma_pages(vma) > count - vma->vm_pgoff) + if (pgoff_start >=3D count || pgoff_end > count) return -ENXIO; return remap_pfn_range(vma, vma->vm_start, - page_to_pfn(page) + vma->vm_pgoff, + page_to_pfn(page) + pgoff_start, vma_pages(vma) << PAGE_SHIFT, vma->vm_page_prot); } EXPORT_SYMBOL_GPL(dma_mmap_pages); diff --git a/kernel/dma/ops_helpers.c b/kernel/dma/ops_helpers.c index 20caf9cabf69..6b5f9208d31c 100644 --- a/kernel/dma/ops_helpers.c +++ b/kernel/dma/ops_helpers.c @@ -39,7 +39,7 @@ int dma_common_mmap(struct device *dev, struct vm_area_st= ruct *vma, #ifdef CONFIG_MMU unsigned long user_count =3D vma_pages(vma); unsigned long count =3D PAGE_ALIGN(size) >> PAGE_SHIFT; - unsigned long off =3D vma->vm_pgoff; + unsigned long off =3D vma_start_pgoff(vma); struct page *page =3D dma_common_vaddr_to_page(cpu_addr); int ret =3D -ENXIO; =20 @@ -52,7 +52,7 @@ int dma_common_mmap(struct device *dev, struct vm_area_st= ruct *vma, return -ENXIO; =20 return remap_pfn_range(vma, vma->vm_start, - page_to_pfn(page) + vma->vm_pgoff, + page_to_pfn(page) + vma_start_pgoff(vma), user_count << PAGE_SHIFT, vma->vm_page_prot); #else return -ENXIO; diff --git a/kernel/events/core.c b/kernel/events/core.c index d7f3e2c2ecb1..44a092db5d58 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6998,7 +6998,7 @@ static void perf_mmap_open(struct vm_area_struct *vma) refcount_inc(&event->mmap_count); refcount_inc(&event->rb->mmap_count); =20 - if (vma->vm_pgoff) + if (vma_start_pgoff(vma)) refcount_inc(&event->rb->aux_mmap_count); =20 if (mapped) @@ -7032,7 +7032,7 @@ static void perf_mmap_close(struct vm_area_struct *vm= a) * The AUX buffer is strictly a sub-buffer, serialize using aux_mutex * to avoid complications. */ - if (rb_has_aux(rb) && vma->vm_pgoff =3D=3D rb->aux_pgoff && + if (rb_has_aux(rb) && vma_start_pgoff(vma) =3D=3D rb->aux_pgoff && refcount_dec_and_mutex_lock(&rb->aux_mmap_count, &rb->aux_mutex)) { /* * Stop all AUX events that are writing to this buffer, @@ -7190,7 +7190,8 @@ static int map_range(struct perf_buffer *rb, struct v= m_area_struct *vma) */ for (pagenum =3D 0; pagenum < nr_pages; pagenum++) { unsigned long va =3D vma->vm_start + PAGE_SIZE * pagenum; - struct page *page =3D perf_mmap_to_page(rb, vma->vm_pgoff + pagenum); + struct page *page =3D perf_mmap_to_page(rb, + vma_start_pgoff(vma) + pagenum); =20 if (page =3D=3D NULL) { err =3D -EINVAL; @@ -7344,6 +7345,7 @@ static int perf_mmap_rb(struct vm_area_struct *vma, s= truct perf_event *event, static int perf_mmap_aux(struct vm_area_struct *vma, struct perf_event *ev= ent, unsigned long nr_pages) { + const pgoff_t pgoff_start =3D vma_start_pgoff(vma); long extra =3D 0, user_extra =3D nr_pages; u64 aux_offset, aux_size; struct perf_buffer *rb; @@ -7366,11 +7368,11 @@ static int perf_mmap_aux(struct vm_area_struct *vma= , struct perf_event *event, if (aux_offset < perf_data_size(rb) + PAGE_SIZE) return -EINVAL; =20 - if (aux_offset !=3D vma->vm_pgoff << PAGE_SHIFT) + if (aux_offset !=3D pgoff_start << PAGE_SHIFT) return -EINVAL; =20 /* already mapped with a different offset */ - if (rb_has_aux(rb) && rb->aux_pgoff !=3D vma->vm_pgoff) + if (rb_has_aux(rb) && rb->aux_pgoff !=3D pgoff_start) return -EINVAL; =20 if (aux_size !=3D nr_pages * PAGE_SIZE) @@ -7400,7 +7402,7 @@ static int perf_mmap_aux(struct vm_area_struct *vma, = struct perf_event *event, if (vma->vm_flags & VM_WRITE) rb_flags |=3D RING_BUFFER_WRITABLE; =20 - ret =3D rb_alloc_aux(rb, event, vma->vm_pgoff, nr_pages, + ret =3D rb_alloc_aux(rb, event, pgoff_start, nr_pages, event->attr.aux_watermark, rb_flags); if (ret) { refcount_dec(&rb->mmap_count); @@ -7457,7 +7459,7 @@ static int perf_mmap(struct file *file, struct vm_are= a_struct *vma) if (event->state <=3D PERF_EVENT_STATE_REVOKED) return -ENODEV; =20 - if (vma->vm_pgoff =3D=3D 0) + if (!vma_start_pgoff(vma)) ret =3D perf_mmap_rb(vma, event, nr_pages); else ret =3D perf_mmap_aux(vma, event, nr_pages); @@ -9884,7 +9886,7 @@ static bool perf_addr_filter_vma_adjust(struct perf_a= ddr_filter *filter, struct perf_addr_filter_range *fr) { unsigned long vma_size =3D vma->vm_end - vma->vm_start; - unsigned long off =3D vma->vm_pgoff << PAGE_SHIFT; + unsigned long off =3D vma_start_pgoff(vma) << PAGE_SHIFT; struct file *file =3D vma->vm_file; =20 if (!perf_addr_filter_match(filter, file, off, vma_size)) @@ -9974,7 +9976,7 @@ void perf_event_mmap(struct vm_area_struct *vma) /* .tid */ .start =3D vma->vm_start, .len =3D vma->vm_end - vma->vm_start, - .pgoff =3D (u64)vma->vm_pgoff << PAGE_SHIFT, + .pgoff =3D (u64)vma_start_pgoff(vma) << PAGE_SHIFT, }, /* .maj (attr_mmap2 only) */ /* .min (attr_mmap2 only) */ diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index ac340a703d06..ae2f3b9f8d50 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -144,12 +144,14 @@ static bool valid_vma(struct vm_area_struct *vma, boo= l is_register) =20 static unsigned long offset_to_vaddr(struct vm_area_struct *vma, loff_t of= fset) { - return vma->vm_start + offset - ((loff_t)vma->vm_pgoff << PAGE_SHIFT); + return vma->vm_start + offset - + ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT); } =20 static loff_t vaddr_to_offset(struct vm_area_struct *vma, unsigned long va= ddr) { - return ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + (vaddr - vma->vm_start); + return ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT) + + (vaddr - vma->vm_start); } =20 /** @@ -1482,7 +1484,7 @@ static int unapply_uprobe(struct uprobe *uprobe, stru= ct mm_struct *mm) file_inode(vma->vm_file) !=3D uprobe->inode) continue; =20 - offset =3D (loff_t)vma->vm_pgoff << PAGE_SHIFT; + offset =3D (loff_t)vma_start_pgoff(vma) << PAGE_SHIFT; if (uprobe->offset < offset || uprobe->offset >=3D offset + vma->vm_end - vma->vm_start) continue; @@ -2453,7 +2455,8 @@ static struct uprobe *find_active_uprobe_speculative(= unsigned long bp_vaddr) if (!vm_file) return NULL; =20 - offset =3D (loff_t)(vma->vm_pgoff << PAGE_SHIFT) + (bp_vaddr - vma->vm_st= art); + offset =3D (loff_t)(vma_start_pgoff(vma) << PAGE_SHIFT) + + (bp_vaddr - vma->vm_start); uprobe =3D find_uprobe_rcu(vm_file->f_inode, offset); if (!uprobe) return NULL; diff --git a/kernel/kcov.c b/kernel/kcov.c index 1df373fb562b..b19b473c366a 100644 --- a/kernel/kcov.c +++ b/kernel/kcov.c @@ -512,7 +512,7 @@ static int kcov_mmap(struct file *filep, struct vm_area= _struct *vma) =20 spin_lock_irqsave(&kcov->lock, flags); size =3D kcov->size * sizeof(unsigned long); - if (kcov->area =3D=3D NULL || vma->vm_pgoff !=3D 0 || + if (kcov->area =3D=3D NULL || vma_start_pgoff(vma) || vma->vm_end - vma->vm_start !=3D size) { res =3D -EINVAL; goto exit; diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 56a328e94395..dfa493d54ef9 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -7613,7 +7613,8 @@ static int __rb_inc_dec_mapped(struct ring_buffer_per= _cpu *cpu_buffer, static int __rb_map_vma(struct ring_buffer_per_cpu *cpu_buffer, struct vm_area_struct *vma) { - unsigned long nr_subbufs, nr_pages, nr_vma_pages, pgoff =3D vma->vm_pgoff; + unsigned long nr_subbufs, nr_pages, nr_vma_pages; + pgoff_t pgoff =3D vma_start_pgoff(vma); unsigned int subbuf_pages, subbuf_order; struct page **pages __free(kfree) =3D NULL; int p =3D 0, s =3D 0; --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DFE339B97B; Fri, 10 Jul 2026 20:25:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715116; cv=none; b=L7+TRkqGBZFkifazf0h88EwYMe2xw2zO3exTDD6zFq3A6T3NuhrMmoi28q78nI5fkP6yyUaLTR+wCKwDZ8ibnzdsEIRyoA6kHKtKEdhUF4fgWh9gqn5ooDR0tA0M6pWQF+ZiXOJl8iQwwWdV+cdOLkqCRv0PKbenVMmyy4gvfnU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715116; c=relaxed/simple; bh=IR92Sj2wx3lyPljFS7ckov7loj2/kkvP36FNDNTtRqM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=im6pam4F69aZZeejMfFpHhUksum6wUncuLjQzgh1yth5AQGqe45LURR9ZMc0rVEg1qYKTPGYyKaG63Yk87eQAbKk0XPt/4TGc11MJz6RiedfAiHforyuVIR+LH8WLeOwvF59Bv9C1/HUshCGoC13UrERrIjAs6Os+4C2qQijIc8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Uq5XeaJL; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Uq5XeaJL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36A631F000E9; Fri, 10 Jul 2026 20:24:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715114; bh=u31X8RgcNJCyJqpmVcGG42bB96q2xKa4t0yZEgilb4Q=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Uq5XeaJLHBwnumgunwSh7i/Hd9s2U4FpSqq+xiCRQj/osFxm3pnId7Z+XBEDS3gd5 3ypjSBQFS9TyAD7v3Npi5UX7YFEZ458imtDcFa4Jt+/44KEYaoKfRZj/LIELwe4B3N BOrvvcUQomx6n+P2PXoPHUdmjZD819pWQZfoLvVZ13eY4EhKbys8SuV58kuIBHCZud WHdNwrMicwK+JmxVbSAg20mFS0W2LrXaI8T5/dVwSsGHKaVzO6nHs/m6KaLL4Dh2ZF 5aRdp9q0gLj2o0/nafDk7JsU+Tjvmb6YGzpPig2SNbqXtBxRENUBxdxe9JxkHGhwYk GDuhKXBcZZhJQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:01 +0100 Subject: [PATCH v2 20/33] mm/vma: remove duplicative vma_pgoff_offset() helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-20-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2240; i=ljs@kernel.org; h=from:subject:message-id; bh=IR92Sj2wx3lyPljFS7ckov7loj2/kkvP36FNDNTtRqM=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg22Kr16aZZ41tS1Gwr7/Wmclt6HgYvFlnTotLDvqr 73SCjTuKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwEQighkZVs965fbQTWFX+DNP 1f2brm+ySlkTMP3ewjxpTluDV9P+rGJkuFX/VPbDSc7A/gaOpucV8Yw2y5tFqpOnT3nkeYtrxn9 GJgA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 This is doing what linear_page_index() does, so eliminate it and replace it with linear_page_index(). Update the VMA userland tests to reflect this change. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.h | 9 +-------- tools/testing/vma/include/dup.h | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/mm/vma.h b/mm/vma.h index 527716c8739d..2342516ce00e 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -247,13 +247,6 @@ static inline pgoff_t vmg_end_pgoff(const struct vma_m= erge_struct *vmg) return vmg_start_pgoff(vmg) + vmg_pages(vmg); } =20 -/* Assumes addr >=3D vma->vm_start. */ -static inline pgoff_t vma_pgoff_offset(struct vm_area_struct *vma, - unsigned long addr) -{ - return vma->vm_pgoff + PHYS_PFN(addr - vma->vm_start); -} - #define VMG_STATE(name, mm_, vmi_, start_, end_, vma_flags_, pgoff_) \ struct vma_merge_struct name =3D { \ .mm =3D mm_, \ @@ -275,7 +268,7 @@ static inline pgoff_t vma_pgoff_offset(struct vm_area_s= truct *vma, .start =3D start_, \ .end =3D end_, \ .vm_flags =3D vma_->vm_flags, \ - .pgoff =3D vma_pgoff_offset(vma_, start_), \ + .pgoff =3D linear_page_index(vma_, start_), \ .file =3D vma_->vm_file, \ .anon_vma =3D vma_->anon_vma, \ .policy =3D vma_policy(vma_), \ diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/du= p.h index 535747d7fee4..7ed165c8d9bc 100644 --- a/tools/testing/vma/include/dup.h +++ b/tools/testing/vma/include/dup.h @@ -1548,3 +1548,19 @@ static inline pgprot_t vma_get_page_prot(vma_flags_t= vma_flags) =20 return vm_get_page_prot(vm_flags); } + +static inline pgoff_t linear_page_delta(const struct vm_area_struct *vma, + const unsigned long address) +{ + return (address - vma->vm_start) >> PAGE_SHIFT; +} + +static inline pgoff_t linear_page_index(const struct vm_area_struct *vma, + const unsigned long address) +{ + pgoff_t pgoff; + + pgoff =3D linear_page_delta(vma, address); + pgoff +=3D vma_start_pgoff(vma); + return pgoff; +} --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C3CA339BFF1; Fri, 10 Jul 2026 20:25:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715140; cv=none; b=nNQETDMQfaQkwIGULwWoJJJE2FKbMFkHEB+TxjdVISnch/mjJFA5lpBlNaorZ2PpDOfAkz/lqa5sYPA5rH/qVQbNTgz9yqdKUy/zslcdPe/xCdSvL/YHlyd35hseu+T7IIihTCGzZ1HYMOKR4K8o4VyiCf/z+fWAkoxC5m27Yxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715140; c=relaxed/simple; bh=ckvqCIz6u2cx+l/WDG6gaArVCUWUIRqrGc2wRGUU3cQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uAfdXPjZnJXoMQg18lL28oVSjT2fY578lolqTCbuCAGl5O+hshNH9nvrMl1vHHZbjoAxBwqiw6O5dLOEh0URSa8FgK6BGDCpCNpbnjmfPEYoVgzD1lv1l8RYA1S3ZEUCv+z/op1pBmxcaZpsMFLQDAnZPjp92i5iakkqOG0lLBI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mab6I1St; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mab6I1St" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 606461F00A3A; Fri, 10 Jul 2026 20:25:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715138; bh=cISQtH1v9odRfIrbAbtNudocrvnlKFEn/zLm3RnWId0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=mab6I1StgAzj9g7uw5lQ/WS5hP///Fjejk+W+vwBcSz7BidfRMMNLWK8hC9Ksatl1 gswNJV0nG+cI3mkpyGUw9hZtSi8RjZ1Hn0Cks+8M6durix9KxdHBsmsEJpP4uzzED8 nwaNmCyg7v5aq+9gb6aFja4/BRzqV03uXijWLCJhjJBaKoIksOwwmCoPQNjfcTWVdb zpnr4ozejDmTByYn3l1TvntcG2kUv26aOn0O+NTjRuERWfwlgXGwDF2AQ7fQQthSpO OM87sySq0K04/Zv6rZAF7yNU1yp1Yno0o5/2J89J8xL9KBaczByOCZaLm6M2KmLaJs Zd11QZPEcWKsQ== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:02 +0100 Subject: [PATCH v2 21/33] mm: use linear_page_[index, delta]() consistently Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-21-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King , Kai Huang , Ackerley Tng X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10399; i=ljs@kernel.org; h=from:subject:message-id; bh=ckvqCIz6u2cx+l/WDG6gaArVCUWUIRqrGc2wRGUU3cQ=; b=kA0DAAoWz53NioHifxQByyZiAGpRUzzIHD/Ww2NC0/pDOgUFGYibcK9BkNhLN7CJLfyH3DJ7B oh1BAAWCgAdFiEE5/QXv1IUVp6J0E9Gz53NioHifxQFAmpRUzwACgkQz53NioHifxTDZQD7BkHF NX9UQukSdl2VQHKwu0wreg7UTF/+bcMU3geRfBYA/0WbEVtZm+JfAzf9LjseOW526ZEuHJGrzmp uZYAiIK0F X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 There are a number of places where we open code what linear_page_index() and linear_page_delta() calculate. Replace this code with the appropriate functions for consistency. No functional change intended. Reviewed-by: Thomas Zimmermann # for DRM Acked-by: Kai Huang # for sgx Reviewed-by: Gregory Price Reviewed-by: Pedro Falcato # for mm Reviewed-by: Ackerley Tng # for guest_memfd Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- arch/arm/mm/fault-armv.c | 2 +- arch/x86/kernel/cpu/sgx/virt.c | 3 ++- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 3 ++- drivers/gpu/drm/gma500/gem.c | 2 +- drivers/gpu/drm/msm/msm_gem.c | 3 ++- drivers/gpu/drm/omapdrm/omap_gem.c | 5 +++-- drivers/gpu/drm/tegra/gem.c | 3 ++- drivers/gpu/drm/ttm/ttm_bo_vm.c | 7 ++++--- drivers/vfio/pci/nvgrace-gpu/main.c | 3 ++- drivers/vfio/pci/vfio_pci_core.c | 3 ++- mm/nommu.c | 2 +- mm/vma.c | 2 +- virt/kvm/guest_memfd.c | 2 +- 13 files changed, 24 insertions(+), 16 deletions(-) diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index b505f1fd7984..2769b0f3325f 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c @@ -132,7 +132,7 @@ make_coherent(struct address_space *mapping, struct vm_= area_struct *vma, pgoff_t pgoff; int aliases =3D 0; =20 - pgoff =3D vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT); + pgoff =3D linear_page_index(vma, addr); =20 /* * If we have any shared mappings that are in the same mm diff --git a/arch/x86/kernel/cpu/sgx/virt.c b/arch/x86/kernel/cpu/sgx/virt.c index db6806c40483..6a1933ddc6fc 100644 --- a/arch/x86/kernel/cpu/sgx/virt.c +++ b/arch/x86/kernel/cpu/sgx/virt.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -41,7 +42,7 @@ static int __sgx_vepc_fault(struct sgx_vepc *vepc, WARN_ON(!mutex_is_locked(&vepc->lock)); =20 /* Calculate index of EPC page in virtual EPC's page_array */ - index =3D vma->vm_pgoff + PFN_DOWN(addr - vma->vm_start); + index =3D linear_page_index(vma, addr); =20 epc_page =3D xa_load(&vepc->page_array, index); if (epc_page) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnavi= v/etnaviv_gem.c index b0436a1e103f..2e4d6d117ee2 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -188,7 +189,7 @@ static vm_fault_t etnaviv_gem_fault(struct vm_fault *vm= f) } =20 /* We don't use vmf->pgoff since that has the fake offset: */ - pgoff =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + pgoff =3D linear_page_delta(vma, vmf->address); =20 pfn =3D page_to_pfn(pages[pgoff]); =20 diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c index 88f1e86c8903..2708e8c68f4c 100644 --- a/drivers/gpu/drm/gma500/gem.c +++ b/drivers/gpu/drm/gma500/gem.c @@ -288,7 +288,7 @@ static vm_fault_t psb_gem_fault(struct vm_fault *vmf) =20 /* Page relative to the VMA start - we must calculate this ourselves because vmf->pgoff is the fake GEM offset */ - page_offset =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + page_offset =3D linear_page_delta(vma, vmf->address); =20 /* CPU view of the page, don't go via the GART for CPU writes */ if (pobj->stolen) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index efd3d3c9a449..cbf723a5d86f 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -9,6 +9,7 @@ #include #include #include +#include =20 #include #include @@ -360,7 +361,7 @@ static vm_fault_t msm_gem_fault(struct vm_fault *vmf) } =20 /* We don't use vmf->pgoff since that has the fake offset: */ - pgoff =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + pgoff =3D linear_page_delta(vma, vmf->address); =20 pfn =3D page_to_pfn(pages[pgoff]); =20 diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/o= map_gem.c index 8e013e4f2c6b..00404fb6c29a 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c @@ -5,6 +5,7 @@ */ =20 #include +#include #include #include #include @@ -359,7 +360,7 @@ static vm_fault_t omap_gem_fault_1d(struct drm_gem_obje= ct *obj, pgoff_t pgoff; =20 /* We don't use vmf->pgoff since that has the fake offset: */ - pgoff =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + pgoff =3D linear_page_delta(vma, vmf->address); =20 if (omap_obj->pages) { omap_gem_cpu_sync_page(obj, pgoff); @@ -407,7 +408,7 @@ static vm_fault_t omap_gem_fault_2d(struct drm_gem_obje= ct *obj, const int m =3D DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE); =20 /* We don't use vmf->pgoff since that has the fake offset: */ - pgoff =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + pgoff =3D linear_page_delta(vma, vmf->address); =20 /* * Actual address we start mapping at is rounded down to previous slot diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index 436394e04812..1d8d27a5ea89 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c @@ -13,6 +13,7 @@ #include #include #include +#include #include =20 #include @@ -564,7 +565,7 @@ static vm_fault_t tegra_bo_fault(struct vm_fault *vmf) if (!bo->pages) return VM_FAULT_SIGBUS; =20 - offset =3D (vmf->address - vma->vm_start) >> PAGE_SHIFT; + offset =3D linear_page_delta(vma, vmf->address); page =3D bo->pages[offset]; =20 return vmf_insert_page(vma, vmf->address, page); diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_v= m.c index a80510489c45..88babf435ac2 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c @@ -32,6 +32,7 @@ #define pr_fmt(fmt) "[TTM] " fmt =20 #include +#include =20 #include #include @@ -208,9 +209,9 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vm= f, if (unlikely(err !=3D 0)) return VM_FAULT_SIGBUS; =20 - page_offset =3D ((address - vma->vm_start) >> PAGE_SHIFT) + - vma->vm_pgoff - drm_vma_node_start(&bo->base.vma_node); - page_last =3D vma_pages(vma) + vma->vm_pgoff - + page_offset =3D linear_page_index(vma, address) - + drm_vma_node_start(&bo->base.vma_node); + page_last =3D vma_end_pgoff(vma) - drm_vma_node_start(&bo->base.vma_node); =20 if (unlikely(page_offset >=3D PFN_UP(bo->base.size))) diff --git a/drivers/vfio/pci/nvgrace-gpu/main.c b/drivers/vfio/pci/nvgrace= -gpu/main.c index d07dcacb76bd..963fd8ded20d 100644 --- a/drivers/vfio/pci/nvgrace-gpu/main.c +++ b/drivers/vfio/pci/nvgrace-gpu/main.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include =20 @@ -385,7 +386,7 @@ static unsigned long addr_to_pgoff(struct vm_area_struc= t *vma, u64 pgoff =3D vma->vm_pgoff & ((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1); =20 - return ((addr - vma->vm_start) >> PAGE_SHIFT) + pgoff; + return linear_page_delta(vma, addr) + pgoff; } =20 static vm_fault_t nvgrace_gpu_vfio_pci_huge_fault(struct vm_fault *vmf, diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_c= ore.c index 3f11a9624b9c..a113c55845e1 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -1780,7 +1781,7 @@ static vm_fault_t vfio_pci_mmap_huge_fault(struct vm_= fault *vmf, struct vm_area_struct *vma =3D vmf->vma; struct vfio_pci_core_device *vdev =3D vma->vm_private_data; unsigned long addr =3D vmf->address & ~((PAGE_SIZE << order) - 1); - unsigned long pgoff =3D (addr - vma->vm_start) >> PAGE_SHIFT; + unsigned long pgoff =3D linear_page_delta(vma, addr); unsigned long pfn =3D vma_to_pfn(vma) + pgoff; vm_fault_t ret =3D VM_FAULT_FALLBACK; =20 diff --git a/mm/nommu.c b/mm/nommu.c index 52074ea90acb..c0a0869cd0d6 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1355,7 +1355,7 @@ static int split_vma(struct vma_iterator *vmi, struct= vm_area_struct *vma, *region =3D *vma->vm_region; new->vm_region =3D region; =20 - npages =3D (addr - vma->vm_start) >> PAGE_SHIFT; + npages =3D linear_page_delta(vma, addr); =20 if (new_below) { region->vm_top =3D region->vm_end =3D new->vm_end =3D addr; diff --git a/mm/vma.c b/mm/vma.c index 4a4d096ba86a..7aa0149f076c 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -517,7 +517,7 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_st= ruct *vma, new->vm_end =3D addr; } else { new->vm_start =3D addr; - new->vm_pgoff +=3D ((addr - vma->vm_start) >> PAGE_SHIFT); + new->vm_pgoff +=3D linear_page_delta(vma, addr); } =20 err =3D -ENOMEM; diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index db57c5766ab6..f0e5da490866 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -440,7 +440,7 @@ static int kvm_gmem_set_policy(struct vm_area_struct *v= ma, struct mempolicy *mpo static struct mempolicy *kvm_gmem_get_policy(struct vm_area_struct *vma, unsigned long addr, pgoff_t *ilx) { - pgoff_t pgoff =3D vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT); + pgoff_t pgoff =3D linear_page_index(vma, addr); struct inode *inode =3D file_inode(vma->vm_file); =20 *ilx =3D inode->i_ino; --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BECA239A7FE; Fri, 10 Jul 2026 20:26:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715163; cv=none; b=mttg1o8beIYoPXZCwP93aH2WnI+UQC7j5Iy9SVI0n3qMzJC8YvItqujwe3F5mOHA0ruZVJn/WASACpameoYG9LIa+RprCCTyneq9mWXhctwq50qZARUucbzei6y/0BTH7XH5BE9oDXGBy9OHXbGlANYHWJGX2yKgK/Hz9tW+9X4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715163; c=relaxed/simple; bh=viV3MpLqfUAe1sqc9evXVxPvdZ0z1c7yNCArBlJLKts=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fbUeiBrGVmbP3Ra32CQJ7R4dD/N6GKRANyVUTFDYU0l05QVmjPA+TIwRpwPoJFJTxcVMx9BqgyaEheq63Ax9rwFflgZIVviNNwdEapttN8JTOcMC9b9pHStbtjnAhB2QahaSl2uFINVNMFbyC/urkRPQRJoGp8Y57oVu3N+ubyY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HwOfOxNY; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HwOfOxNY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD1A91F000E9; Fri, 10 Jul 2026 20:25:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715161; bh=bUGGYLPM184fXg7TuW5WlZpqNKDyTrGesm4GIDrm7/g=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=HwOfOxNYJr0ufnnwjsShvm8UoTFDoVDyZyLe5qM8luP+IyMfUureE/4/LdfG8uNvp l2fyy2sklIZ1g8zXU1h/Dujp91lJ3y/YMUEyIA0yaCkBv64dn7+eK6bnjONBXyGjkh 2MdWVKmdvm7AgFGWE4NqEcl7KMYdmzXxx45wTsfG/uOos67hsa+uJWogpK3oSsHZLs PEoCxmuQR0OPyTuKW9A7PRu792Qxjs8eLhacq5hB9InGQR663cidPLcGe/v49JjENl kWNryTiYfujVP70WKEmXvqMUsNxPgx4q7+0bAV5xV/Oa57dgKbVLEJW9cwR83wMw30 Xxu+4E6LLwm+Q== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:03 +0100 Subject: [PATCH v2 22/33] mm/vma: introduce vma_assert_can_modify() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-22-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3596; i=ljs@kernel.org; h=from:subject:message-id; bh=viV3MpLqfUAe1sqc9evXVxPvdZ0z1c7yNCArBlJLKts=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg22Kz9fNu6eSNvvBXWZ7lRONX6ct3GUurDZVbbXAC pPsR6V/OkpZGMS4GGTFFFmefxHfHyQSNq/zgr8bzBxWJpAhDFycAjCRhN8M/wz3Ji1evXiHVaSo 7KH3RZOj9q/2tta+sizgwKoUXSbHeTEM/xOvbZzUJBNU59dnr7C7/JXw/aXmwrs9029wLZytnZn xnhEA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 vma_assert_write_locked() and vma_assert_attached() are useful for their own purposes, however VMA code absolutely does allow the modification of non-write locked VMAs if they are at that point detached (i.e. unreachable from anywhere). It's therefore useful to be able to assert that a VMA is either detached (modification doesn't matter) or write locked (you're explicitly locked for modification). Therefore introduce vma_assert_can_modify() for this purpose. While we're here, make vma_is_attached() available generally - if !CONFIG_PER_VMA_LOCK, then there's no sense in which a VMA is detached (vma_mark_detached() is a noop), so have this default to true in this case. Also update VMA userland tests to reflect this change, correcting the previously open-coded vma_assert_[attached,detached]() there. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) --- include/linux/mmap_lock.h | 8 ++++++++ tools/testing/vma/include/dup.h | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/linux/mmap_lock.h b/include/linux/mmap_lock.h index 04b8f61ece5d..d513286d8160 100644 --- a/include/linux/mmap_lock.h +++ b/include/linux/mmap_lock.h @@ -506,6 +506,8 @@ static inline __must_check int vma_start_write_killable(struct vm_area_struct *vma) { return 0; } static inline void vma_assert_write_locked(struct vm_area_struct *vma) { mmap_assert_write_locked(vma->vm_mm); } +static inline bool vma_is_attached(struct vm_area_struct *vma) + { return true; } static inline void vma_assert_attached(struct vm_area_struct *vma) {} static inline void vma_assert_detached(struct vm_area_struct *vma) {} static inline void vma_mark_attached(struct vm_area_struct *vma) {} @@ -530,6 +532,12 @@ static inline void vma_assert_stabilised(struct vm_are= a_struct *vma) =20 #endif /* CONFIG_PER_VMA_LOCK */ =20 +static inline void vma_assert_can_modify(struct vm_area_struct *vma) +{ + if (vma_is_attached(vma)) + vma_assert_write_locked(vma); +} + static inline void mmap_write_lock(struct mm_struct *mm) { __mmap_lock_trace_start_locking(mm, true); diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/du= p.h index 7ed165c8d9bc..e9ddc818f2c3 100644 --- a/tools/testing/vma/include/dup.h +++ b/tools/testing/vma/include/dup.h @@ -1163,6 +1163,11 @@ static inline struct vm_area_struct *vma_next(struct= vma_iterator *vmi) return mas_find(&vmi->mas, ULONG_MAX); } =20 +static inline bool vma_is_attached(struct vm_area_struct *vma) +{ + return refcount_read(&vma->vm_refcnt); +} + /* * WARNING: to avoid racing with vma_mark_attached()/vma_mark_detached(), = these * assertions should be made either under mmap_write_lock or when the obje= ct @@ -1170,12 +1175,12 @@ static inline struct vm_area_struct *vma_next(struc= t vma_iterator *vmi) */ static inline void vma_assert_attached(struct vm_area_struct *vma) { - WARN_ON_ONCE(!refcount_read(&vma->vm_refcnt)); + WARN_ON_ONCE(!vma_is_attached(vma)); } =20 static inline void vma_assert_detached(struct vm_area_struct *vma) { - WARN_ON_ONCE(refcount_read(&vma->vm_refcnt)); + WARN_ON_ONCE(vma_is_attached(vma)); } =20 static inline void vma_assert_write_locked(struct vm_area_struct *); @@ -1564,3 +1569,9 @@ static inline pgoff_t linear_page_index(const struct = vm_area_struct *vma, pgoff +=3D vma_start_pgoff(vma); return pgoff; } + +static inline void vma_assert_can_modify(struct vm_area_struct *vma) +{ + if (vma_is_attached(vma)) + vma_assert_write_locked(vma); +} --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4A6E39FCCC; Fri, 10 Jul 2026 20:26:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715186; cv=none; b=Lca4YA2G1dU1qRFpCyc6EDKFkDVmD0m7U3whZgFOyV2Zq73DQG4dyeTglBqVnaAvKo+3hfn8u8xXwVrfBZieFjx5rvLHGYtNAALm8Rm6piOHr85sMzlKGJGU1PqNUWgGvvKPw6TC8kWW5Du8P7HYzMyMkxk0j1QG2k8orZxdOr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715186; c=relaxed/simple; bh=ZykHi81wjQuWfRemBZVxUwwzxVVCtKrbcdoOfofMf0c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YX9kzc7TlTMjV7BBSSVidEx5eyUjUCC1eqc6ktb9UeuRQfW6J4sOQ6A9j2ZlJ9g3tSaiPd39jOX9rrEysQ1QUEFjVZET2KoixHruZVgQU4berb2Am/z5QcDORwPyXPc6i4aaPcCEJtQzkq4MHHkDnQRwWz57a2EogPQRwaioTRI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nnZWKKwQ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nnZWKKwQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 040C01F00A3A; Fri, 10 Jul 2026 20:26:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715184; bh=EoBc9Cck8QPIUuFmOHzMvwYdqHwSHiAvFbLNRDR+Z9M=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=nnZWKKwQGGxjXu3htGgxhTUQDnCEXUl7LPNi5xqYnZkUbGo1boxmUZ4jMcSnGPa8i Cdq0zmAoabCTJPgvcH704ilNEq/Ye6VnkDCtpiBuVV+HrMul1jwsLD/FL+/NUNH+UE jLwiS3icG2eXldivvwwNlYAmJcrYPX50bkfd64kAjxsdct+YancsphH8qpXVExYDlT yAQhZn70hX03zCCJonjRxCouPcJSSZ+25F/wSTWv+rPVm+SfSwEsQVz28CtqYqOg2o VYAg9RMa5jRoWUJRb35weSHr3hP0iurv4fyrxnkbNGnbQNMk6eGzB0KdytpIUEu7yD ak+FqZs7bYOdw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:04 +0100 Subject: [PATCH v2 23/33] mm/vma: add and use vma_[add/sub]_pgoff() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-23-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3543; i=ljs@kernel.org; h=from:subject:message-id; bh=ZykHi81wjQuWfRemBZVxUwwzxVVCtKrbcdoOfofMf0c=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg20+71xl9Xdvl/PM42+UlvYeXrRPfeGpawtvPEwPW fxCOqHWsKOUhUGMi0FWTJHl+Rfx/UEiYfM6L/i7wcxhZQIZwsDFKQATkTdk+GfVJxzqWh+YI/SB sZp3xrekzOOXTvowLn6rtXh75oOdWiIM/9TdVa+lRLyvavvEU3RRcqO+06X/DwT2fLhxZqHUw1l fjVkB X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Add helpers for adding or subtracting to a VMA's page offset, exposed internally for VMA users within mm in mm/vma.h. This is to lay the foundations for tracking anonymous page offset for MAP_PRIVATE file-backed mappings, where adding and subtracting from this value must be reflected in both the file and anonymous offsets. These are used on VMA split and downward stack expansion. No functional change intended. Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) --- mm/nommu.c | 6 ++++-- mm/vma.c | 6 +++--- mm/vma.h | 12 ++++++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/mm/nommu.c b/mm/nommu.c index c0a0869cd0d6..2a0136f6081d 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -41,6 +41,7 @@ #include #include #include "internal.h" +#include "vma.h" =20 unsigned long highest_memmap_pfn; int heap_stack_gap =3D 0; @@ -1361,7 +1362,8 @@ static int split_vma(struct vma_iterator *vmi, struct= vm_area_struct *vma, region->vm_top =3D region->vm_end =3D new->vm_end =3D addr; } else { region->vm_start =3D new->vm_start =3D addr; - region->vm_pgoff =3D new->vm_pgoff +=3D npages; + vma_add_pgoff(new, npages); + region->vm_pgoff =3D vma_start_pgoff(new); } =20 vma_iter_config(vmi, new->vm_start, new->vm_end); @@ -1378,7 +1380,7 @@ static int split_vma(struct vma_iterator *vmi, struct= vm_area_struct *vma, delete_nommu_region(vma->vm_region); if (new_below) { vma->vm_region->vm_start =3D vma->vm_start =3D addr; - vma->vm_pgoff +=3D npages; + vma_add_pgoff(vma, npages); vma->vm_region->vm_pgoff =3D vma_start_pgoff(vma); } else { vma->vm_region->vm_end =3D vma->vm_end =3D addr; diff --git a/mm/vma.c b/mm/vma.c index 7aa0149f076c..bdd99ba56b4d 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -517,7 +517,7 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_st= ruct *vma, new->vm_end =3D addr; } else { new->vm_start =3D addr; - new->vm_pgoff +=3D linear_page_delta(vma, addr); + vma_add_pgoff(new, linear_page_delta(vma, addr)); } =20 err =3D -ENOMEM; @@ -556,7 +556,7 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_st= ruct *vma, =20 if (new_below) { vma->vm_start =3D addr; - vma->vm_pgoff +=3D (addr - new->vm_start) >> PAGE_SHIFT; + vma_add_pgoff(vma, (addr - new->vm_start) >> PAGE_SHIFT); } else { vma->vm_end =3D addr; } @@ -3305,7 +3305,7 @@ int expand_downwards(struct vm_area_struct *vma, unsi= gned long address) vm_stat_account(mm, vma->vm_flags, grow); anon_rmap_tree_pre_update_vma(vma); vma->vm_start =3D address; - vma->vm_pgoff -=3D grow; + vma_sub_pgoff(vma, grow); /* Overwrite old entry in mtree. */ vma_iter_store_overwrite(&vmi, vma); anon_rmap_tree_post_update_vma(vma); diff --git a/mm/vma.h b/mm/vma.h index 2342516ce00e..47fe35e5307e 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -247,6 +247,18 @@ static inline pgoff_t vmg_end_pgoff(const struct vma_m= erge_struct *vmg) return vmg_start_pgoff(vmg) + vmg_pages(vmg); } =20 +static inline void vma_add_pgoff(struct vm_area_struct *vma, pgoff_t delta) +{ + vma_assert_can_modify(vma); + vma->vm_pgoff +=3D delta; +} + +static inline void vma_sub_pgoff(struct vm_area_struct *vma, pgoff_t delta) +{ + vma_assert_can_modify(vma); + vma->vm_pgoff -=3D delta; +} + #define VMG_STATE(name, mm_, vmi_, start_, end_, vma_flags_, pgoff_) \ struct vma_merge_struct name =3D { \ .mm =3D mm_, \ --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E6BC39A4C5; Fri, 10 Jul 2026 20:26:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715209; cv=none; b=LFBu26Hg+DHKal56VszniZCs/xw+c2Jt8VjJqgLW7eGHv7FVV9U3jo/gYE2/yXmHF6OLVGzCv34DHLTPSn3rQD1/nxYuDLuCAenFzd1gtcMEgHcvPjHLHUhuSkYUpbelbgi3Rz2vIiGmNlyqa0uzzze4Zk4YkxCOVANwu5ujYrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715209; c=relaxed/simple; bh=RcQMOr7okmwmrMHVS+mP4E/LNV7GZ1eHmNfHonDKIh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j/Au2Sove0G+MiCY7yDeBif7jvCxROTeVPBEsIqFMk2y4k1LcLpiijrBNN19BNahqukm5olStkRJxFAZQWIcJZZD/xIIuPPX6siH1TMv3u2y2BS3c5Urr2XrP5r6NbIEf12ca+JpwLz1GupMb+3anS4UxeQYzNUY/YHMBTqbyYM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KJhYClFf; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KJhYClFf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1BF241F000E9; Fri, 10 Jul 2026 20:26:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715207; bh=8BJkMOjdL3tYxtw1Cjs8vTxoBiLW1eSUk6BqH+zEY+k=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=KJhYClFfxeYjHFNUJ47V90SMGBiO8cXGZT/ciRY6YGuiovsxmCZXbNG8ahV8lExKU tQcg5juhIffLIZR//R2LnhwNbF2SWsLkmhBmD+P3wCCkI8has8aK417Z9gX5cPgN5N O+WrgR++oi31JXVQTxnmR3S7RoF9o//OqplK+v/9t3m3KtccaKhsOrAOzBemo3Zgek UChBNvQ+b/sZpnFQ0j4P6s+A3MZgRix818w+Bj62VOR3GS2+I0T/V0+ecp5+FlSWF1 5JFGPlM8nir+1FX9Y4JpdoDcAbLwkE2MWd4CLEAoi5F5BhiWr7r0SvrxT+zQz/LeXk sNZOexe92wEtg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:05 +0100 Subject: [PATCH v2 24/33] mm/vma: move __install_special_mapping() to vma.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-24-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3781; i=ljs@kernel.org; h=from:subject:message-id; bh=RcQMOr7okmwmrMHVS+mP4E/LNV7GZ1eHmNfHonDKIh4=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg23TKi///r6kSOvV5xDfzfGOb6oPXXY1TXU/3FG9L CtbrPlZRykLgxgXg6yYIsvzL+L7g0TC5nVe8HeDmcPKBDKEgYtTACaiHM/wT5s1/65G5dPAPVxJ G8UOCEgpfvhQp5s3ie3DtArRTalMMgz/i5dGzF+52+hHxDG+v5+01R6VF9vrGkwUN0h/sfeoZfN PLgA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 This function is operating on VMAs and rightly belongs in vma.c, where it can be subject to VMA userland testing and allows us to isolate it from the rest of mm. The _install_special_mapping() function will remain in mmap.c as a wrapper, since this is used by architecture-specific code. Doing so allows us to isolate more functions in vma.c for the same reasons. This forms part of work to allow for tracking MAP_PRIVATE file-backed mappings by their anonymous virtual page offset, as doing so allows us to isolate and keep code that interacts with this together. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/mmap.c | 38 -------------------------------------- mm/vma.c | 38 ++++++++++++++++++++++++++++++++++++++ mm/vma.h | 5 +++++ 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 91eaa0c9e7ee..308a43eabd83 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1447,44 +1447,6 @@ static vm_fault_t special_mapping_fault(struct vm_fa= ult *vmf) return VM_FAULT_SIGBUS; } =20 -static struct vm_area_struct *__install_special_mapping( - struct mm_struct *mm, - unsigned long addr, unsigned long len, - vm_flags_t vm_flags, void *priv, - const struct vm_operations_struct *ops) -{ - int ret; - struct vm_area_struct *vma; - - vma =3D vm_area_alloc(mm); - if (unlikely(vma =3D=3D NULL)) - return ERR_PTR(-ENOMEM); - - vma_set_range(vma, addr, addr + len, 0); - vm_flags |=3D mm->def_flags | VM_DONTEXPAND; - if (pgtable_supports_soft_dirty()) - vm_flags |=3D VM_SOFTDIRTY; - vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK); - vma->vm_page_prot =3D vm_get_page_prot(vma->vm_flags); - - vma->vm_ops =3D ops; - vma->vm_private_data =3D priv; - - ret =3D insert_vm_struct(mm, vma); - if (ret) - goto out; - - vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT); - - perf_event_mmap(vma); - - return vma; - -out: - vm_area_free(vma); - return ERR_PTR(ret); -} - bool vma_is_special_mapping(const struct vm_area_struct *vma, const struct vm_special_mapping *sm) { diff --git a/mm/vma.c b/mm/vma.c index bdd99ba56b4d..5308aa5a8c91 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -3399,3 +3399,41 @@ __weak unsigned long vma_mmu_pagesize(struct vm_area= _struct *vma) { return vma_kernel_pagesize(vma); } + +struct vm_area_struct *__install_special_mapping( + struct mm_struct *mm, + unsigned long addr, unsigned long len, + vm_flags_t vm_flags, void *priv, + const struct vm_operations_struct *ops) +{ + int ret; + struct vm_area_struct *vma; + + vma =3D vm_area_alloc(mm); + if (unlikely(vma =3D=3D NULL)) + return ERR_PTR(-ENOMEM); + + vma_set_range(vma, addr, addr + len, 0); + vm_flags |=3D mm->def_flags | VM_DONTEXPAND; + if (pgtable_supports_soft_dirty()) + vm_flags |=3D VM_SOFTDIRTY; + vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK); + vma->vm_page_prot =3D vm_get_page_prot(vma->vm_flags); + + vma->vm_ops =3D ops; + vma->vm_private_data =3D priv; + + ret =3D insert_vm_struct(mm, vma); + if (ret) + goto out; + + vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT); + + perf_event_mmap(vma); + + return vma; + +out: + vm_area_free(vma); + return ERR_PTR(ret); +} diff --git a/mm/vma.h b/mm/vma.h index 47fe35e5307e..14f026bf3be4 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -775,4 +775,9 @@ static inline bool map_deny_write_exec(const vma_flags_= t *old, } #endif =20 +struct vm_area_struct *__install_special_mapping(struct mm_struct *mm, + unsigned long addr, unsigned long len, + vm_flags_t vm_flags, void *priv, + const struct vm_operations_struct *ops); + #endif /* __MM_VMA_H */ --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0143339F190; Fri, 10 Jul 2026 20:27:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715232; cv=none; b=JCQQ0moX0OVFs9XIRF8eZBg2/1LZcyByNTuI1C7eAxKbebylc7S4YjDFiiaMq5spaESvB3QauMUywLE/BUs7maqX3b63q27zf37IwTebBdF2/mit1BZTKlDb2oioYvhmAXu9691bDD5qB42xHhCl7qjgU0igqNzfQwqH1HtIkHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715232; c=relaxed/simple; bh=DYBIxKjyIjg2H1S6yqXRCrIrObFnJroA9O36yuI28hY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RGNqb4d/6WrxT1SVF/cb4s+V+y7cAXVjMzv5RyXMDPbMfauG1bOD/Zpk9LFZ5LvRJXhspytKptwCc2uBs8qLTrLLA3dlsmeFfzHxuck5gnDpTSNghMQkgP9rN4Idcez3EA1/suDUpT8Xp69DOqPs85bT3i7stmCs2VWmPixP/cg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=drJA3TiK; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="drJA3TiK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 34F841F00A3A; Fri, 10 Jul 2026 20:26:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715230; bh=IPE+/P9KdKkfiafscak8Qeedwgljtr0X+OnR3tsbkh0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=drJA3TiK+PeoZ2nu79QhphTfcNqJcaVpJ8OrZAJ/WiBLBgSuNTzJICprZt5FC4O9S 3h2HjqlXf6uHYTGH6HKtyVkmlM9tNpsnzlHgJ8SgIXhPRwO8Mxflc7CI7u/LnJl1jN o3Y/oZKScReVzOIjwXvsQpQsUhs+NzRIePHqBDAniSxzca3Wp2d9hKCB6EFAc6Ena5 9eifILN5EaHhUs5Jl8ljfGagLXkvH/vjQc/WrufaW+JVZZLpI6hJqNBN9v+ubRWI+D f8OFGl0Cv9BKeEGVwh9lipVXptpUW5ZjL2aUnSqMgN5SfwTyhiP7bXRjj2XwzYCTtx 851hK/6GxFGqw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:06 +0100 Subject: [PATCH v2 25/33] mm/vma: make vma_set_range() static, drop insert_vm_struct() decl Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-25-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3631; i=ljs@kernel.org; h=from:subject:message-id; bh=DYBIxKjyIjg2H1S6yqXRCrIrObFnJroA9O36yuI28hY=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg22X7tsrcNZQdubGGY8ZeW1e29V7zlxxOK3+cPbOG WeF5aVsOkpZGMS4GGTFFFmefxHfHyQSNq/zgr8bzBxWJpAhDFycAjCR14YM/9R8K5NV5Y2MWF6c vSte8e2PzcyIgNeTetd93BU5Q92s+h0jw6WMAI+VUk1/mc91c4Z2cZ/wmvv59r+qxuBd6nsvamy S5gAA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 With __install_special_mapping() moved to vma.c, vma_set_range() can be made into a static function there and is now completely isolated from the rest of mm. While we're here, we can also remove the insert_vm_struct() declaration from mm.h - the function is implemented in vma.c and already declared in vma.h, and has no users outside of mm. Also update the VMA userland tests to reflect this change. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- include/linux/mm.h | 1 - mm/internal.h | 9 --------- mm/vma.c | 8 ++++++++ tools/testing/vma/shared.c | 9 --------- tools/testing/vma/shared.h | 5 ----- 5 files changed, 8 insertions(+), 24 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 3d69b597b9b1..762313b47301 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4130,7 +4130,6 @@ void anon_rmap_tree_verify(struct anon_vma_chain *avc= ); =20 /* mmap.c */ extern int __vm_enough_memory(const struct mm_struct *mm, long pages, int = cap_sys_admin); -extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *); extern void exit_mmap(struct mm_struct *); bool mmap_read_lock_maybe_expand(struct mm_struct *mm, struct vm_area_stru= ct *vma, unsigned long addr, bool write); diff --git a/mm/internal.h b/mm/internal.h index 01a762bcc2b2..2c650d280e90 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1540,15 +1540,6 @@ extern bool mirrored_kernelcore; bool memblock_has_mirror(void); void memblock_free_all(void); =20 -static __always_inline void vma_set_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end, - pgoff_t pgoff) -{ - vma->vm_start =3D start; - vma->vm_end =3D end; - vma->vm_pgoff =3D pgoff; -} - static inline bool vma_soft_dirty_enabled(struct vm_area_struct *vma) { /* diff --git a/mm/vma.c b/mm/vma.c index 5308aa5a8c91..cc0e449ad0be 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -70,6 +70,14 @@ struct mmap_state { .state =3D VMA_MERGE_START, \ } =20 +static void vma_set_range(struct vm_area_struct *vma, unsigned long start, + unsigned long end, pgoff_t pgoff) +{ + vma->vm_start =3D start; + vma->vm_end =3D end; + vma->vm_pgoff =3D pgoff; +} + /* Was this VMA ever forked from a parent, i.e. maybe contains CoW mapping= s? */ static bool vma_is_fork_child(struct vm_area_struct *vma) { diff --git a/tools/testing/vma/shared.c b/tools/testing/vma/shared.c index 2565a5aecb80..bea9ea6db02a 100644 --- a/tools/testing/vma/shared.c +++ b/tools/testing/vma/shared.c @@ -120,12 +120,3 @@ unsigned long rlimit(unsigned int limit) { return (unsigned long)-1; } - -void vma_set_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end, - pgoff_t pgoff) -{ - vma->vm_start =3D start; - vma->vm_end =3D end; - vma->vm_pgoff =3D pgoff; -} diff --git a/tools/testing/vma/shared.h b/tools/testing/vma/shared.h index 8b9e3b11c3cb..ca4f1238f1c7 100644 --- a/tools/testing/vma/shared.h +++ b/tools/testing/vma/shared.h @@ -125,8 +125,3 @@ void __vma_set_dummy_anon_vma(struct vm_area_struct *vm= a, /* Provide a simple dummy VMA/anon_vma dummy setup for testing. */ void vma_set_dummy_anon_vma(struct vm_area_struct *vma, struct anon_vma_chain *avc); - -/* Helper function to specify a VMA's range. */ -void vma_set_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end, - pgoff_t pgoff); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A13E39FCCC; Fri, 10 Jul 2026 20:27:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715255; cv=none; b=rBQCAQ7q3IrcR5X2d4t3IRgn6mluKo2WkGfYz8/15plyT7yDDEK4izOR9dHFKUcFjJDVT8FwyJH+e9TEIaGRpi+HCNjIrKtBovnFiy2PTvUU5g83EFhZkbb6pxrUXIA1LIH9KV/gNz4L1LZJmKBrMjU1zUNZghTpaQEzW2A9k1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715255; c=relaxed/simple; bh=0LxPiqBxAD9IhreoUXWjHFUoHlm6qZINpaBU8bU6qMA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X7+IPacAPY3Afs81nmiFdEKViUW2dBpXUwkdRQANrSW30YB8oqYnEARVuVP/Aql6akPGKkzX9ROPKwU1Ej7ZAhTaI6FZlqCIyC+vchhOZV27o3wme2x6prCxlmggSfB8G7zkk4Ewfvon+njpGdtvEepQrbVy8Uv2tO8rc43H7U0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JBGjC0JG; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JBGjC0JG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 534F11F000E9; Fri, 10 Jul 2026 20:27:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715254; bh=nwHLf7niWPUb+EByGfZPa1IGezWCh6hKiz5/kPjeOK4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=JBGjC0JG6taRh6W76fZOLNsjNinAKtLEZdyZf56hkpmD1SsPyspbJgP79fA97RNFu rInXrcVoyDKxluHVIscUJlMQmCqhyn5vwU71G1ydzkj06R3KS8xqkqBGEHAwFFX5/0 oLU/CAkX/h1Gzz1GS/ZeKTBmtJF2fpl8ljFKwZRglGHj0rtfQ8ndwlo5G5KRsMycDE nxh7CmmMG6beLYOuSIkOMMaLZ1yeaXbdG7b7alCjP4UkqQg8wtUK6yOWoFCJZKQTpC o0a+qybijiTRUl268p65PJiHOM6drgF6XspLNQuwd7bBhft3/7HTnnjHqcGpREBH1/ t6TG2qcQpKTOw== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:07 +0100 Subject: [PATCH v2 26/33] mm/vma: update vma_shrink() to not pass start, pgoff parameters Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-26-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4413; i=ljs@kernel.org; h=from:subject:message-id; bh=0LxPiqBxAD9IhreoUXWjHFUoHlm6qZINpaBU8bU6qMA=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg23LjgYW8Qj8SmXmjwgOjpPi2iF7zC5wcn+95fs7l iaOVf86SlkYxLgYZMUUWZ5/Ed8fJBI2r/OCvxvMHFYmkCEMXJwCMBFxP0aGV36b2hPsZB4I79HY so+HedmSLrH9my+69IdZeCZd5ouYx8iwVvT+y+n/804y/Dn3tjAuJ/T0sU1CtjziL09p1mW378z nAAA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 vma_shrink() is only used by relocate_vma_down() to shrink the tail of a VMA. Therefore neither the start nor the pgoff parameters make any sense. It seemed we were passing the pgoff parameter solely to satisfy vma_set_range()'s requirement for pgoff being specified. Since vma_set_range() is now isolated to vma.c, we can simply introduce __vma_set_range() which sets only vma->vm_[start, end], and invoke this instead, removing start and pgoff from vma_shrink() altogether. No functional change intended. Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 31 +++++++++++++++++-------------- mm/vma.h | 3 +-- mm/vma_exec.c | 2 +- tools/testing/vma/tests/merge.c | 2 +- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index cc0e449ad0be..a474920a25b3 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -70,11 +70,17 @@ struct mmap_state { .state =3D VMA_MERGE_START, \ } =20 -static void vma_set_range(struct vm_area_struct *vma, unsigned long start, - unsigned long end, pgoff_t pgoff) +static void __vma_set_range(struct vm_area_struct *vma, unsigned long star= t, + unsigned long end) { vma->vm_start =3D start; vma->vm_end =3D end; +} + +static void vma_set_range(struct vm_area_struct *vma, unsigned long start, + unsigned long end, pgoff_t pgoff) +{ + __vma_set_range(vma, start, end); vma->vm_pgoff =3D pgoff; } =20 @@ -1279,27 +1285,24 @@ int vma_expand(struct vma_merge_struct *vmg) return -ENOMEM; } =20 -/* - * vma_shrink() - Reduce an existing VMAs memory area +/** + * vma_shrink() - Shrink the end of a VMA * @vmi: The vma iterator * @vma: The VMA to modify - * @start: The new start * @end: The new end * + * Note that the caller may only shrink the end of the VMA. + * * Returns: 0 on success, -ENOMEM otherwise */ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma, - unsigned long start, unsigned long end, pgoff_t pgoff) + unsigned long end) { struct vma_prepare vp; =20 - WARN_ON((vma->vm_start !=3D start) && (vma->vm_end !=3D end)); - - if (vma->vm_start < start) - vma_iter_config(vmi, vma->vm_start, start); - else - vma_iter_config(vmi, end, vma->vm_end); + VM_WARN_ON_ONCE(end > vma->vm_end); =20 + vma_iter_config(vmi, end, vma->vm_end); if (vma_iter_prealloc(vmi, NULL)) return -ENOMEM; =20 @@ -1307,10 +1310,10 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_= area_struct *vma, =20 init_vma_prep(&vp, vma); vma_prepare(&vp); - vma_adjust_trans_huge(vma, start, end, NULL); + vma_adjust_trans_huge(vma, vma->vm_start, end, NULL); =20 vma_iter_clear(vmi); - vma_set_range(vma, start, end, pgoff); + __vma_set_range(vma, vma->vm_start, end); vma_complete(&vp, vmi, vma->vm_mm); validate_mm(vma->vm_mm); return 0; diff --git a/mm/vma.h b/mm/vma.h index 14f026bf3be4..40effaa3ebe4 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -297,8 +297,7 @@ void validate_mm(struct mm_struct *mm); =20 __must_check int vma_expand(struct vma_merge_struct *vmg); __must_check int vma_shrink(struct vma_iterator *vmi, - struct vm_area_struct *vma, - unsigned long start, unsigned long end, pgoff_t pgoff); + struct vm_area_struct *vma, unsigned long end); =20 static inline int vma_iter_store_gfp(struct vma_iterator *vmi, struct vm_area_struct *vma, gfp_t gfp) diff --git a/mm/vma_exec.c b/mm/vma_exec.c index e3644a3042e2..13a05e041195 100644 --- a/mm/vma_exec.c +++ b/mm/vma_exec.c @@ -89,7 +89,7 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigne= d long shift) =20 vma_prev(&vmi); /* Shrink the vma to just the new range */ - return vma_shrink(&vmi, vma, new_start, new_end, vma_start_pgoff(vma)); + return vma_shrink(&vmi, vma, new_end); } =20 /* diff --git a/tools/testing/vma/tests/merge.c b/tools/testing/vma/tests/merg= e.c index f8666a755749..e357accc8499 100644 --- a/tools/testing/vma/tests/merge.c +++ b/tools/testing/vma/tests/merge.c @@ -227,7 +227,7 @@ static bool test_simple_shrink(void) =20 ASSERT_FALSE(attach_vma(&mm, vma)); =20 - ASSERT_FALSE(vma_shrink(&vmi, vma, 0, 0x1000, 0)); + ASSERT_FALSE(vma_shrink(&vmi, vma, 0x1000)); =20 ASSERT_EQ(vma->vm_start, 0); ASSERT_EQ(vma->vm_end, 0x1000); --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D5303A2E0A; Fri, 10 Jul 2026 20:27:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715278; cv=none; b=QwSR4H7Z+Emr46h0VewcsuiGBP7Sog8pt/wHQl9Gn2cwRmYT2yPRC7k/vPexsdBPIhdxOuy5EmD2iyPH3D4IQXWUegl7ZMA8ELROJclB4fRcE8+1l/tV5+PV8GZDnTyH3MKd8JbLp8ZLStu1SElsq6S20+setfhLOVlG50sd5ZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715278; c=relaxed/simple; bh=ot5zow28e72938cIXA7tWk6DLYEYYQs28nPPrOSDw0c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K2O3d/UHOwdAkA/Hxgdt7eoP731AAiV3n1Wx5LoC+iLhEF/q9J+8jOxbxrECgvE4A5XBNl9kuyVT7nhDPC5qCZMMka56Q0coMvpcv1uSFLZGbwCwxTpfAkf4INiYmWbvPcLWb+RCmRZelyj1MmuZbi5zpKSX22A7KPJGa4NpX3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EGt3vnHS; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EGt3vnHS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9973B1F00A3A; Fri, 10 Jul 2026 20:27:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715277; bh=T5LRkx2oSsXHgqG+QA5RqRp0DDiyW95JFEnIgiYl+Iw=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=EGt3vnHS2l489cc2SwVMiTWcS7m0rdltlhOLjOvy3rgfXckeCDhdA5ceUssdznsRc nkxPkRycoucmHp9zHNlY/hOHocAN5KVW/9ngUkSiYI0yFBzSuOoPJUTD/OqjLVkxUv VYPH32pC3qkMkVN1wCmJChPEY3pTRPJBeMMvsUNAFVF9pqAnfyag/WVxSKIBv5REV3 eq8D4+m0P1N1K7inlnc45k1cHMBe8ipJUAH3qdar+GAecqDRO/s2lUwQYhPY7AFMJP QD+aAVoLxwZ2LtSjZZWPD47ZHq4s1HQjihgJFOaxB69qwAnxvd+GdDtUydhpOgvpnr O9dUkjiE5k81g== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:08 +0100 Subject: [PATCH v2 27/33] mm/vma: update vmg_adjust_set_range() to offset pgoff instead Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-27-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2193; i=ljs@kernel.org; h=from:subject:message-id; bh=ot5zow28e72938cIXA7tWk6DLYEYYQs28nPPrOSDw0c=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg2235r5P1it+4X64xHSKz7r/+t33IllWPnraGvLOS +F/zbT5HaUsDGJcDLJiiizPv4jvDxIJm9d5wd8NZg4rE8gQBi5OAZgI71mGf3b7Nn5z2M0ss+yh woLVdi4s6VfP2xjdzNbznP1/+lbfO+cZ/mkVRX9h2vKdIdje21780vk5PB8VfTpzT73ztZs7o0i SlQEA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 We are calculating the pgoff as an offset, since we have vma_add_pgoff() and vma_sub_pgoff() available, just offset this value directly and use __vma_set_range() for vma->vm_[start, end] values. We take care to update the range before offsetting the page offset, so the adjusted VMA's vm_start and vm_pgoff are mutually consistent at the point the page offset helpers operate - this matters once vma_set_pgoff() comes to assert invariants which relate the two. Doing so lays the foundation for future work which allows for use of virtual page offsets for MAP_PRIVATE-file backed mappings. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index a474920a25b3..0699fa07c40f 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -714,9 +714,6 @@ void validate_mm(struct mm_struct *mm) */ static void vmg_adjust_set_range(struct vma_merge_struct *vmg) { - struct vm_area_struct *adjust; - pgoff_t pgoff; - if (vmg->__adjust_middle_start) { /* * vmg->start vmg->end @@ -735,8 +732,8 @@ static void vmg_adjust_set_range(struct vma_merge_struc= t *vmg) struct vm_area_struct *middle =3D vmg->middle; const unsigned long delta =3D vmg->end - middle->vm_start; =20 - pgoff =3D vma_start_pgoff(middle) + (delta >> PAGE_SHIFT); - adjust =3D middle; + __vma_set_range(middle, vmg->end, middle->vm_end); + vma_add_pgoff(middle, delta >> PAGE_SHIFT); } else if (vmg->__adjust_next_start) { /* * Originally: @@ -764,13 +761,9 @@ static void vmg_adjust_set_range(struct vma_merge_stru= ct *vmg) struct vm_area_struct *next =3D vmg->next; const unsigned long delta =3D next->vm_start - vmg->end; =20 - pgoff =3D vma_start_pgoff(next) - (delta >> PAGE_SHIFT); - adjust =3D next; - } else { - return; + __vma_set_range(next, vmg->end, next->vm_end); + vma_sub_pgoff(next, delta >> PAGE_SHIFT); } - - vma_set_range(adjust, vmg->end, adjust->vm_end, pgoff); } =20 /* --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31F8E3A1681; Fri, 10 Jul 2026 20:28:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715302; cv=none; b=dVrb/Vbc2v11CS3+DajFTd+3aWd8IqWh6xwP1NdbqokTfZMHRHPpQo+77uM5OSXLpvJlGIv3RzdrmkBMmx4iONLufNI1Rd87+EGMPSJF6LIJsLjSweyxsvPjlqiKMR83q/4bXOwg5T78teV6NbgJNZ2vhK8DMy7f+Oqv+gsO6cA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715302; c=relaxed/simple; bh=dboRvXWKwjAOOnw4xnLssxAAAPh9/O2DaTnoVWEou2M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IIMQr6s1b16SCSvAeIJLKCFAe1m1G381iLr959Uq5xFXaGeTyiWRrJJSmNLhVakEqIw2W9omcHvZMYOcEQYw70IUiUiGKen8o2CO8n3PstEVBuHV0MfxnRPkjMTMo/M0gl7ukG1tCayHMbSaZ0pGMnf8BZBHF3QplZtLQpxz0hU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nbOVHA9/; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nbOVHA9/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B21181F000E9; Fri, 10 Jul 2026 20:27:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715300; bh=LdCumzx1xelSik0fyWFl/+tFd+Vg+MajMGDgbY3wuuY=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=nbOVHA9/IqtgT9yYIxrcLftZNz5+z7/zCP+yCH+QUdbK0dnpIUFHQtvr6ma+nj8P6 ysVgzYiymU0jAt1iQ2W00psBUmJek987sS5VflSd0j/3ZCVQ6W3fDGzRjBDcoegU9m Yc//0A8XW0dKzd4Ep7xQmDINJJtYg/4KxvbspQnH/3XnBxrKYPJEO75EB8xqd4xStI zitF7luU1QunXTFvRCu1WXI6Wi+WMpsOlEgS8ncYsxP8WPLsMELJsBKhb8kG8Wx/H+ n118w20skvYfrzD8uuAYvlsRmSAqaDrR7fXYTwGnovS7jaGsP+r78VuXjaDhZ146qG bYYeE+ael9tjg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:09 +0100 Subject: [PATCH v2 28/33] mm/vma: slightly rework the anonymous check in __mmap_new_vma() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-28-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1719; i=ljs@kernel.org; h=from:subject:message-id; bh=dboRvXWKwjAOOnw4xnLssxAAAPh9/O2DaTnoVWEou2M=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg22NmVgnP3fVulG58u0872fre+WmGyROehN8o/9Ts T6jYolMRykLgxgXg6yYIsvzL+L7g0TC5nVe8HeDmcPKBDKEgYtTACayUJOR4YuYxPGH229qFD4V j7uXvmN75fkHHwzWrvrlHzjba53T6bUM/70izzw9c8CzdMUxr9Li9gQOreMH7ZjOPqyPkttb0te hxgkA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Determine if the VMA is anonymous early on, so we separate the logic which invokes callbacks from the rest of the logic. This is in order that a subsequent commit which asserts correct virtual page offset for anonymous mappings correctly asserts this for new anonymous mappings. No functional change intended. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 0699fa07c40f..ec64e179d2f9 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -2587,6 +2587,8 @@ static int __mmap_new_file_vma(struct mmap_state *map, static int __mmap_new_vma(struct mmap_state *map, struct vm_area_struct **= vmap, struct mmap_action *action) { + const bool is_anon =3D !map->file && + !vma_flags_test(&map->vma_flags, VMA_SHARED_BIT); struct vma_iterator *vmi =3D map->vmi; int error =3D 0; struct vm_area_struct *vma; @@ -2601,6 +2603,10 @@ static int __mmap_new_vma(struct mmap_state *map, st= ruct vm_area_struct **vmap, return -ENOMEM; =20 vma_iter_config(vmi, map->addr, map->end); + + if (is_anon) + vma_set_anonymous(vma); + vma_set_range(vma, map->addr, map->end, map->pgoff); vma->flags =3D map->vma_flags; vma->vm_page_prot =3D map->page_prot; @@ -2610,12 +2616,11 @@ static int __mmap_new_vma(struct mmap_state *map, s= truct vm_area_struct **vmap, goto free_vma; } =20 + /* Invoke callbacks. */ if (map->file) error =3D __mmap_new_file_vma(map, vma); - else if (vma_flags_test(&map->vma_flags, VMA_SHARED_BIT)) + else if (!is_anon) error =3D shmem_zero_setup(vma); - else - vma_set_anonymous(vma); =20 if (error) goto free_iter_vma; --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C07039BFF1; Fri, 10 Jul 2026 20:28:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715325; cv=none; b=gems00VxMrL+Cq33B6LHPGoTCZnLwHTsLpcwt1dQ1e0jdbVj7XfPByTsJFRDdfVt6frtz7j9Ct/7HhCkDCZbbk0bJ2mUt4wVkbplA5sTuBqOE3kgfxnruUY0eC5JDfzN13VyjZDSXLmdY0I0bFbXSccEA3GUY0u3a1hhhm0JVn8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715325; c=relaxed/simple; bh=lsNQUYSqY8ftQ/S4LD1hHSt9yR5KwVcyJgXwScgbugs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MfwerTzhPNW3suNLU3c5NsKBOdpZ0ft/WIDx7j+vyeHpxAxZYRpq4O1E1DPzEIP2ma18QZrju9UYeAw5yyYEZ2IRNURr/HOi5W6w2JNXRFkHr6nzYUCIAjBibDuI5K5NIeMySwXQTnWRFARc6VX1MrD4TYAOSGntc0zTh9H2IYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UJnlrTyq; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UJnlrTyq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DCC91F00A3A; Fri, 10 Jul 2026 20:28:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715323; bh=2+OkEViyUBUTI9uYLEX4a4/L0I2mHL2JL8LovbGGiMs=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=UJnlrTyqmIX76dhyuIJH+ZWeuwY2uSvegVNMHFmEwJS5ocaNZYISJS5JyWmBkSzbH UKl7cX8yUe6IAwGKYMBvQ1AtAheCCYRuKTz3ZwBjHtWknVjpRaA2L1umW1nd+gocfN uYSLyXTLS9g/m49T3bKQBwJ6bVtk02YqDXiOTC3Z0Ae1w7haCafZThtvQIsOsq/xD2 TyOEZJuaBvJm3nFlQnmL5EMx7WPZf7duGBLnLNoh4wgb9e/im1OGNIk33fMzJZFzeH 8IMw/hMYKsEbQCSkfHU9sEt4oreIes1GlIljfxrfCHA321k3WfSaKpA6UXcsWBD0jS PXToqOuC7BRlA== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:10 +0100 Subject: [PATCH v2 29/33] mm/vma: introduce and use vma_set_pgoff() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-29-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6848; i=ljs@kernel.org; h=from:subject:message-id; bh=lsNQUYSqY8ftQ/S4LD1hHSt9yR5KwVcyJgXwScgbugs=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg21rKw7tulL8I+ZRxy4Dt53VciHnrd73X9PobOva3 V6pJ2fbUcrCIMbFICumyPL8i/j+IJGweZ0X/N1g5rAygQxh4OIUgIlYvGX4Xz5p+j7GExfu3Dws dUiu/h7j+1myno/eP78s28f/8YCc51SG/4VH5p2X8H/x3WJ6GqdZs/vz0HfMsw8mG4jETHd4vdf pKRsA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 In order to lay the foundation for work that permits us to track the virtual page offset of MAP_PRIVATE file-backed mappings, we abstract the assignment of vma->vm_pgoff to vma_set_pgoff(). We additionally add a lock check here using the newly introduced vma_assert_can_modify(). This asserts the VMA write lock if the VMA is attached. We also assert that, if this is an anonymous VMA and unfaulted, that its (virtual) page offset is equal to the page offset of the VMA's address. We must be careful about MAP_PRIVATE-/dev/zero which violates fundamental assumptions about anonymous memory, so we check for !vma->vm_file after using vma_is_anonymous() which these mappings satisfy. Additionally, we only perform the assert if CONFIG_MMU is defined, as nommu does not set vma->vm_pgoff =3D addr >> PAGE_SHIFT. This isn't really releva= nt to rmap as it has no anon rmap (nor needs it), but we must avoid it asserting falsely. All of this logic is kept in assert_sane_pgoff() to keep things clear. In order to maintain correctness given this assert, we also update __install_special_mapping() to invoke vma_set_range() after it's set vma->vm_ops (which determine whether the VMA is anonymous or not). We do not use vma_set_pgoff() in vm_area_init_from(), as at the point of forking, we don't necessarily have correct locking state. Updating vma_set_range() covers most cases, but in addition to this we also update insert_vm_struct(), compat_set_vma_from_desc() and nommu callers. We also update vma_add_pgoff() and vma_sub_pgoff() to use vma_set_pgoff(). While we're here, we drop a BUG_ON() and update insert_vm_struct()'s comment to reflect the fact anonymous mappings can be added here. Finally, we update the CONFIG_MMU, CONFIG_PER_VMA_LOCK defines in the VMA userland tests so IS_ENABLED() will work correctly with them. No functional change intended. Reviewed-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price Reviewed-by: Vlastimil Babka (SUSE) --- mm/nommu.c | 2 +- mm/vma.c | 14 +++++++------- mm/vma.h | 35 ++++++++++++++++++++++++++++++++--- tools/testing/vma/vma_internal.h | 4 ++-- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/mm/nommu.c b/mm/nommu.c index 2a0136f6081d..21cbe8b093fc 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1062,7 +1062,7 @@ unsigned long do_mmap(struct file *file, region->vm_pgoff =3D pgoff; =20 vm_flags_init(vma, vm_flags); - vma->vm_pgoff =3D pgoff; + vma_set_pgoff(vma, pgoff); =20 if (file) { region->vm_file =3D get_file(file); diff --git a/mm/vma.c b/mm/vma.c index ec64e179d2f9..7c75dd78edef 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -81,7 +81,7 @@ static void vma_set_range(struct vm_area_struct *vma, uns= igned long start, unsigned long end, pgoff_t pgoff) { __vma_set_range(vma, start, end); - vma->vm_pgoff =3D pgoff; + vma_set_pgoff(vma, pgoff); } =20 /* Was this VMA ever forked from a parent, i.e. maybe contains CoW mapping= s? */ @@ -3347,9 +3347,9 @@ int __vm_munmap(unsigned long start, size_t len, bool= unlock) return ret; } =20 -/* Insert vm structure into process list sorted by address - * and into the inode's i_mmap tree. If vm_file is non-NULL - * then i_mmap_rwsem is taken here. +/* + * Insert vm structure into process list sorted by address + * and into the inode's i_mmap tree if file-backed. */ int insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma) { @@ -3375,8 +3375,8 @@ int insert_vm_struct(struct mm_struct *mm, struct vm_= area_struct *vma) * Similarly in do_mmap and in do_brk_flags. */ if (vma_is_anonymous(vma)) { - BUG_ON(vma->anon_vma); - vma->vm_pgoff =3D vma->vm_start >> PAGE_SHIFT; + WARN_ON_ONCE(vma->anon_vma); + vma_set_pgoff(vma, vma->vm_start >> PAGE_SHIFT); } =20 if (vma_link(mm, vma)) { @@ -3422,7 +3422,6 @@ struct vm_area_struct *__install_special_mapping( if (unlikely(vma =3D=3D NULL)) return ERR_PTR(-ENOMEM); =20 - vma_set_range(vma, addr, addr + len, 0); vm_flags |=3D mm->def_flags | VM_DONTEXPAND; if (pgtable_supports_soft_dirty()) vm_flags |=3D VM_SOFTDIRTY; @@ -3431,6 +3430,7 @@ struct vm_area_struct *__install_special_mapping( =20 vma->vm_ops =3D ops; vma->vm_private_data =3D priv; + vma_set_range(vma, addr, addr + len, 0); =20 ret =3D insert_vm_struct(mm, vma); if (ret) diff --git a/mm/vma.h b/mm/vma.h index 40effaa3ebe4..58f48609ce22 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -247,16 +247,45 @@ static inline pgoff_t vmg_end_pgoff(const struct vma_= merge_struct *vmg) return vmg_start_pgoff(vmg) + vmg_pages(vmg); } =20 +static inline void assert_sane_pgoff(struct vm_area_struct *vma, pgoff_t p= goff) +{ + /* nommu doesn't set a virtual pgoff for anon VMAs. */ + if (!IS_ENABLED(CONFIG_MMU)) + return; + /* + * File-backed VMAs have arbitrary page offset (either page offset into + * file or for pfnmap the PFN of the start of the range or drivers may + * set arbitrary page offset). + */ + if (!vma_is_anonymous(vma)) + return; + /* MAP_PRIVATE-/dev/zero is anon, non-NULL vm_file, but has file pgoff. */ + if (vma->vm_file) + return; + /* If faulted in, could have been remapped. */ + if (vma->anon_vma) + return; + /* OK this is really an anon VMA - expect virtual page offset. */ + VM_WARN_ON_ONCE(pgoff !=3D vma->vm_start >> PAGE_SHIFT); +} + +static inline void vma_set_pgoff(struct vm_area_struct *vma, pgoff_t pgoff) +{ + vma_assert_can_modify(vma); + assert_sane_pgoff(vma, pgoff); + vma->vm_pgoff =3D pgoff; +} + static inline void vma_add_pgoff(struct vm_area_struct *vma, pgoff_t delta) { vma_assert_can_modify(vma); - vma->vm_pgoff +=3D delta; + vma_set_pgoff(vma, vma_start_pgoff(vma) + delta); } =20 static inline void vma_sub_pgoff(struct vm_area_struct *vma, pgoff_t delta) { vma_assert_can_modify(vma); - vma->vm_pgoff -=3D delta; + vma_set_pgoff(vma, vma_start_pgoff(vma) - delta); } =20 #define VMG_STATE(name, mm_, vmi_, start_, end_, vma_flags_, pgoff_) \ @@ -331,7 +360,7 @@ static inline void compat_set_vma_from_desc(struct vm_a= rea_struct *vma, */ =20 /* Mutable fields. Populated with initial state. */ - vma->vm_pgoff =3D desc->pgoff; + vma_set_pgoff(vma, desc->pgoff); if (desc->vm_file !=3D vma->vm_file) vma_set_file(vma, desc->vm_file); vma->flags =3D desc->vma_flags; diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_inter= nal.h index e12ab2c80f95..4f6c5666ac07 100644 --- a/tools/testing/vma/vma_internal.h +++ b/tools/testing/vma/vma_internal.h @@ -14,8 +14,8 @@ =20 #include =20 -#define CONFIG_MMU -#define CONFIG_PER_VMA_LOCK +#define CONFIG_MMU 1 +#define CONFIG_PER_VMA_LOCK 1 =20 #ifdef __CONCAT #undef __CONCAT --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56A8239A4C5; Fri, 10 Jul 2026 20:29:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715348; cv=none; b=qX05KKtdkApkRYVo0s7iRMmac+CfPhvKTIAl0eut5Wm08b3XZ21Yd3/8ehtD40UGRC/vQC7pr6KpLInhOiBo8lGmHRqA+/nv0EfnFyoqctSals8Ea6h2pXg0FxUdxlJmN+1ADC0BOe/YvxG/h6j1Tvd/1MJMv4MYLnsbeois1Fo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715348; c=relaxed/simple; bh=shpFTR/kYRzffTsm0zlgjzVGjq2PyyHz+kDqenhzfis=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dOEsNpYAxNaweG/0wBrHwDpUCbup2b7dNUoCByzWqqIAr+QpSd6MnO9IhAcbQDvY3Qy731v+eL/h/NGYxcJKv8s77dSreqESqcNLprJqRlxy1CJHVq26AdZwWvpCYI38N7S3PBmovNIOYxN5HWgtHvNCq/2wrgZqc0qby61t0Os= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HN/nTgeK; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HN/nTgeK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 563BD1F00A3D; Fri, 10 Jul 2026 20:28:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715347; bh=1ql8pfD2dLkZ3j2ZLRgwxtlbsXGEbzU77QdgKu6+RW0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=HN/nTgeKq3AnMjIs0u7JOFWgL8V6dcLlJmk9ikJ8fDUbMBlZLUk6KpsqhTpY6f4Rk cqc+QtS61rJvVT+Ieot26FX4QBYJX2NWdolyKNWZN+OpJv8b6VLbVV1oQSiHVnosL+ el9kwv9KVuOaHbau8QAS8wvLAfNTYvAb4ZJWcc07ARv1rGWx3AiJuSs2p6HMNHxhrr yNxDfm62mwI2vkLsGoWHpLP8BEUXJ7q8pRDCBdgChs4OndWDlfPdmsS0BndIlw9ftX kdZHMOwRHnn1aHsvYqf0OdH7AS7sYRrsyWJy4u0ytikVJxADHfDwEbDXZMERb/f5Qq 9Tw8VKMmYGVQg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:11 +0100 Subject: [PATCH v2 30/33] mm/vma: correct incorrect vma.h inclusion Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-30-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4536; i=ljs@kernel.org; h=from:subject:message-id; bh=shpFTR/kYRzffTsm0zlgjzVGjq2PyyHz+kDqenhzfis=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg201dv0WDPnXKfD02fVrd2xmnJGosao9+KtYLrPMT ee3uOTFjlIWBjEuBlkxRZbnX8T3B4mEzeu84O8GM4eVCWQIAxenAExk6htGhutMvdsKbROmGXpe 9bRozf2k9WX9ovWH62umFivq6Py9+pCRoftC5fGIB3Fbpepc7q+dFC6dVurt13dkg9IG04qXXkn b+AA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 The only files which should be including vma.h are the implementation files for the core VMA logic - vma.c, vma_init.c, and vma_exec.c. This is in order to allow for userland testing of core VMA logic. In this cases, vma_internal.h and vma.h are included, providing both the dependencies upon which the core VMA logic requires and its declarations. Userland testable VMA logic is achieved by having separate vma_internal.h implementations for userland and kernel. Callers other than the core VMA implementation should include internal.h instead. This header does not need to include vma_internal.h as it only contains the vma.h declarations, for which the includes already present suffice. Update code to reflect this, update comments to reflect the fact there are 3 VMA implementation files and document things more clearly. While we're here, slightly improve the language of the comment describing vma_exec.c. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/mmu_notifier.c | 2 +- mm/nommu.c | 1 - mm/vma.c | 4 ++++ mm/vma.h | 9 ++++++++- mm/vma_exec.c | 8 ++++++-- mm/vma_init.c | 4 ++++ mm/vma_internal.h | 4 ++-- 7 files changed, 25 insertions(+), 7 deletions(-) diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c index 245b74f39f91..df69ba6e797f 100644 --- a/mm/mmu_notifier.c +++ b/mm/mmu_notifier.c @@ -19,7 +19,7 @@ #include #include =20 -#include "vma.h" +#include "internal.h" =20 /* global SRCU for all MMs */ DEFINE_STATIC_SRCU(srcu); diff --git a/mm/nommu.c b/mm/nommu.c index 21cbe8b093fc..adc0b0ca906b 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -41,7 +41,6 @@ #include #include #include "internal.h" -#include "vma.h" =20 unsigned long highest_memmap_pfn; int heap_stack_gap =3D 0; diff --git a/mm/vma.c b/mm/vma.c index 7c75dd78edef..737f0d692e6b 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -4,6 +4,10 @@ * VMA-specific functions. */ =20 +/* + * To allow for userland testing we place internal dependencies in + * vma_internal.h and external VMA API declarations in vma.h. + */ #include "vma_internal.h" #include "vma.h" =20 diff --git a/mm/vma.h b/mm/vma.h index 58f48609ce22..adb7a0ba1192 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -2,7 +2,14 @@ /* * vma.h * - * Core VMA manipulation API implemented in vma.c. + * Core VMA manipulation API implemented in vma.c, vma_init.c and vma_exec= .c. + * + * Note that, in order for VMA logic to be userland testable, this header + * intentionally includes no dependencies. + * + * This is specifically scoped to mm-only. Users of this functionality (ot= her + * than the core VMA implementation itself) should not include this header + * directly, but rather include internal.h. */ #ifndef __MM_VMA_H #define __MM_VMA_H diff --git a/mm/vma_exec.c b/mm/vma_exec.c index 13a05e041195..ef1fa2b161f3 100644 --- a/mm/vma_exec.c +++ b/mm/vma_exec.c @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-2.0-only =20 /* - * Functions explicitly implemented for exec functionality which however a= re - * explicitly VMA-only logic. + * Functions provided for exec functionality which however are + * specifically VMA-only logic. */ =20 +/* + * To allow for userland testing we place internal dependencies in + * vma_internal.h and external VMA API declarations in vma.h. + */ #include "vma_internal.h" #include "vma.h" =20 diff --git a/mm/vma_init.c b/mm/vma_init.c index a459669a1654..715feee283f0 100644 --- a/mm/vma_init.c +++ b/mm/vma_init.c @@ -5,6 +5,10 @@ * between CONFIG_MMU and non-CONFIG_MMU kernel configurations. */ =20 +/* + * To allow for userland testing we place internal dependencies in + * vma_internal.h and external VMA API declarations in vma.h. + */ #include "vma_internal.h" #include "vma.h" =20 diff --git a/mm/vma_internal.h b/mm/vma_internal.h index 2da6d224c1a8..4d300e7bbaf4 100644 --- a/mm/vma_internal.h +++ b/mm/vma_internal.h @@ -2,8 +2,8 @@ /* * vma_internal.h * - * Headers required by vma.c, which can be substituted accordingly when te= sting - * VMA functionality. + * Headers required by vma.c, vma_init.c and vma_exec.c, which can be + * substituted accordingly when testing VMA functionality. */ =20 #ifndef __MM_VMA_INTERNAL_H --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE8EB375F8B; Fri, 10 Jul 2026 20:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715371; cv=none; b=K9Fc2UBTJb0wYYKRRHqgPS9RRY7OGH42gCaJGyf0rROoeNthWSpuH/6o2DZ0SrB6hGSuBt8+O3cBYtj62URPZTnwe9YRfGErlFNKRXI3+NFSMXY75tRw+6FbilQSnVRxYTsMWPvKQIh0SER6vKYXgzaZUTevXcHmJeLE61KRhq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715371; c=relaxed/simple; bh=FCbfUVh/U5U1bRHGVKwt5UwXPlTKD0aFqMH/5ltaMTc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r0gnb1Zg3ihpN/ae7PazbbBXbc5XNwgZPpO+703P0oljG5C8AaRDibFUDrUdjp0hVA1mVmPHgvz9eAh9e3AQgubw7JO9GI6MvsdT6eIfj3/ffNSObXMEYGqg0MHvQzGKu46ZeQJVwda04hpBrzToQveqiHbnIRxhWaDu8atSykg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RPSZGvZw; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RPSZGvZw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A991E1F000E9; Fri, 10 Jul 2026 20:29:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715370; bh=aHI3HtWrClTz694ElWYDKnmNafJcRIPtS6NobkrqaKw=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=RPSZGvZwyFoF6ClRKN9BpyNR8hpTZDK48TFpXqSipi37enIb5dUT+EctMObMcHEeV Poej32H984Cm5vZ1zE7duVLeHD7YFi8mfbo6mFJ4FJOXEPXEGfFbv3VcFF00WQ1jLn ci5P3XH7w6VvBnhFwpIJkr1BIv5hune/exyRWAf4inZWPzWlVWUvSq6OdsuSNl2puz vb5dtyH1nVV9TGprKRirNigppE+kAcMcj9yNM+9vchbstpVeQeFueRmccReV6x/9MS /rOKm4zBsOKdlYcPeiG1SaWJiU5ywO100RbwZxu+N6fqHKIukkw5XKszp/AF+Cr13o 8grz4e0FS40fg== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:12 +0100 Subject: [PATCH v2 31/33] mm/vma: use guard clauses in can_vma_merge_[before, after]() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-31-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2052; i=ljs@kernel.org; h=from:subject:message-id; bh=FCbfUVh/U5U1bRHGVKwt5UwXPlTKD0aFqMH/5ltaMTc=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg23zeIx4g070KS4J7SnPZellbdxntl3j/lv3O2c9w v49kCntKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwERufGT4Z6zbfDP29beUVLPf /n92Zv2YtttYd9U3pvkvz+nZFXIKCTMyrBHkfC6/9G9fO9ff/UuWhPwoNS5edYn3QQfz2ZTDa99 vYwQA X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Rather than combining a bunch of conditionals in a single expression, simplify by inverting the mergeability requirements into guard clauses. that is - instead of checking what must be true for the conditions to be met, instead check the inverse of the requirements and return false if any are true, defaulting to true. No functional change intended. Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Vlastimil Babka (SUSE) --- mm/vma.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 737f0d692e6b..9d556d33b24b 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -215,13 +215,13 @@ static void init_multi_vma_prep(struct vma_prepare *v= p, */ static bool can_vma_merge_before(struct vma_merge_struct *vmg) { - if (is_mergeable_vma(vmg, /* merge_next =3D */ true) && - is_mergeable_anon_vma(vmg, /* merge_next =3D */ true)) { - if (vmg_end_pgoff(vmg) =3D=3D vma_start_pgoff(vmg->next)) - return true; - } - - return false; + if (!is_mergeable_vma(vmg, /* merge_next =3D */ true)) + return false; + if (!is_mergeable_anon_vma(vmg, /* merge_next =3D */ true)) + return false; + if (vmg_end_pgoff(vmg) !=3D vma_start_pgoff(vmg->next)) + return false; + return true; } =20 /* @@ -235,12 +235,13 @@ static bool can_vma_merge_before(struct vma_merge_str= uct *vmg) */ static bool can_vma_merge_after(struct vma_merge_struct *vmg) { - if (is_mergeable_vma(vmg, /* merge_next =3D */ false) && - is_mergeable_anon_vma(vmg, /* merge_next =3D */ false)) { - if (vma_end_pgoff(vmg->prev) =3D=3D vmg_start_pgoff(vmg)) - return true; - } - return false; + if (!is_mergeable_vma(vmg, /* merge_next =3D */ false)) + return false; + if (!is_mergeable_anon_vma(vmg, /* merge_next =3D */ false)) + return false; + if (vma_end_pgoff(vmg->prev) !=3D vmg_start_pgoff(vmg)) + return false; + return true; } =20 static void __vma_link_file(struct vm_area_struct *vma, --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC5233A5421; Fri, 10 Jul 2026 20:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715395; cv=none; b=JMCzHc0VywFNMNBiWPjRZEI8+Jnr+k6BkSU/T5ZZ+0q7Yj93EZ8pEFuYFPsn6QMDLtWk0KZP2h9+McdcJaW9pk/4cpS03nE9m1KfzZRCY+ucfsmXMxBk/5YlH3Wsf2+5CjYmSgR3p8t2QKFPwsUSZn0D0thY2FlHBP3OCaza47w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715395; c=relaxed/simple; bh=BSllJJ+2rRUlWzlXkjh5aitKXn0vM/W5l9yfCPbZwkk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WXe40fy7ElBuM1vHUPfrylomYTMU0+i1cM8bYVo5Bb8DQavbh2qILVynofHnCDMNatO5NP9KmrFD1vL9M7cmk3A96kpLi3+apKSEkH/HU6XE9hUh1me038AxKMo5qKrxza+IxeSpgk1KkmtJ1vSWyWVdJKM4f31/J9CGZBClrw4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Rn0Rgzrg; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Rn0Rgzrg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C37601F00A3A; Fri, 10 Jul 2026 20:29:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715393; bh=h9TL51kQxKXHzSfeISmn1qw+QGG9KCcdgBvdsczJlCQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Rn0Rgzrg1X9P5gZsTrshFOS+gMVue/gsuP7CnzM73czznQcn4F9ItkfgBxrFDuH66 94EeIgI5hcr2XIsN3JzPfM7oBQE/vD8l9enMDbVOU8lNTUaYV6fcAL/6vBz7qX6VIq NV817DVIfXpi6wJ/hRvPJWaIpuFGj1/DltiI/mD1dBclCFblMGKiu2Oj5CzNoyCves RnQ7aytJQVF43RBtHHafqZbjIwVNRBtQ8O3PLFYcWa7naE5fgN6Q0oqeQLqBuFn/+5 cBxamOvFBWiDSagHuu6Y8tOkVPWaz0YBClxQVn17b8Kz9ZPR1RYz7NH+4ZEm0mLklt x3Y3guK3Ete2A== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:13 +0100 Subject: [PATCH v2 32/33] tools/testing/vma: default VMA, mm flag bits to 64-bit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-32-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1053; i=ljs@kernel.org; h=from:subject:message-id; bh=BSllJJ+2rRUlWzlXkjh5aitKXn0vM/W5l9yfCPbZwkk=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg23tbadanfaQzj1y4rvlNcVF9qIRv947JUd902jK7 TLzq0/oKGVhEONikBVTZHn+RXx/kEjYvM4L/m4wc1iZQIYwcHEKwERaNBj+qb36GFjppLrx8Iv8 qbKmX233/fKVUtoRUPVgwvsv2l762Qz/dFWP/9kU0fePtSxGdTuTmXbp2f3yftdqG2/ekOSalyL PCAA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 With all of the sanitisers turned on, setting the VMA and mm flag bits depth to 128 by default results in overly long build times. Reduce this to 64 - we can always manipulate these later for testing of larger bitmaps as needed. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price --- tools/testing/vma/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/vma/Makefile b/tools/testing/vma/Makefile index e72b45dedda5..ef6cc558afe1 100644 --- a/tools/testing/vma/Makefile +++ b/tools/testing/vma/Makefile @@ -10,7 +10,7 @@ OFILES =3D $(SHARED_OFILES) main.o shared.o maple-shim.o TARGETS =3D vma =20 # These can be varied to test different sizes. -CFLAGS +=3D -DNUM_VMA_FLAG_BITS=3D128 -DNUM_MM_FLAG_BITS=3D128 +CFLAGS +=3D -DNUM_VMA_FLAG_BITS=3D64 -DNUM_MM_FLAG_BITS=3D64 =20 main.o: main.c shared.c shared.h vma_internal.h tests/merge.c tests/mmap.c= tests/vma.c ../../../mm/vma.c ../../../mm/vma_init.c ../../../mm/vma_exec.= c ../../../mm/vma.h include/custom.h include/dup.h include/stubs.h =20 --=20 2.55.0 From nobody Sun Jul 26 00:21:53 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED21439A4C5; Fri, 10 Jul 2026 20:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715418; cv=none; b=nAPemqXjPlHfJl42iL7wxcMRAGe+KN7MtXuJDdWIfrjnsDtD9yCZ0cj0KqhgW5VVoc6IXu+xGUD+Tdh84hLQvVWw6lGuOSWfdlbGsVvMj9JQ3xjUWw+my9lBOj1Iw+blOQC5qkoGkVTHamDwbiubcc42nybFxejXYsSiRtIeUQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783715418; c=relaxed/simple; bh=G0Z54AjtjNI6CjvRN0QWBiGJMevNN1T++vP+QCfqk78=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yn8az0M3/awDg4Wu9mHjLkVwAC28Hc86cu21FObEk1aXkX4VdFZ5Y7Zk6A8pdrkb2V8EmkxkvFQTtkbv3368pXFtFvc/p4Kg/JT3KiA63b/y550vPNgUU/lq9QqsMc7QoQp+3MWTOM12KO0v/zGDmLJZtn+WUb1AAdK1Qld+3iU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HJU/LxQF; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HJU/LxQF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE5081F000E9; Fri, 10 Jul 2026 20:29:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783715416; bh=B5I9XJhmOOi1LkWbRSVKnYIkRF+jGCGnmzoiak9EY5o=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=HJU/LxQFVzsJlRTCMRzOJHdKDqTBAxtBcBwpt63liPwwYag6kcqfVKglYfllNuHwG zruaDbLFSHOKgoo0BqDuxifQenxMZ32LDVjzeICMBYJ3UJv5j+AnJcMgzxnGHtBdeN j8C36crjgwo2R/uzmYN1HthGyrQ3fCMsmbG+73WdXAXoxUFqceMyzp9ZW1PdmaRa9O G5/VT52++Jk599/Cwob6URDW22K7/Nduaq0RP+KDtJ0pkxdcPa3d89vPvW4V4rHBk/ CW0bBjmWxC4r28Ips94X2CU8upp1gMEWiWKnHmBXHuAIxpE3/rXj+RtTqbCeQkATao rwCQBxnl2483Q== From: Lorenzo Stoakes Date: Fri, 10 Jul 2026 21:17:14 +0100 Subject: [PATCH v2 33/33] tools/testing/vma: output compared expression on ASSERT_[EQ, NE]() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-b4-pre-scalable-cow-v2-33-2a5aa403d977@kernel.org> References: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> In-Reply-To: <20260710-b4-pre-scalable-cow-v2-0-2a5aa403d977@kernel.org> To: Andrew Morton , David Hildenbrand , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn , Lance Yang , Pedro Falcato , Russell King , Dinh Nguyen , Simon Schuster , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Christian Brauner , Jan Kara , Dan Williams , Matthew Wilcox , Muchun Song , Oscar Salvador , Masami Hiramatsu , Oleg Nesterov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Miaohe Lin , Naoya Horiguchi , Xu Xin , Chengming Zhou , SJ Park , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Hugh Dickins , Peter Xu , Kees Cook , Marek Szyprowski , Robin Murphy , Andrey Konovalov , Alexander Potapenko , Dmitry Vyukov , Steven Rostedt , Mathieu Desnoyers , Jarkko Sakkinen , Dave Hansen , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Ian Abbott , H Hartley Sweeten , Lucas Stach , Christian Gmeiner , David Airlie , Simona Vetter , Patrik Jakobsson , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Tomi Valkeinen , Thierry Reding , Mikko Perttunen , Jonathan Hunter , Christian Koenig , Huang Rui , Matthew Auld , Jason Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Ankit Agrawal , Alex Williamson , Paolo Bonzini , Shakeel Butt , Usama Arif Cc: Lorenzo Stoakes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, linux-perf-users@vger.kernel.org, linux-trace-kernel@vger.kernel.org, damon@lists.linux.dev, iommu@lists.linux.dev, kasan-dev@googlegroups.com, linux-sgx@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-tegra@vger.kernel.org, kvm@vger.kernel.org, Russell King X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2588; i=ljs@kernel.org; h=from:subject:message-id; bh=G0Z54AjtjNI6CjvRN0QWBiGJMevNN1T++vP+QCfqk78=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLICg+027xOdH8B2QFVjitv8mSdNCqatzzDPuLx5q/P3m bsqvNas6ihlYRDjYpAVU2R5/kV8f5BI2LzOC/5uMHNYmUCGMHBxCsBESt8y/M8V4Tz0xp5xXe19 wcer453cVuotTvQq2Z9Z+MFqXm4M42uG/5UJ81+tnzZdSGb1KWONWwnKD/+4b41bGtXx//vvOW9 DqtkB X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 Update the macros to output the compared values at hex for easier debugging when test asserts fail. We have to be careful not to re-evaluate expressions as they may have side-effects. So update the code to take local copies and use these for both the test and the debug output. Also remove unused IS_SET() macro. Signed-off-by: Lorenzo Stoakes Acked-by: Christian K=C3=B6nig Reviewed-by: Gregory Price --- tools/testing/vma/shared.h | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/tools/testing/vma/shared.h b/tools/testing/vma/shared.h index ca4f1238f1c7..97cd7a679dc1 100644 --- a/tools/testing/vma/shared.h +++ b/tools/testing/vma/shared.h @@ -21,19 +21,35 @@ } \ } while (0) =20 -#define ASSERT_TRUE(_expr) \ - do { \ - if (!(_expr)) { \ - fprintf(stderr, \ - "Assert FAILED at %s:%d:%s(): %s is FALSE.\n", \ - __FILE__, __LINE__, __FUNCTION__, #_expr); \ - return false; \ - } \ +#define __ASSERT_TRUE(_expr, _fmt, ...) \ + do { \ + if (!(_expr)) { \ + fprintf(stderr, \ + "Assert FAILED at %s:%d:%s(): %s is FALSE" \ + _fmt ".\n", \ + __FILE__, __LINE__, __FUNCTION__, #_expr \ + __VA_OPT__(,) __VA_ARGS__); \ + return false; \ + } \ } while (0) =20 +#define __TO_SCALAR(x) ((unsigned long long)(uintptr_t)(x)) + +#define ASSERT_TRUE(_expr) __ASSERT_TRUE(_expr, "") #define ASSERT_FALSE(_expr) ASSERT_TRUE(!(_expr)) -#define ASSERT_EQ(_val1, _val2) ASSERT_TRUE((_val1) =3D=3D (_val2)) -#define ASSERT_NE(_val1, _val2) ASSERT_TRUE((_val1) !=3D (_val2)) +#define ASSERT_EQ(_val1, _val2) do { \ + __typeof__(_val1) __val1 =3D (_val1); \ + __typeof__(_val2) __val2 =3D (_val2); \ + __ASSERT_TRUE(__val1 =3D=3D __val2, " (0x%llx !=3D 0x%llx)", \ + __TO_SCALAR(__val1), __TO_SCALAR(__val2)); \ + } while (0) + +#define ASSERT_NE(_val1, _val2) do { \ + __typeof__(_val1) __val1 =3D (_val1); \ + __typeof__(_val2) __val2 =3D (_val2); \ + __ASSERT_TRUE(__val1 !=3D __val2, " (0x%llx =3D=3D 0x%llx)", \ + __TO_SCALAR(__val1), __TO_SCALAR(__val2)); \ + } while (0) =20 #define ASSERT_FLAGS_SAME_MASK(_flags, _flags_other) \ ASSERT_TRUE(vma_flags_same_mask((_flags), (_flags_other))) @@ -53,8 +69,6 @@ #define ASSERT_FLAGS_NONEMPTY(_flags) \ ASSERT_FALSE(vma_flags_empty(_flags)) =20 -#define IS_SET(_val, _flags) ((_val & _flags) =3D=3D _flags) - extern bool fail_prealloc; =20 /* Override vma_iter_prealloc() so we can choose to fail it. */ --=20 2.55.0