* [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-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
* 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
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