Messages in this thread | | | Date | Wed, 1 Mar 2023 17:57:08 -0500 | From | Peter Xu <> | Subject | Re: [PATCH v2 09/11] mm/vmstat: use cmpxchg loop in cpu_vm_stats_fold |
| |
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
| |