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