linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] Rework REFCOUNT_FULL using atomic_fetch_* operations
@ 2019-08-02 10:09 Will Deacon
  2019-08-02 10:09 ` [PATCH 1/6] lib/refcount: Define constants for saturation and max refcount values Will Deacon
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Will Deacon @ 2019-08-02 10:09 UTC (permalink / raw)
  To: linux-kernel
  Cc: Will Deacon, Kees Cook, Ingo Molnar, Elena Reshetova,
	Peter Zijlstra, Ard Biesheuvel, Hanjun Guo, Jan Glauber

Hi all,

This patch series reworks the generic REFCOUNT_FULL implementation using
atomic_fetch_* operations so that the performance impact of the cmpxchg()
loops is mitigated for common refcount operations. The algorithm was
heavily inspired by Ard's assembly implementation for arm64:

  http://lkml.kernel.org/r/20190619105431.2630-1-ard.biesheuvel@linaro.org

but I figured we could achieve something similar using atomics in generic
code.

Although the revised implementation passes all of the lkdtm REFCOUNT
tests, there is a race condition introduced by the deferred saturation
whereby if INT_MIN + 2 tasks take a reference on a refcount at
REFCOUNT_MAX and are each preempted between detecting overflow and
writing the saturated value without being rescheduled, then another task
may end up erroneously freeing the object when it drops the refcount and
sees zero. It doesn't feel like a particularly realistic case to me, but
I thought I should mention it in case somebody else knows better.

Will

Cc: Kees Cook <keescook@chromium.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Elena Reshetova <elena.reshetova@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Hanjun Guo <guohanjun@huawei.com>
Cc: Jan Glauber <jglauber@marvell.com>

--->8

Will Deacon (6):
  lib/refcount: Define constants for saturation and max refcount values
  lib/refcount: Ensure integer operands are treated as signed
  lib/refcount: Remove unused refcount_*_checked() variants
  lib/refcount: Move bulk of REFCOUNT_FULL implementation into header
  lib/refcount: Improve performance of generic REFCOUNT_FULL code
  lib/refcount: Consolidate REFCOUNT_{MAX,SATURATED} definitions

 drivers/misc/lkdtm/refcount.c |   8 --
 include/linux/refcount.h      | 236 +++++++++++++++++++++++++++++++++++++----
 lib/refcount.c                | 238 +-----------------------------------------
 3 files changed, 219 insertions(+), 263 deletions(-)

-- 
2.11.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-08-12 18:08 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-02 10:09 [PATCH 0/6] Rework REFCOUNT_FULL using atomic_fetch_* operations Will Deacon
2019-08-02 10:09 ` [PATCH 1/6] lib/refcount: Define constants for saturation and max refcount values Will Deacon
2019-08-02 10:09 ` [PATCH 2/6] lib/refcount: Ensure integer operands are treated as signed Will Deacon
2019-08-02 10:09 ` [PATCH 3/6] lib/refcount: Remove unused refcount_*_checked() variants Will Deacon
2019-08-02 10:09 ` [PATCH 4/6] lib/refcount: Move bulk of REFCOUNT_FULL implementation into header Will Deacon
2019-08-02 18:52   ` Peter Zijlstra
2019-08-03  2:23     ` Kees Cook
2019-08-09 16:04       ` Will Deacon
2019-08-12 18:08         ` Kees Cook
2019-08-02 10:09 ` [PATCH 5/6] lib/refcount: Improve performance of generic REFCOUNT_FULL code Will Deacon
2019-08-02 18:55   ` Peter Zijlstra
2019-08-09 15:38     ` Will Deacon
2019-08-02 10:10 ` [PATCH 6/6] lib/refcount: Consolidate REFCOUNT_{MAX,SATURATED} definitions Will Deacon
2019-08-02 18:49 ` [PATCH 0/6] Rework REFCOUNT_FULL using atomic_fetch_* operations Peter Zijlstra
2019-08-09 15:34   ` Will Deacon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).