Re: [PATCH 1/2] samples/damon/mtier: error out for zero quota goal target values
[email protected] Mon, 03 Aug 2026 14:06:52 +0000
| Newsgroups | dev.linux.lists.damon |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 4 potential issue(= s) to consider: New issues: - [High] The safety check for zero values evaluates global module parameter= s without `READ_ONCE()`, introducing a TOCTOU race window that bypasses the= patch's defense. - [Low] The newly added comment references a non-existent function `damos_q= uota_store()` instead of `damos_quota_score()`. Pre-existing issues: - [High] The core API `damos_new_quota_goal()` fails to validate `target_va= lue !=3D 0`, forcing ad-hoc checks in caller modules and leaving the subsys= tem vulnerable to division by zero. - [High] The DAMON LRU sort module computes a quota goal target value from = an unvalidated module parameter, allowing users to trigger a division by ze= ro crash. -- --- Patch [1]: [PATCH 1/2] samples/damon/mtier: error out for zero quota go= al target values --- commit 8e87b5068bfcd9e35bdbd23dadaa97f649431adb Author: SJ Park <[email protected]> samples/damon/mtier: error out for zero quota goal target values This patch prevents a division by zero in damos_quota_score() by returning an error when a user configures DAMON with zero target values for the node0_mem_used_bp or node0_mem_free_bp module parameters. Link: https://lore.kernel.org/[email protected] > diff --git a/samples/damon/mtier.c b/samples/damon/mtier.c > index ac9c24b92ead8..d1123ebbfab90 100644 > --- a/samples/damon/mtier.c > +++ b/samples/damon/mtier.c > @@ -156,6 +156,9 @@ static struct damon_ctx *damon_sample_mtier_build_ctx= (bool promote) > if (!scheme) > goto free_out; > damon_set_schemes(ctx, &scheme, 1); > + /* zero target value causes division by zero in damos_quota_store() */ [Severity: Low] This isn't a bug, but there is a typo in the comment. Should damos_quota_store() be damos_quota_score()? > + if (!node0_mem_used_bp || !node0_mem_free_bp) > + goto free_out; > quota_goal =3D damos_new_quota_goal( > promote ? DAMOS_QUOTA_NODE_MEM_USED_BP : > DAMOS_QUOTA_NODE_MEM_FREE_BP, > promote ? node0_mem_used_bp : node0_mem_free_bp); [Severity: High] Can a concurrent sysfs write bypass this safety check? The module parameters node0_mem_used_bp and node0_mem_free_bp are read multiple times without READ_ONCE().=20 A concurrent thread could set a non-zero value to pass the check, and then overwrite it with zero before damos_new_quota_goal() reads the parameter again. Would this re-introduce the division by zero crash? This same double-read pattern appears to be present in other DAMON modules: mm/damon/lru_sort.c:damon_lru_sort_add_quota_goals() { if (!active_mem_bp) return 0; goal =3D damos_new_quota_goal(DAMOS_QUOTA_ACTIVE_MEM_BP, active_mem= _bp); ... } mm/damon/reclaim.c:damon_reclaim_apply_parameters() { if (quota_mem_pressure_us) { goal =3D damos_new_quota_goal(DAMOS_QUOTA_SOME_MEM_PSI_US, quota_mem_pressure_us); ... } Should these parameters be cached in local variables or read with READ_ONCE= () to prevent a Time-of-Check to Time-of-Use race? [Severity: High] This is a pre-existing issue, but does the core API damos_new_quota_goal() need a check for a zero target_value? Currently, callers are responsible for validating the target value to avoid a division by zero in damos_quota_score(). If damos_new_quota_goal() validated this and returned NULL when target_value is 0, it would protect the entire DAMON subsystem systematically without relying on ad-hoc checks in caller modules: mm/damon/core.c:damos_new_quota_goal() { struct damos_quota_goal *goal; goal =3D kmalloc_obj(*goal); if (!goal) return NULL; goal->metric =3D metric; goal->target_value =3D target_value; ... } [Severity: High] This is a pre-existing issue, but can the LRU sort module trigger a division by zero despite parameter validation? In damon_lru_sort_add_quota_goals(), the cold scheme's quota goal is computed dynamically: mm/damon/lru_sort.c:damon_lru_sort_add_quota_goals() { ... goal =3D damos_new_quota_goal(DAMOS_QUOTA_INACTIVE_MEM_BP, 10000 - active_mem_bp + 2); ... } If a user configures the active_mem_bp module parameter to exactly 10002 via sysfs, the resulting target_value evaluates to 0.=20 Since this value is passed directly to damos_new_quota_goal(), wouldn't this crash the kernel in damos_quota_score()? --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260803134034.1521= [email protected]?part=3D1