linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [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