]> git.baikalelectronics.ru Git - kernel.git/commit
percpu-refcount: fix usage of this_cpu_ops
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 4 Jun 2014 13:58:24 +0000 (15:58 +0200)
committerTejun Heo <tj@kernel.org>
Wed, 4 Jun 2014 16:12:29 +0000 (12:12 -0400)
commit0cfd73702e0c6476c61fc9676d08f95c515cf28f
treec0ef99ba5fa35881ba8c50ac5d2238daa7e5138a
parent9f30a7362ec249be024b0bda32c7b86ea14e57a2
percpu-refcount: fix usage of this_cpu_ops

The percpu-refcount infrastructure uses the underscore variants of
this_cpu_ops in order to modify percpu reference counters.
(e.g. __this_cpu_inc()).

However the underscore variants do not atomically update the percpu
variable, instead they may be implemented using read-modify-write
semantics (more than one instruction).  Therefore it is only safe to
use the underscore variant if the context is always the same (process,
softirq, or hardirq). Otherwise it is possible to lose updates.

This problem is something that Sebastian has seen within the aio
subsystem which uses percpu refcounters both in process and softirq
context leading to reference counts that never dropped to zeroes; even
though the number of "get" and "put" calls matched.

Fix this by using the non-underscore this_cpu_ops variant which
provides correct per cpu atomic semantics and fixes the corrupted
reference counts.

Cc: Kent Overstreet <kmo@daterainc.com>
Cc: <stable@vger.kernel.org> # v3.11+
Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
References: http://lkml.kernel.org/g/alpine.LFD.2.11.1406041540520.21183@denkbrett
include/linux/percpu-refcount.h