If there is no memory allocation/freeing in the remote pageset after
some time (3 seconds for now), the remote pageset will be drained to
avoid memory wastage.
But in the current implementation, vmstat updater worker may not be
re-queued when we are waiting for the timeout (pcp->expire != 0) if
there are no vmstat changes, for example, when CPU goes idle.
This is fixed via guaranteeing that the vmstat updater worker will
always be re-queued when we are waiting for the timeout.
We can reproduce the bug via allocating/freeing pages from remote
node, then go idle. And the patch can fix it.
Fixes: 7cc36bbddde5 ("vmstat: on-demand vmstat workers V8")
Signed-off-by: "Huang, Ying" <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Michal Hocko <[email protected]>
---
mm/vmstat.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mm/vmstat.c b/mm/vmstat.c
index b731d57996c5..111118741abf 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -856,8 +856,10 @@ static int refresh_cpu_vm_stats(bool do_pagesets)
continue;
}
- if (__this_cpu_dec_return(pcp->expire))
+ if (__this_cpu_dec_return(pcp->expire)) {
+ changes++;
continue;
+ }
if (__this_cpu_read(pcp->count)) {
drain_zone_pages(zone, this_cpu_ptr(pcp));
--
2.39.2
On Fri 11-08-23 17:08:19, Huang Ying wrote:
> If there is no memory allocation/freeing in the remote pageset after
> some time (3 seconds for now), the remote pageset will be drained to
> avoid memory wastage.
>
> But in the current implementation, vmstat updater worker may not be
> re-queued when we are waiting for the timeout (pcp->expire != 0) if
> there are no vmstat changes, for example, when CPU goes idle.
Why is that a problem?
> This is fixed via guaranteeing that the vmstat updater worker will
> always be re-queued when we are waiting for the timeout.
>
> We can reproduce the bug via allocating/freeing pages from remote
> node, then go idle. And the patch can fix it.
>
> Fixes: 7cc36bbddde5 ("vmstat: on-demand vmstat workers V8")
> Signed-off-by: "Huang, Ying" <[email protected]>
> Cc: Christoph Lameter <[email protected]>
> Cc: Mel Gorman <[email protected]>
> Cc: Vlastimil Babka <[email protected]>
> Cc: Michal Hocko <[email protected]>
> ---
> mm/vmstat.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> index b731d57996c5..111118741abf 100644
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -856,8 +856,10 @@ static int refresh_cpu_vm_stats(bool do_pagesets)
> continue;
> }
>
> - if (__this_cpu_dec_return(pcp->expire))
> + if (__this_cpu_dec_return(pcp->expire)) {
> + changes++;
> continue;
> + }
>
> if (__this_cpu_read(pcp->count)) {
> drain_zone_pages(zone, this_cpu_ptr(pcp));
> --
> 2.39.2
--
Michal Hocko
SUSE Labs
Hi, Michal,
Michal Hocko <[email protected]> writes:
> On Fri 11-08-23 17:08:19, Huang Ying wrote:
>> If there is no memory allocation/freeing in the remote pageset after
>> some time (3 seconds for now), the remote pageset will be drained to
>> avoid memory wastage.
>>
>> But in the current implementation, vmstat updater worker may not be
>> re-queued when we are waiting for the timeout (pcp->expire != 0) if
>> there are no vmstat changes, for example, when CPU goes idle.
>
> Why is that a problem?
The pages of the remote zone may be kept in the local per-CPU pageset
for long time as long as there's no page allocation/freeing on the
logical CPU. In addition to the logical CPU goes idle, this is also
possible if the logical CPU is busy in the user space.
I will update the change log to include this.
--
Best Regards,
Huang, Ying
>> This is fixed via guaranteeing that the vmstat updater worker will
>> always be re-queued when we are waiting for the timeout.
>>
>> We can reproduce the bug via allocating/freeing pages from remote
>> node, then go idle. And the patch can fix it.
>>
>> Fixes: 7cc36bbddde5 ("vmstat: on-demand vmstat workers V8")
>> Signed-off-by: "Huang, Ying" <[email protected]>
>> Cc: Christoph Lameter <[email protected]>
>> Cc: Mel Gorman <[email protected]>
>> Cc: Vlastimil Babka <[email protected]>
>> Cc: Michal Hocko <[email protected]>
>> ---
>> mm/vmstat.c | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/mm/vmstat.c b/mm/vmstat.c
>> index b731d57996c5..111118741abf 100644
>> --- a/mm/vmstat.c
>> +++ b/mm/vmstat.c
>> @@ -856,8 +856,10 @@ static int refresh_cpu_vm_stats(bool do_pagesets)
>> continue;
>> }
>>
>> - if (__this_cpu_dec_return(pcp->expire))
>> + if (__this_cpu_dec_return(pcp->expire)) {
>> + changes++;
>> continue;
>> + }
>>
>> if (__this_cpu_read(pcp->count)) {
>> drain_zone_pages(zone, this_cpu_ptr(pcp));
>> --
>> 2.39.2