Thread (50 messages) 50 messages, 5 authors, 2012-01-26

Re: [RFC] [PATCH 2/7 v2] memcg: add memory barrier for checking account move.

From: Michal Hocko <hidden>
Date: 2012-01-25 11:07:28
Also in: linux-mm

On Tue 24-01-12 11:04:16, Ying Han wrote:
On Mon, Jan 23, 2012 at 1:04 AM, Michal Hocko [off-list ref] wrote:
quoted
On Fri 20-01-12 10:08:44, Ying Han wrote:
quoted
On Wed, Jan 18, 2012 at 6:17 PM, KAMEZAWA Hiroyuki
[off-list ref] wrote:
[...]
quoted
quoted
quoted
I doubt .... If no barrier, this case happens

==
       update                  reference
       CPU A                   CPU B
       set value
       synchronize_rcu()       rcu_read_lock()
                               read_value <= find old value
                               rcu_read_unlock()
                               do no lock
==
Hi Kame,

Can you help to clarify a bit more on the example above? Why
read_value got the old value after synchronize_rcu().
AFAIU it is because rcu_read_unlock doesn't force any memory barrier
and we synchronize only the updater (with synchronize_rcu), so nothing
guarantees that the value set on CPUA is visible to CPUB.
Thanks, and i might have found similar comment on the
documentation/rcu/checklist.txt:
"
The various RCU read-side primitives do -not- necessarily contain
memory barriers.
"

So, the read barrier here is to make sure no reordering between the
reader and the rcu_read_lock. The same for the write barrier which
makes sure no reordering between the updater and synchronize_rcu. The
the rcu here is to synchronize between the updater and reader. If so,
why not the change like :

       for_each_online_cpu(cpu)
               per_cpu(memcg->stat->count[MEM_CGROUP_ON_MOVE], cpu) += 1;
+      smp_wmb();
Threre is a data dependency between per_cpu update (the above for look)
and local read of the per-cpu on the read-side and IIUC we need to pair
write barrier with read one before we read the value.

But I might be wrong here (see the SMP BARRIER PAIRING section in
Documentation/memory-barriers.txt).
Sorry, the use of per-cpu variable MEM_CGROUP_ON_MOVE does confuse me.
-- 
Michal Hocko
SUSE Labs
SUSE LINUX s.r.o.
Lihovarska 1060/12
190 00 Praha 9    
Czech Republic
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help