mm/damon: unurgent fixes for infinite loop, NULL de-ref and races
Subsystems (4)
SJ Park
maintainercover mm/damon: unurgent fixes for infinite loop, NULL de-ref and races
Sashiko found a few issues in DAMON that could cause infinite loop, NULL dereference and monitoring results degradation. The first two sounds scary but the infinite loop happens only under unreasonable user setup. The NULL dereference is only in a unit test. Monitoring results degradation is trivial since it is only best-effort, and those happens from only unlikely races. Still those are bugs that better to fix if possible. Fix those.
Changes from v1
- v1: https://lore.kernel.org/[email protected]
- Add addr_unit race fix.
- Add Fixes: tags to the race fixes.
- Wordsmith subjects.
Changes from RFC v1.2
- RFC v1.2: https://lore.kernel.org/[email protected]
- Drop RFC tag.
- Rebase to latest mm-new.
Changes from RFC v1.1
- RFC v1.1: https://lore.kernel.org/[email protected]
- Remove same_target param from __damon_va_check_access(). Changes from RFC
- RFC: https://lore.kernel.org/[email protected]
- Rebase to mm-new.
SJ Park (6):
mm/damon/core: avoid infinite kdamond_merge_regions() internal loop mm/damon/tests/core-kunit: catch test failure in
test_merge_regions_of()
mm/damon/vaddr: drop last same folio access check optimization mm/damon/paddr: drop last same folio access check reuse optimization mm/damon/sysfs: read addr_unit only once in damon_sysfs_apply_inputs() mm/damon/sysfs: read ops_id only once in damon_sysfs_apply_inputs()
mm/damon/core.c | 13 +++++++++---- mm/damon/paddr.c | 20 ++++---------------- mm/damon/sysfs.c | 10 ++++++---- mm/damon/tests/core-kunit.h | 3 +++ mm/damon/vaddr.c | 33 ++++++--------------------------- 5 files changed, 28 insertions(+), 51 deletions(-)
base-commit: 52d335d2c1de60b6184b9de5ecec634892a3e136
Signature · 1 line
2.47.3
SJ Park
maintainerPATCH 1/6 mm/damon/core: avoid infinite kdamond_merge_regions() internal loop
Due to online parameter update like events, the number of DAMON regions could be higher than the user-set upper limit. kdamond_merge_regions() repeats merge regions until the number meets the limit, while doubling the merge threshold up to the theoretical maximum threshold. It is tried only up to the theoretical maximum threshold because even the aggressive merging can fail from reducing the number of regions under the user-defined upper limit. For example, there could be many user-defined non-contiguous regions that cannot be merged.
The threshold based loop break condition is evaluated by comparing the threshold for the next merging try against the theoretical maximum threshold. If max_thres is larger than UINT_MAX / 2, doubling the threshold could make it overflow, and bypass the loop break condition. In the case, if the number of regions cannot be reduced under the upper limit like explained above, the loop will run infinitely.
Prevent the case by doing the break condition check before doubling the threshold. Also, prevent the threshold exceeding the maximum threshold, as it could overflow and apply the wrong merge threshold.
This issue is unlikely to occur in real world, since having the max_thres higher than UINT_MAX / 2 require unrealistically large aggregation intervals compared to the sampling interval. Also, it requires an unrealistically large number of uncontiguous regions setup. Nonetheless, the consequence is bad and the fix is simple.
The issue was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/core.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
mm/damon/core.c +9 -4
@@ -3372,7 +3372,7 @@ static void kdamond_merge_regions(struct damon_ctx *c, unsigned int threshold, max_thres = c->attrs.aggr_interval / (c->attrs.sample_interval ? c->attrs.sample_interval :1 ); - do { +while (true) { nr_regions =0 ;damon_for_each_target (t, c) { damon_merge_regions_of(t, threshold, sz_limit, c,
@@ -3380,9 +3380,14 @@ static void kdamond_merge_regions(struct damon_ctx *c, unsigned int threshold, nr_regions +=damon_nr_regions (t); } count_age = false; - threshold =max (1 , threshold *2 ); - }while (nr_regions > c->attrs.max_nr_regions && - threshold /2 < max_thres); +if (nr_regions <= c->attrs.max_nr_regions || + max_thres <= threshold) +break ; +if (threshold < max_thres /2 ) + threshold =max (1 , threshold *2 ); +else + threshold = max_thres; + } }#ifdef CONFIG_DAMON_DEBUG_SANITY
Signature · 1 line
2.47.3
SJ Park
maintainerPATCH 2/6 mm/damon/tests/core-kunit: catch test failure in test_merge_regions_of()
In reply to SJ ParkKUNIT_EXPECT_EQ() does not abort the execution of test code when the expectation is not met. But damon_test_merge_regions_of() code after its initial KUNIT_EXPECT_EQ() call assumes the expectation is met. It does a per-region test with a hard-coded number of regions that is correct only if the expectation was met. As a result, __nth_region_of() could return NULL, and the test code can dereference NULL pointers. Fix the issue by catching the expectation failure and skip the per-region tests.
The user impact on realistic setups should be negligible, as it is a unit test.
The issue was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/tests/core-kunit.h | 3 +++ 1 file changed, 3 insertions(+)
mm/damon/tests/core-kunit.h +3 -0
@@ -260,11 +260,14 @@ static void damon_test_merge_regions_of(struct kunit *test)damon_merge_regions_of (t,9 ,9999 , ctx, true);/* 0-112, 114-130, 130-156, 156-170, 170-230, 230-10170 */ KUNIT_EXPECT_EQ (test,damon_nr_regions (t),6u ); +if (damon_nr_regions (t) !=6 ) + goto out;for (i =0 ; i <6 ; i++) { r =__nth_region_of (t, i);KUNIT_EXPECT_EQ (test, r->ar.start, saddrs[i]);KUNIT_EXPECT_EQ (test, r->ar.end, eaddrs[i]); } +out:damon_free_target (t);damon_destroy_ctx (ctx); }
Signature · 1 line
2.47.3
[email protected]
AI reviewRe: [PATCH v1.1 2/6] mm/damon/tests/core-kunit: catch test failure in test_merge_regions_of()
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [Medium] The patch correctly identifies that KUNIT_EXPECT_EQ() does not abort test execution on failure, which causes undefined behavior in subsequent code if the test expectation is not met. However, it leaves the exact same anti-pattern unfixed in several other test helper functions within the DAMON test suite. This can lead to out-of-bounds (OOB) array reads, NULL pointer dereferences, and slab corruption when test failures occur. --
--- Patch [2]: [PATCH v1.1 2/6] mm/damon/tests/core-kunit: catch test failure in test_merge_regions_of() --- commit ce2690fbbc97573d0a06744653f652063e18c91b
Author: SJ Park <[email protected]> Date: Wed Jul 15 03:09:57 2026 +0000
mm/damon/tests/core-kunit: catch test failure in test_merge_regions_of()
This commit fixes an issue where KUNIT_EXPECT_EQ() failures do not abort the test, leading to potential NULL pointer dereferences in subsequent code. It addresses this in damon_test_merge_regions_of() by explicitly checking the expectation and skipping the rest of the test if it fails.
Quoted 9 lines
mm/damon/tests/core-kunit.h +1
-0@@ -260,11 +260,14 @@ static void damon_test_merge_regions_of(struct kunit *test)damon_merge_regions_of (t,9 ,9999 , ctx, true);/* 0-112, 114-130, 130-156, 156-170, 170-230, 230-10170 */ KUNIT_EXPECT_EQ (test,damon_nr_regions (t),6u ); +if (damon_nr_regions (t) !=6 )
mm/damon/tests/core-kunit.h static void damon_test_merge_regions_of(struct kunit *test) · line 273
Quoted 10 lines
mm/damon/tests/core-kunit.h +2
-0+ goto out;for (i =0 ; i <6 ; i++) { r =__nth_region_of (t, i);KUNIT_EXPECT_EQ (test, r->ar.start, saddrs[i]);KUNIT_EXPECT_EQ (test, r->ar.end, eaddrs[i]); } +out:damon_free_target (t);damon_destroy_ctx (ctx); }
[Severity: Medium]
This is a pre-existing issue, but while you are fixing this anti-pattern here, the exact same missing abort condition exists in several other functions within the DAMON test suite.
For example, in mm/damon/tests/core-kunit.h:damos_test_commit_dests_for():
KUNIT_EXPECT_EQ(test, dst.nr_dests, src_nr_dests);
for (i = 0; i < dst.nr_dests; i++) {
KUNIT_EXPECT_EQ(test, dst.node_id_arr[i], src_node_id_arr[i]);If the expectation fails, could this loop read out-of-bounds on src_node_id_arr since it iterates based on dst.nr_dests?
Similarly, in mm/damon/tests/core-kunit.h:damon_test_split_at():
r_new = damon_next_region(r);
KUNIT_EXPECT_EQ(test, r_new->ar.start, 25ul);Could damon_next_region() yield an invalid pointer if the split fails, causing a crash when r_new->ar.start is accessed unconditionally?
The same unbounded array access or unsafe pointer dereference pattern appears to exist in:
- mm/damon/tests/core-kunit.h:damos_test_commit_quota_goals_for()
- mm/damon/tests/core-kunit.h:damon_test_commit_target_regions_for()
- mm/damon/tests/core-kunit.h:damos_test_filter_out()
- mm/damon/tests/vaddr-kunit.h:damon_do_test_apply_three_regions()
Would it make sense to update these remaining occurrences in a follow-up or v2 of this patch to prevent slab corruption or NULL pointer dereferences during test failures?
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2
SJ Park
maintainerRe: [PATCH v1.1 2/6] mm/damon/tests/core-kunit: catch test failure in test_merge_regions_of()
Quoted 69 lines · On Wed, 15 Jul 2026 03:19:07 +0000 [email protected] wrote:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [Medium] The patch correctly identifies thatKUNIT_EXPECT_EQ()does not abort test execution on failure, which causes undefined behavior in subsequent code if the test expectation is not met. However, it leaves the exact same anti-pattern unfixed in several other test helper functions within the DAMON test suite. This can lead to out-of-bounds (OOB) array reads, NULL pointer dereferences, and slab corruption when test failures occur. ----- Patch [2]: [PATCH v1.1 2/6]
mm/damon/tests/core-kunit: catch test failure intest_merge_regions_of()--- commitce2690fbbc97573d0a06744653f652063e18c91bAuthor: SJ Park <[email protected]> Date: Wed Jul 15 03:09:57 2026 +0000
mm/damon/tests/core-kunit: catch test failure intest_merge_regions_of()This commit fixes an issue where
KUNIT_EXPECT_EQ()failures do not abort the test, leading to potential NULL pointer dereferences in subsequent code. It addresses this indamon_test_merge_regions_of()by explicitly checking the expectation and skipping the rest of the test if it fails.Quoted 9 lines
mm/damon/tests/core-kunit.h +1
-0@@ -260,11 +260,14 @@ static void damon_test_merge_regions_of(struct kunit *test)damon_merge_regions_of (t,9 ,9999 , ctx, true);/* 0-112, 114-130, 130-156, 156-170, 170-230, 230-10170 */ KUNIT_EXPECT_EQ (test,damon_nr_regions (t),6u ); +if (damon_nr_regions (t) !=6 )mm/damon/tests/core-kunit.h static void damon_test_merge_regions_of(struct kunit *test) · line 273
Quoted 10 lines
mm/damon/tests/core-kunit.h +2
-0+ goto out;for (i =0 ; i <6 ; i++) { r =__nth_region_of (t, i);KUNIT_EXPECT_EQ (test, r->ar.start, saddrs[i]);KUNIT_EXPECT_EQ (test, r->ar.end, eaddrs[i]); } +out:damon_free_target (t);damon_destroy_ctx (ctx); }[Severity: Medium]
This is a pre-existing issue, but while you are fixing this anti-pattern here, the exact same missing abort condition exists in several other functions within the DAMON test suite.For example, in mm/damon/tests/core-kunit.h:damos_test_commit_dests_for():
KUNIT_EXPECT_EQ(test, dst.nr_dests, src_nr_dests); for (i = 0; i < dst.nr_dests; i++) { KUNIT_EXPECT_EQ(test, dst.node_id_arr[i], src_node_id_arr[i]);If the expectation fails, could this loop read out-of-bounds on
src_node_id_arrsince it iterates based on dst.nr_dests?Similarly, in mm/damon/tests/core-kunit.h:damon_test_split_at():
r_new = damon_next_region(r); KUNIT_EXPECT_EQ(test, r_new->ar.start, 25ul);Could
damon_next_region()yield an invalid pointer if the split fails, causing a crash whenr_new->ar.startis accessed unconditionally?The same unbounded array access or unsafe pointer dereference pattern appears to exist in:
- mm/damon/tests/core-kunit.h:damos_test_commit_quota_goals_for()
- mm/damon/tests/core-kunit.h:damon_test_commit_target_regions_for()
- mm/damon/tests/core-kunit.h:damos_test_filter_out()
- mm/damon/tests/vaddr-kunit.h:damon_do_test_apply_three_regions()
Quoted 3 lines
Would it make sense to update these remaining occurrences in a follow-up or v2 of this patch to prevent slab corruption or NULL pointer dereferences during test failures?
I will fix those as a followup.
Quoted 3 lines
Signature · 2 lines
-- Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2
Thanks,
SJ
SJ Park
maintainerPATCH 3/6 mm/damon/vaddr: drop last same folio access check optimization
In reply to SJ ParkThe optimization can race when multiple kdamonds are running. Meanwhile, the impact of the optimization is quite doubtful. Just remove it.
The user impact of the issue should be quite trivial. After all, the race can happen only when the user intentionally setup DAMON in the way. Even if it happens, it would be rare and only degrade the best-effort monitoring results. No critical consequences like kernel panic or memory corruption happen.
The race possibility was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/vaddr.c | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-)
mm/damon/vaddr.c +6 -27
@@ -383,8 +383,6 @@ static void damon_va_prepare_access_checks(struct damon_ctx *ctx) }struct damon_young_walk_private { -/* size of the folio for the access checked virtual memory address */ -unsigned long *folio_sz;bool young; };
@@ -411,7 +409,6 @@ static int damon_young_pmd_entry(pmd_t *pmd, unsigned long addr,mmu_notifier_test_young (walk->mm, addr)) priv->young = true; - *priv->folio_sz =HPAGE_PMD_SIZE ; huge_out:spin_unlock (ptl);return 0 ;
@@ -430,7 +427,6 @@ static int damon_young_pmd_entry(pmd_t *pmd, unsigned long addr,if (pte_young (ptent) || !folio_test_idle (folio) ||mmu_notifier_test_young (walk->mm, addr)) priv->young = true; - *priv->folio_sz =folio_size (folio); out:pte_unmap_unlock (pte, ptl);return 0 ;
@@ -458,7 +454,6 @@ static int damon_young_hugetlb_entry(pte_t *pte, unsigned long hmask,if (pte_young (entry) || !folio_test_idle (folio) ||mmu_notifier_test_young (walk->mm, addr)) priv->young = true; - *priv->folio_sz =huge_page_size (h);folio_put (folio);
@@ -470,11 +465,9 @@ static int damon_young_hugetlb_entry(pte_t *pte, unsigned long hmask,#define damon_young_hugetlb_entry NULL#endif /* CONFIG_HUGETLB_PAGE */ -static bool damon_va_young (struct mm_struct *mm,unsigned long addr, -unsigned long *folio_sz) +static bool damon_va_young (struct mm_struct *mm,unsigned long addr) {struct damon_young_walk_private arg = { - .folio_sz = folio_sz, .young = false, };
@@ -494,28 +487,17 @@ static bool damon_va_young(struct mm_struct *mm, unsigned long addr,* r the region to be checked */ static void __damon_va_check_access (struct mm_struct *mm, -struct damon_region *r,bool same_target) +struct damon_region *r) { -static unsigned long last_addr; -static unsigned long last_folio_sz =PAGE_SIZE ; -static bool last_accessed; +bool accessed;if (!mm) {damon_update_region_access_rate (r, false);return ; } -/* If the region is in the last checked page, reuse the result */ -if (same_target && (ALIGN_DOWN (last_addr, last_folio_sz) == -ALIGN_DOWN (r->sampling_addr, last_folio_sz))) { -damon_update_region_access_rate (r, last_accessed); -return ; - } - - last_accessed =damon_va_young (mm, r->sampling_addr, &last_folio_sz); -damon_update_region_access_rate (r, last_accessed); - - last_addr = r->sampling_addr; + accessed =damon_va_young (mm, r->sampling_addr); +damon_update_region_access_rate (r, accessed); }static unsigned int damon_va_check_accesses (struct damon_ctx *ctx)
@@ -524,15 +506,12 @@ static unsigned int damon_va_check_accesses(struct damon_ctx *ctx)struct mm_struct *mm;struct damon_region *r;unsigned int max_nr_accesses =0 ; -bool same_target;damon_for_each_target (t, ctx) { mm =damon_get_mm (t); - same_target = false;damon_for_each_region (r, t) { -__damon_va_check_access (mm, r, same_target); +__damon_va_check_access (mm, r); max_nr_accesses =max (r->nr_accesses, max_nr_accesses); - same_target = true; }if (mm)mmput (mm);
Signature · 1 line
2.47.3
SJ Park
maintainerPATCH 4/6 mm/damon/paddr: drop last same folio access check reuse optimization
In reply to SJ ParkIt can race when multiple kdamonds are being used. The problem from the race is doubtful, but the gain from the optimization is also doubtful. Simply drop the optimization in favor of code simplicity.
The user impact is doubtfully trivial. After all, this kind of interference can happen only by intentional user setup. Even if it happens, it will be rare, and the consequence is degradation of the best-effort monitoring results. No critical consequences like kernel panic or memory corruption happen.
The race was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/paddr.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-)
mm/damon/paddr.c +4 -16
@@ -65,7 +65,7 @@ static void damon_pa_prepare_access_checks(struct damon_ctx *ctx) } } -static bool damon_pa_young (phys_addr_t paddr,unsigned long *folio_sz) +static bool damon_pa_young (phys_addr_t paddr) {struct folio *folio =damon_get_folio (PHYS_PFN (paddr));bool accessed;
@@ -74,7 +74,6 @@ static bool damon_pa_young(phys_addr_t paddr, unsigned long *folio_sz)return false; accessed =damon_folio_young (folio); - *folio_sz =folio_size (folio);folio_put (folio);return accessed; }
@@ -82,23 +81,12 @@ static bool damon_pa_young(phys_addr_t paddr, unsigned long *folio_sz)static void __damon_pa_check_access (struct damon_region *r,unsigned long addr_unit) { -static phys_addr_t last_addr; -static unsigned long last_folio_sz =PAGE_SIZE ; -static bool last_accessed; +bool accessed;phys_addr_t sampling_addr =damon_pa_phys_addr ( r->sampling_addr, addr_unit); -/* If the region is in the last checked page, reuse the result */ -if (ALIGN_DOWN (last_addr, last_folio_sz) == -ALIGN_DOWN (sampling_addr, last_folio_sz)) { -damon_update_region_access_rate (r, last_accessed); -return ; - } - - last_accessed =damon_pa_young (sampling_addr, &last_folio_sz); -damon_update_region_access_rate (r, last_accessed); - - last_addr = sampling_addr; + accessed =damon_pa_young (sampling_addr); +damon_update_region_access_rate (r, accessed); }static unsigned int damon_pa_check_accesses (struct damon_ctx *ctx)
Signature · 1 line
2.47.3
SJ Park
maintainerPATCH 5/6 mm/damon/sysfs: read addr_unit only once in damon_sysfs_apply_inputs()
In reply to SJ Parkdamon_sysfs_apply_inputs() reads addr_unit twice. It could race with addr_unit_store(). As a result, the min_region_sz could wrongly be set up. Read it once.
The user impact is trivial. Sane users ain't update the parameter in parallel. Even if it happens, the DAMON core layer handles the wrong min_region_sz (!is_power_of_2()). Even if somehow the race ended up making a min_region_sz that is different from the user's intention but still valid, only monitoring itself runs differently than expected. No critical consequences like kernel panic or memory corruption happen.
The issue was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/sysfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/damon/sysfs.c +2 -2
@@ -2099,11 +2099,11 @@ static int damon_sysfs_apply_inputs(struct damon_ctx *ctx, err =damon_select_ops (ctx, sys_ctx->ops_id);if (err)return err; - ctx->addr_unit = sys_ctx->addr_unit; + ctx->addr_unit =READ_ONCE (sys_ctx->addr_unit);/* addr_unit is respected by only DAMON_OPS_PADDR */ if (sys_ctx->ops_id ==DAMON_OPS_PADDR ) ctx->min_region_sz =max ( -DAMON_MIN_REGION_SZ / sys_ctx->addr_unit,1 ); +DAMON_MIN_REGION_SZ / ctx->addr_unit,1 ); ctx->pause = sys_ctx->pause; err =damon_sysfs_set_attrs (ctx, sys_ctx->attrs);if (err)
Signature · 1 line
2.47.3
SJ Park
maintainerPATCH 6/6 mm/damon/sysfs: read ops_id only once in damon_sysfs_apply_inputs()
In reply to SJ Parkdamon_sysfs_apply_inputs() reads ops_id twice. It could race with ops_id_store(). As a result, the min_region_sz could wrongly be set up. Read it once.
The user impact is trivial. Sane users ain't update the parameter in parallel. Even if it happens, the DAMON core layer handles the wrong min_region_sz (!is_power_of_2()). Even if somehow the race ended up making a min_region_sz that is different from the user's intention but still valid, only monitoring itself runs differently than expected. No critical consequences like kernel panic or memory corruption happen
The issue was discovered [1] by Sashiko.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/sysfs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
mm/damon/sysfs.c +4 -2
@@ -2094,14 +2094,16 @@ static inline bool damon_sysfs_kdamond_running(static int damon_sysfs_apply_inputs (struct damon_ctx *ctx,struct damon_sysfs_context *sys_ctx) { +enum damon_ops_id ops_id;int err; - err =damon_select_ops (ctx, sys_ctx->ops_id); + ops_id =READ_ONCE (sys_ctx->ops_id); + err =damon_select_ops (ctx, ops_id);if (err)return err; ctx->addr_unit =READ_ONCE (sys_ctx->addr_unit);/* addr_unit is respected by only DAMON_OPS_PADDR */ -if (sys_ctx->ops_id ==DAMON_OPS_PADDR ) +if (ops_id ==DAMON_OPS_PADDR ) ctx->min_region_sz =max (DAMON_MIN_REGION_SZ / ctx->addr_unit,1 ); ctx->pause = sys_ctx->pause;
Signature · 1 line
2.47.3
SJ Park
maintainerQuoted 7 lines · On Tue, 14 Jul 2026 20:09:55 -0700 SJ Park <[email protected]> wrote:
Sashiko found a few issues in DAMON that could cause infinite loop, NULL dereference and monitoring results degradation. The first two sounds scary but the infinite loop happens only under unreasonable user setup. The NULL dereference is only in a unit test. Monitoring results degradation is trivial since it is only best-effort, and those happens from only unlikely races. Still those are bugs that better to fix if possible. Fix those.
Sashiko found no blocker for this series. Sashiko sent findings to damon@ mailing list [1], and I replied to all the comments. Please read those for details.
[1] https://lore.kernel.org/damon/
Thanks,
SJ
[...]
Andrew Morton
maintainerQuoted 9 lines · On Tue, 14 Jul 2026 20:09:55 -0700 SJ Park <[email protected]> wrote:
Sashiko found a few issues in DAMON that could cause infinite loop, NULL dereference and monitoring results degradation. The first two sounds scary but the infinite loop happens only under unreasonable user setup. The NULL dereference is only in a unit test. Monitoring results degradation is trivial since it is only best-effort, and those happens from only unlikely races. Still those are bugs that better to fix if possible. Fix those.
Subject: [PATCH v1.1 0/6] ...
So... what is the significance of "1.1" here?
SJ Park
maintainerQuoted 10 lines · On Tue, 14 Jul 2026 21:46:04 -0700 Andrew Morton <[email protected]>…
Quoted 7 lines · On Tue, 14 Jul 2026 20:09:55 -0700 SJ Park <[email protected]> wrote:
Sashiko found a few issues in DAMON that could cause infinite loop, NULL dereference and monitoring results degradation. The first two sounds scary but the infinite loop happens only under unreasonable user setup. The NULL dereference is only in a unit test. Monitoring results degradation is trivial since it is only best-effort, and those happens from only unlikely races. Still those are bugs that better to fix if possible. Fix those.
Quoted 3 lines
Quoted 1 line
Subject: [PATCH v1.1 0/6] ...
So... what is the significance of "1.1" here?
As the changelog says, one more unurgent fix (patch 5 of this sereis) has added on top of the v1.
Maybe my versioning scheme is confusing you. I increase minor version when it is purely for findings from Sashiko and if the change seems not really big. I do so because I realized it is easy to get version number large in short term when I respect Sashiko, and it may look confusing for some people. Maybe a better approach is running Sashiko in my local, but I don't have AI setup in my development environment... Let me know if this only confuses and bothers you and you have a suggestion.
Thanks,
SJ