* [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup
@ 2025-10-28 6:19 Quanmin Yan
2025-10-28 14:19 ` SeongJae Park
0 siblings, 1 reply; 6+ messages in thread
From: Quanmin Yan @ 2025-10-28 6:19 UTC (permalink / raw)
To: sj
Cc: akpm, damon, linux-kernel, linux-mm, yanquanmin1,
wangkefeng.wang, zuoze1
In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to
avoid unnecessarily frequent stat update.
On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make
jiffies wrap bugs appear earlier. However, this causes time_before_eq()
in DAMON_STAT to unexpectedly return true during the first 5 minutes
after boot on 32-bit systems (see [1] for more explanation, which fixes
another jiffies-related issue in DAMON). As a result, DAMON_STAT does not
update any monitoring results during that period, which can be more
confusing when DAMON_STAT_ENABLED_DEFAULT is enabled.
Fix it by setting last_refresh_jiffies to jiffies at startup.
[1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com
Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth")
Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com>
---
mm/damon/stat.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mm/damon/stat.c b/mm/damon/stat.c
index 6c4503d2aee3..6dc3e18de910 100644
--- a/mm/damon/stat.c
+++ b/mm/damon/stat.c
@@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data)
struct damon_ctx *c = data;
static unsigned long last_refresh_jiffies;
+ if (unlikely(!last_refresh_jiffies))
+ last_refresh_jiffies = jiffies;
+
/* avoid unnecessarily frequent stat update */
if (time_before_eq(jiffies, last_refresh_jiffies +
msecs_to_jiffies(5 * MSEC_PER_SEC)))
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup 2025-10-28 6:19 [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup Quanmin Yan @ 2025-10-28 14:19 ` SeongJae Park 2025-10-28 14:32 ` SeongJae Park 2025-10-29 1:32 ` Quanmin Yan 0 siblings, 2 replies; 6+ messages in thread From: SeongJae Park @ 2025-10-28 14:19 UTC (permalink / raw) To: Quanmin Yan Cc: SeongJae Park, akpm, damon, linux-kernel, linux-mm, wangkefeng.wang, zuoze1 On Tue, 28 Oct 2025 14:19:27 +0800 Quanmin Yan <yanquanmin1@huawei.com> wrote: > In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to > avoid unnecessarily frequent stat update. > > On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make > jiffies wrap bugs appear earlier. However, this causes time_before_eq() > in DAMON_STAT to unexpectedly return true during the first 5 minutes > after boot on 32-bit systems (see [1] for more explanation, which fixes > another jiffies-related issue in DAMON). As a result, DAMON_STAT does not > update any monitoring results during that period, which can be more > confusing when DAMON_STAT_ENABLED_DEFAULT is enabled. > > Fix it by setting last_refresh_jiffies to jiffies at startup. Nice catch, thank you for this patch! > > [1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com > > Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth") > Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com> > --- > mm/damon/stat.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/mm/damon/stat.c b/mm/damon/stat.c > index 6c4503d2aee3..6dc3e18de910 100644 > --- a/mm/damon/stat.c > +++ b/mm/damon/stat.c > @@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data) > struct damon_ctx *c = data; > static unsigned long last_refresh_jiffies; > > + if (unlikely(!last_refresh_jiffies)) > + last_refresh_jiffies = jiffies; > + How about doing the initialization together with the declaration? E.g., static int damon_stat_damon_call_fn(void *data) { struct damon_ctx *c = data; - static unsigned long last_refresh_jiffies; + static unsigned long last_refresh_jiffies = jiffies; Thanks, SJ [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup 2025-10-28 14:19 ` SeongJae Park @ 2025-10-28 14:32 ` SeongJae Park 2025-10-29 1:30 ` SeongJae Park 2025-10-29 1:32 ` Quanmin Yan 1 sibling, 1 reply; 6+ messages in thread From: SeongJae Park @ 2025-10-28 14:32 UTC (permalink / raw) To: SeongJae Park Cc: Quanmin Yan, akpm, damon, linux-kernel, linux-mm, wangkefeng.wang, zuoze1 On Tue, 28 Oct 2025 07:19:14 -0700 SeongJae Park <sj@kernel.org> wrote: > On Tue, 28 Oct 2025 14:19:27 +0800 Quanmin Yan <yanquanmin1@huawei.com> wrote: > > > In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to > > avoid unnecessarily frequent stat update. > > > > On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make > > jiffies wrap bugs appear earlier. However, this causes time_before_eq() > > in DAMON_STAT to unexpectedly return true during the first 5 minutes > > after boot on 32-bit systems (see [1] for more explanation, which fixes > > another jiffies-related issue in DAMON). As a result, DAMON_STAT does not > > update any monitoring results during that period, which can be more > > confusing when DAMON_STAT_ENABLED_DEFAULT is enabled. > > > > Fix it by setting last_refresh_jiffies to jiffies at startup. > > Nice catch, thank you for this patch! > > > > > [1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com > > > > Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth") > > Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com> > > --- > > mm/damon/stat.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/mm/damon/stat.c b/mm/damon/stat.c > > index 6c4503d2aee3..6dc3e18de910 100644 > > --- a/mm/damon/stat.c > > +++ b/mm/damon/stat.c > > @@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data) > > struct damon_ctx *c = data; > > static unsigned long last_refresh_jiffies; > > > > + if (unlikely(!last_refresh_jiffies)) > > + last_refresh_jiffies = jiffies; > > + > > How about doing the initialization together with the declaration? E.g., > > static int damon_stat_damon_call_fn(void *data) > { > struct damon_ctx *c = data; > - static unsigned long last_refresh_jiffies; > + static unsigned long last_refresh_jiffies = jiffies; Actually, a similar issue can happen again if DAMON_STAT is stopped and restarted by user. That is, if user stops DAMON_STAT just after last_refresh_jiffies is updated, and restart it after 5 seconds or more, the time_before_eq() on damon_call_fn() will return true, so stat updates will happen earlier than expected. Shouldn't be a real problem, but better to avoid if possible. How about making last_refresh_jiffies a global variable and initialize it on damon_stat_start()? To avoid unnecessary name conflicts, the variable name would also better to be changed, e.g., damon_stat_last_refresh_jiffies. Thanks, SJ [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup 2025-10-28 14:32 ` SeongJae Park @ 2025-10-29 1:30 ` SeongJae Park 2025-10-29 2:02 ` Quanmin Yan 0 siblings, 1 reply; 6+ messages in thread From: SeongJae Park @ 2025-10-29 1:30 UTC (permalink / raw) To: SeongJae Park Cc: Quanmin Yan, akpm, damon, linux-kernel, linux-mm, wangkefeng.wang, zuoze1 On Tue, 28 Oct 2025 07:32:49 -0700 SeongJae Park <sj@kernel.org> wrote: > On Tue, 28 Oct 2025 07:19:14 -0700 SeongJae Park <sj@kernel.org> wrote: > > > On Tue, 28 Oct 2025 14:19:27 +0800 Quanmin Yan <yanquanmin1@huawei.com> wrote: > > > > > In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to > > > avoid unnecessarily frequent stat update. > > > > > > On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make > > > jiffies wrap bugs appear earlier. However, this causes time_before_eq() > > > in DAMON_STAT to unexpectedly return true during the first 5 minutes > > > after boot on 32-bit systems (see [1] for more explanation, which fixes > > > another jiffies-related issue in DAMON). As a result, DAMON_STAT does not > > > update any monitoring results during that period, which can be more > > > confusing when DAMON_STAT_ENABLED_DEFAULT is enabled. > > > > > > Fix it by setting last_refresh_jiffies to jiffies at startup. > > > > Nice catch, thank you for this patch! > > > > > > > > [1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com > > > > > > Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth") > > > Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com> > > > --- > > > mm/damon/stat.c | 3 +++ > > > 1 file changed, 3 insertions(+) > > > > > > diff --git a/mm/damon/stat.c b/mm/damon/stat.c > > > index 6c4503d2aee3..6dc3e18de910 100644 > > > --- a/mm/damon/stat.c > > > +++ b/mm/damon/stat.c > > > @@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data) > > > struct damon_ctx *c = data; > > > static unsigned long last_refresh_jiffies; > > > > > > + if (unlikely(!last_refresh_jiffies)) > > > + last_refresh_jiffies = jiffies; > > > + > > > > How about doing the initialization together with the declaration? E.g., > > > > static int damon_stat_damon_call_fn(void *data) > > { > > struct damon_ctx *c = data; > > - static unsigned long last_refresh_jiffies; > > + static unsigned long last_refresh_jiffies = jiffies; Please ignore the above suggestion. It will even not build, like below... .../mm/damon/stat.c: In function ‘damon_stat_damon_call_fn’: .../mm/damon/stat.c:133:53: error: initializer element is not constant 133 | static unsigned long last_refresh_jiffies = jiffies; | ^~~~~~~ > > Actually, a similar issue can happen again if DAMON_STAT is stopped and > restarted by user. That is, if user stops DAMON_STAT just after > last_refresh_jiffies is updated, and restart it after 5 seconds or more, the > time_before_eq() on damon_call_fn() will return true, so stat updates will > happen earlier than expected. Shouldn't be a real problem, but better to avoid > if possible. > > How about making last_refresh_jiffies a global variable and initialize it on > damon_stat_start()? To avoid unnecessary name conflicts, the variable name > would also better to be changed, e.g., damon_stat_last_refresh_jiffies. But, please consider the above one. And I just realized a similar issue exist for next_update_jiffies in mm/damon/sysfs.c file. Please feel free to send a patch for that if you willing to. Thanks, SJ [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup 2025-10-29 1:30 ` SeongJae Park @ 2025-10-29 2:02 ` Quanmin Yan 0 siblings, 0 replies; 6+ messages in thread From: Quanmin Yan @ 2025-10-29 2:02 UTC (permalink / raw) To: SeongJae Park Cc: akpm, damon, linux-kernel, linux-mm, wangkefeng.wang, zuoze1 在 2025/10/29 9:30, SeongJae Park 写道: > On Tue, 28 Oct 2025 07:32:49 -0700 SeongJae Park <sj@kernel.org> wrote: > >> On Tue, 28 Oct 2025 07:19:14 -0700 SeongJae Park <sj@kernel.org> wrote: >> >>> On Tue, 28 Oct 2025 14:19:27 +0800 Quanmin Yan <yanquanmin1@huawei.com> wrote: >>> >>>> In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to >>>> avoid unnecessarily frequent stat update. >>>> >>>> On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make >>>> jiffies wrap bugs appear earlier. However, this causes time_before_eq() >>>> in DAMON_STAT to unexpectedly return true during the first 5 minutes >>>> after boot on 32-bit systems (see [1] for more explanation, which fixes >>>> another jiffies-related issue in DAMON). As a result, DAMON_STAT does not >>>> update any monitoring results during that period, which can be more >>>> confusing when DAMON_STAT_ENABLED_DEFAULT is enabled. >>>> >>>> Fix it by setting last_refresh_jiffies to jiffies at startup. >>> Nice catch, thank you for this patch! >>> >>>> [1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com >>>> >>>> Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth") >>>> Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com> >>>> --- >>>> mm/damon/stat.c | 3 +++ >>>> 1 file changed, 3 insertions(+) >>>> >>>> diff --git a/mm/damon/stat.c b/mm/damon/stat.c >>>> index 6c4503d2aee3..6dc3e18de910 100644 >>>> --- a/mm/damon/stat.c >>>> +++ b/mm/damon/stat.c >>>> @@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data) >>>> struct damon_ctx *c = data; >>>> static unsigned long last_refresh_jiffies; >>>> >>>> + if (unlikely(!last_refresh_jiffies)) >>>> + last_refresh_jiffies = jiffies; >>>> + >>> How about doing the initialization together with the declaration? E.g., >>> >>> static int damon_stat_damon_call_fn(void *data) >>> { >>> struct damon_ctx *c = data; >>> - static unsigned long last_refresh_jiffies; >>> + static unsigned long last_refresh_jiffies = jiffies; > Please ignore the above suggestion. It will even not build, like below... > > .../mm/damon/stat.c: In function ‘damon_stat_damon_call_fn’: > .../mm/damon/stat.c:133:53: error: initializer element is not constant > 133 | static unsigned long last_refresh_jiffies = jiffies; > | ^~~~~~~ > >> Actually, a similar issue can happen again if DAMON_STAT is stopped and >> restarted by user. That is, if user stops DAMON_STAT just after >> last_refresh_jiffies is updated, and restart it after 5 seconds or more, the >> time_before_eq() on damon_call_fn() will return true, so stat updates will >> happen earlier than expected. Shouldn't be a real problem, but better to avoid >> if possible. >> >> How about making last_refresh_jiffies a global variable and initialize it on >> damon_stat_start()? To avoid unnecessary name conflicts, the variable name >> would also better to be changed, e.g., damon_stat_last_refresh_jiffies. > But, please consider the above one. > > And I just realized a similar issue exist for next_update_jiffies in > mm/damon/sysfs.c file. Please feel free to send a patch for that if you > willing to. > OK, I’ll review all these issues and send a new patch set once everything is ready.🙂 Thanks, Quanmin Yan [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup 2025-10-28 14:19 ` SeongJae Park 2025-10-28 14:32 ` SeongJae Park @ 2025-10-29 1:32 ` Quanmin Yan 1 sibling, 0 replies; 6+ messages in thread From: Quanmin Yan @ 2025-10-29 1:32 UTC (permalink / raw) To: SeongJae Park Cc: akpm, damon, linux-kernel, linux-mm, wangkefeng.wang, zuoze1 在 2025/10/28 22:19, SeongJae Park 写道: > On Tue, 28 Oct 2025 14:19:27 +0800 Quanmin Yan <yanquanmin1@huawei.com> wrote: > >> In DAMON_STAT's damon_stat_damon_call_fn(), time_before_eq() is used to >> avoid unnecessarily frequent stat update. >> >> On 32-bit systems, the kernel initializes jiffies to "-5 minutes" to make >> jiffies wrap bugs appear earlier. However, this causes time_before_eq() >> in DAMON_STAT to unexpectedly return true during the first 5 minutes >> after boot on 32-bit systems (see [1] for more explanation, which fixes >> another jiffies-related issue in DAMON). As a result, DAMON_STAT does not >> update any monitoring results during that period, which can be more >> confusing when DAMON_STAT_ENABLED_DEFAULT is enabled. >> >> Fix it by setting last_refresh_jiffies to jiffies at startup. > Nice catch, thank you for this patch! > >> [1] https://lkml.kernel.org/r/20250822025057.1740854-1-ekffu200098@gmail.com >> >> Fixes: fabdd1e911da ("mm/damon/stat: calculate and expose estimated memory bandwidth") >> Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com> >> --- >> mm/damon/stat.c | 3 +++ >> 1 file changed, 3 insertions(+) >> >> diff --git a/mm/damon/stat.c b/mm/damon/stat.c >> index 6c4503d2aee3..6dc3e18de910 100644 >> --- a/mm/damon/stat.c >> +++ b/mm/damon/stat.c >> @@ -132,6 +132,9 @@ static int damon_stat_damon_call_fn(void *data) >> struct damon_ctx *c = data; >> static unsigned long last_refresh_jiffies; >> >> + if (unlikely(!last_refresh_jiffies)) >> + last_refresh_jiffies = jiffies; >> + > How about doing the initialization together with the declaration? E.g., > > static int damon_stat_damon_call_fn(void *data) > { > struct damon_ctx *c = data; > - static unsigned long last_refresh_jiffies; > + static unsigned long last_refresh_jiffies = jiffies; > Thank you for your suggestion. Well, I actually tried that before, but found that jiffies is not a compile-time constant,|it| is set at runtime, while static initializers must use constant expressions, that's why the current patch is modified this way. Thanks, Quanmin Yan [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-10-29 2:03 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-10-28 6:19 [PATCH] mm/damon/stat: set last_refresh_jiffies to jiffies at startup Quanmin Yan 2025-10-28 14:19 ` SeongJae Park 2025-10-28 14:32 ` SeongJae Park 2025-10-29 1:30 ` SeongJae Park 2025-10-29 2:02 ` Quanmin Yan 2025-10-29 1:32 ` Quanmin Yan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox