[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y//YREMSErJjiSzh@x1n>
Date: Wed, 1 Mar 2023 17:57:08 -0500
From: Peter Xu <peterx@...hat.com>
To: Marcelo Tosatti <mtosatti@...hat.com>
Cc: Christoph Lameter <cl@...ux.com>,
Aaron Tomlin <atomlin@...mlin.com>,
Frederic Weisbecker <frederic@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org, linux-mm@...ck.org
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
Powered by blists - more mailing lists