Subject: mm: avoid unsafe VMA hook invocation when error arises on mmap hook
To: stable@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>, "Liam R . Howlett" <Liam.Howlett@oracle.com>, Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds <torvalds@linux-foundation.org>, Peter Xu <peterx@redhat.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>, "David S . Miller" <davem@davemloft.net>, Andreas Larsson <andreas@gaisler.com>, "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>, Helge Deller <deller@gmx.de>
-Message-ID: <33d70849ec62ba738ca2f8db58fe24076d5282bf.1731672733.git.lorenzo.stoakes@oracle.com>
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
--- /dev/null
+From e9e3db69966d5e9e6f7e7d017b407c0025180fe5 Mon Sep 17 00:00:00 2001
+From: SeongJae Park <sj@kernel.org>
+Date: Mon, 5 Feb 2024 12:13:06 -0800
+Subject: mm/damon/core: check apply interval in damon_do_apply_schemes()
+
+From: SeongJae Park <sj@kernel.org>
+
+commit e9e3db69966d5e9e6f7e7d017b407c0025180fe5 upstream.
+
+kdamond_apply_schemes() checks apply intervals of schemes and avoid
+further applying any schemes if no scheme passed its apply interval.
+However, the following schemes applying function, damon_do_apply_schemes()
+iterates all schemes without the apply interval check. As a result, the
+shortest apply interval is applied to all schemes. Fix the problem by
+checking the apply interval in damon_do_apply_schemes().
+
+Link: https://lkml.kernel.org/r/20240205201306.88562-1-sj@kernel.org
+Fixes: 42f994b71404 ("mm/damon/core: implement scheme-specific apply interval")
+Signed-off-by: SeongJae Park <sj@kernel.org>
+Cc: <stable@vger.kernel.org> [6.7.x]
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ mm/damon/core.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+--- a/mm/damon/core.c
++++ b/mm/damon/core.c
+@@ -989,6 +989,9 @@ static void damon_do_apply_schemes(struc
+ damon_for_each_scheme(s, c) {
+ struct damos_quota *quota = &s->quota;
+
++ if (c->passed_sample_intervals != s->next_apply_sis)
++ continue;
++
+ if (!s->wmarks.activated)
+ continue;
+
+@@ -1089,10 +1092,6 @@ static void kdamond_apply_schemes(struct
+ if (c->passed_sample_intervals != s->next_apply_sis)
+ continue;
+
+- s->next_apply_sis +=
+- (s->apply_interval_us ? s->apply_interval_us :
+- c->attrs.aggr_interval) / sample_interval;
+-
+ if (!s->wmarks.activated)
+ continue;
+
+@@ -1108,6 +1107,14 @@ static void kdamond_apply_schemes(struct
+ damon_for_each_region_safe(r, next_r, t)
+ damon_do_apply_schemes(c, t, r);
+ }
++
++ damon_for_each_scheme(s, c) {
++ if (c->passed_sample_intervals != s->next_apply_sis)
++ continue;
++ s->next_apply_sis +=
++ (s->apply_interval_us ? s->apply_interval_us :
++ c->attrs.aggr_interval) / sample_interval;
++ }
+ }
+
+ /*
--- /dev/null
+From 1f3730fd9e8d4d77fb99c60d0e6ad4b1104e7e04 Mon Sep 17 00:00:00 2001
+From: SeongJae Park <sj@kernel.org>
+Date: Sun, 19 Nov 2023 17:15:28 +0000
+Subject: mm/damon/core: copy nr_accesses when splitting region
+
+From: SeongJae Park <sj@kernel.org>
+
+commit 1f3730fd9e8d4d77fb99c60d0e6ad4b1104e7e04 upstream.
+
+Regions split function ('damon_split_region_at()') is called at the
+beginning of an aggregation interval, and when DAMOS applying the actions
+and charging quota. Because 'nr_accesses' fields of all regions are reset
+at the beginning of each aggregation interval, and DAMOS was applying the
+action at the end of each aggregation interval, there was no need to copy
+the 'nr_accesses' field to the split-out region.
+
+However, commit 42f994b71404 ("mm/damon/core: implement scheme-specific
+apply interval") made DAMOS applies action on its own timing interval.
+Hence, 'nr_accesses' should also copied to split-out regions, but the
+commit didn't. Fix it by copying it.
+
+Link: https://lkml.kernel.org/r/20231119171529.66863-1-sj@kernel.org
+Fixes: 42f994b71404 ("mm/damon/core: implement scheme-specific apply interval")
+Signed-off-by: SeongJae Park <sj@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ mm/damon/core.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/mm/damon/core.c
++++ b/mm/damon/core.c
+@@ -1215,6 +1215,7 @@ static void damon_split_region_at(struct
+
+ new->age = r->age;
+ new->last_nr_accesses = r->last_nr_accesses;
++ new->nr_accesses = r->nr_accesses;
+
+ damon_insert_region(new, r, damon_next_region(r), t);
+ }
--- /dev/null
+From 8e7bde615f634a82a44b1f3d293c049fd3ef9ca9 Mon Sep 17 00:00:00 2001
+From: SeongJae Park <sj@kernel.org>
+Date: Thu, 31 Oct 2024 11:37:57 -0700
+Subject: mm/damon/core: handle zero schemes apply interval
+
+From: SeongJae Park <sj@kernel.org>
+
+commit 8e7bde615f634a82a44b1f3d293c049fd3ef9ca9 upstream.
+
+DAMON's logics to determine if this is the time to apply damos schemes
+assumes next_apply_sis is always set larger than current
+passed_sample_intervals. And therefore assume continuously incrementing
+passed_sample_intervals will make it reaches to the next_apply_sis in
+future. The logic hence does apply the scheme and update next_apply_sis
+only if passed_sample_intervals is same to next_apply_sis.
+
+If Schemes apply interval is set as zero, however, next_apply_sis is set
+same to current passed_sample_intervals, respectively. And
+passed_sample_intervals is incremented before doing the next_apply_sis
+check. Hence, next_apply_sis becomes larger than next_apply_sis, and the
+logic says it is not the time to apply schemes and update next_apply_sis.
+In other words, DAMON stops applying schemes until passed_sample_intervals
+overflows.
+
+Based on the documents and the common sense, a reasonable behavior for
+such inputs would be applying the schemes for every sampling interval.
+Handle the case by removing the assumption.
+
+Link: https://lkml.kernel.org/r/20241031183757.49610-3-sj@kernel.org
+Fixes: 42f994b71404 ("mm/damon/core: implement scheme-specific apply interval")
+Signed-off-by: SeongJae Park <sj@kernel.org>
+Cc: <stable@vger.kernel.org> [6.7.x]
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ mm/damon/core.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/mm/damon/core.c
++++ b/mm/damon/core.c
+@@ -989,7 +989,7 @@ static void damon_do_apply_schemes(struc
+ damon_for_each_scheme(s, c) {
+ struct damos_quota *quota = &s->quota;
+
+- if (c->passed_sample_intervals != s->next_apply_sis)
++ if (c->passed_sample_intervals < s->next_apply_sis)
+ continue;
+
+ if (!s->wmarks.activated)
+@@ -1089,7 +1089,7 @@ static void kdamond_apply_schemes(struct
+ bool has_schemes_to_apply = false;
+
+ damon_for_each_scheme(s, c) {
+- if (c->passed_sample_intervals != s->next_apply_sis)
++ if (c->passed_sample_intervals < s->next_apply_sis)
+ continue;
+
+ if (!s->wmarks.activated)
+@@ -1109,9 +1109,9 @@ static void kdamond_apply_schemes(struct
+ }
+
+ damon_for_each_scheme(s, c) {
+- if (c->passed_sample_intervals != s->next_apply_sis)
++ if (c->passed_sample_intervals < s->next_apply_sis)
+ continue;
+- s->next_apply_sis +=
++ s->next_apply_sis = c->passed_sample_intervals +
+ (s->apply_interval_us ? s->apply_interval_us :
+ c->attrs.aggr_interval) / sample_interval;
+ }
Subject: mm: refactor arch_calc_vm_flag_bits() and arm64 MTE handling
To: stable@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>, "Liam R . Howlett" <Liam.Howlett@oracle.com>, Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds <torvalds@linux-foundation.org>, Peter Xu <peterx@redhat.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>, "David S . Miller" <davem@davemloft.net>, Andreas Larsson <andreas@gaisler.com>, "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>, Helge Deller <deller@gmx.de>
-Message-ID: <7c0218d03fd2119025d8cbc1b814639cf09314e0.1731672733.git.lorenzo.stoakes@oracle.com>
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Subject: mm: refactor map_deny_write_exec()
To: stable@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>, "Liam R . Howlett" <Liam.Howlett@oracle.com>, Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds <torvalds@linux-foundation.org>, Peter Xu <peterx@redhat.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>, "David S . Miller" <davem@davemloft.net>, Andreas Larsson <andreas@gaisler.com>, "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>, Helge Deller <deller@gmx.de>
-Message-ID: <a7f0a2f48d376b2c4e2e3adf7ac011abe1eeeead.1731672733.git.lorenzo.stoakes@oracle.com>
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Subject: mm: resolve faulty mmap_region() error path behaviour
To: stable@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>, "Liam R . Howlett" <Liam.Howlett@oracle.com>, Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds <torvalds@linux-foundation.org>, Peter Xu <peterx@redhat.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>, "David S . Miller" <davem@davemloft.net>, Andreas Larsson <andreas@gaisler.com>, "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>, Helge Deller <deller@gmx.de>
-Message-ID: <b71c37d3a8b40fe1e07a085101f17b77bf293039.1731672733.git.lorenzo.stoakes@oracle.com>
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Subject: mm: unconditionally close VMAs on error
To: stable@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>, "Liam R . Howlett" <Liam.Howlett@oracle.com>, Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds <torvalds@linux-foundation.org>, Peter Xu <peterx@redhat.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>, "David S . Miller" <davem@davemloft.net>, Andreas Larsson <andreas@gaisler.com>, "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>, Helge Deller <deller@gmx.de>
-Message-ID: <cbd9c0b17ccd9898d18f8d6147e0dc6441c63217.1731672733.git.lorenzo.stoakes@oracle.com>
From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
mm-refactor-map_deny_write_exec.patch
mm-refactor-arch_calc_vm_flag_bits-and-arm64-mte-handling.patch
mm-resolve-faulty-mmap_region-error-path-behaviour.patch
+mm-damon-core-check-apply-interval-in-damon_do_apply_schemes.patch
+mm-damon-core-handle-zero-schemes-apply-interval.patch
+mm-damon-core-copy-nr_accesses-when-splitting-region.patch