Re: [PATCH v2 09/11] mm/vmstat: use cmpxchg loop in cpu_vm_stats_fold

From: Peter Xu
Date: Wed Mar 01 2023 - 17:58:04 EST


On Thu, Feb 09, 2023 at 12:01:59PM -0300, Marcelo Tosatti wrote:
> /*
> - * Fold the data for an offline cpu into the global array.
> + * Fold the data for a cpu into the global array.
> * There cannot be any access by the offline cpu and therefore
> * synchronization is simplified.
> */
> @@ -906,8 +906,9 @@ void cpu_vm_stats_fold(int cpu)
> if (pzstats->vm_stat_diff[i]) {
> int v;
>
> - v = pzstats->vm_stat_diff[i];
> - pzstats->vm_stat_diff[i] = 0;
> + do {
> + v = pzstats->vm_stat_diff[i];
> + } while (!try_cmpxchg(&pzstats->vm_stat_diff[i], &v, 0));

IIUC try_cmpxchg will update "v" already, so I'd assume this'll work the
same:

while (!try_cmpxchg(&pzstats->vm_stat_diff[i], &v, 0));

Then I figured, maybe it's easier to use xchg()?

I've no knowledge at all on cpu offline code, so sorry if this will be a
naive question. But from what I understand this should not be touched by
anyone else. Reasons:

(1) cpu_vm_stats_fold() is only called in page_alloc_cpu_dead(), and the
comment says:

/*
* Zero the differential counters of the dead processor
* so that the vm statistics are consistent.
*
* This is only okay since the processor is dead and cannot
* race with what we are doing.
*/
cpu_vm_stats_fold(cpu);

so.. I think that's what it says..

(2) If someone can modify the dead cpu's vm_stat_diff, what guarantees it
won't be e.g. boosted again right after try_cmpxchg() / xchg()
returns? What to do with the left-overs?

Thanks,

--
Peter Xu