percpu_ref: decouple switching to percpu mode and reinit
authorTejun Heo <tj@kernel.org>
Wed, 24 Sep 2014 17:31:49 +0000 (13:31 -0400)
committerTejun Heo <tj@kernel.org>
Wed, 24 Sep 2014 17:31:49 +0000 (13:31 -0400)
commitf47ad45784611297b699f3dffb6c7222b76afe64
tree9497c0a4bad4c6b97cfd08bf22a8b2313606ce6a
parent490c79a65708873228cf114cf00e32c204e4e907
percpu_ref: decouple switching to percpu mode and reinit

percpu_ref has treated the dropping of the base reference and
switching to atomic mode as an integral operation; however, there's
nothing inherent tying the two together.

The use cases for percpu_ref have been expanding continuously.  While
the current init/kill/reinit/exit model can cover a lot, the coupling
of kill/reinit with atomic/percpu mode switching is turning out to be
too restrictive for use cases where many percpu_refs are created and
destroyed back-to-back with only some of them reaching extended
operation.  The coupling also makes implementing always-atomic debug
mode difficult.

This patch separates out percpu mode switching into
percpu_ref_switch_to_percpu() and reimplements percpu_ref_reinit() on
top of it.

* DEAD still requires ATOMIC.  A dead ref can't be switched to percpu
  mode w/o going through reinit.

v2: __percpu_ref_switch_to_percpu() was missing static.  Fixed.
    Reported by Fengguang aka kbuild test robot.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: kbuild test robot <fengguang.wu@intel.com>
include/linux/percpu-refcount.h
lib/percpu-refcount.c