summaryrefslogtreecommitdiffstats
path: root/drivers/reset
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2014-11-22 09:22:42 -0500
committerTejun Heo <tj@kernel.org>2014-11-23 12:36:06 -0500
commit4aab3b5b3ccf94fc907e66233e6ca4d8675759a6 (patch)
treec14d2a47ec7cd23e11525ae608c88433c392ed01 /drivers/reset
parentcac7f2429872d3733dc3f9915857b1691da2eb2f (diff)
downloadop-kernel-dev-4aab3b5b3ccf94fc907e66233e6ca4d8675759a6.zip
op-kernel-dev-4aab3b5b3ccf94fc907e66233e6ca4d8675759a6.tar.gz
percpu-ref: fix DEAD flag contamination of percpu pointer
While decoupling ATOMIC and DEAD flags, f47ad4578461 ("percpu_ref: decouple switching to percpu mode and reinit") updated __ref_is_percpu() so that it only tests ATOMIC flag to determine whether the ref is in percpu mode or not; however, while DEAD implies ATOMIC, the two flags are set separately during percpu_ref_kill() and if __ref_is_percpu() races percpu_ref_kill(), it may see DEAD w/o ATOMIC. Because __ref_is_percpu() returns @ref->percpu_count_ptr value verbatim as the percpu pointer after testing ATOMIC, the pointer may now be contaminated with the DEAD flag. This can be fixed by clearing the flag bits before returning the pointer which was the fix proposed by Shaohua; however, as DEAD implies ATOMIC, we can just test for both flags at once and avoid the explicit masking. Update __ref_is_percpu() so that it tests that both ATOMIC and DEAD are clear before returning @ref->percpu_count_ptr as the percpu pointer. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-and-Reviewed-by: Shaohua Li <shli@kernel.org> Link: http://lkml.kernel.org/r/995deb699f5b873c45d667df4add3b06f73c2c25.1416638887.git.shli@kernel.org Fixes: f47ad4578461 ("percpu_ref: decouple switching to percpu mode and reinit")
Diffstat (limited to 'drivers/reset')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud