From: Radoslaw Zarzynski Date: Tue, 13 Nov 2018 23:47:06 +0000 (+0100) Subject: common: try to skip atomical decrement in buffer::ptr::release(). X-Git-Tag: v14.1.0~172^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=48aaf3cbee045852a382097f19e815638ab20926;p=ceph.git common: try to skip atomical decrement in buffer::ptr::release(). Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index f6a33e43b68..45af914f989 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -539,7 +539,8 @@ static ceph::spinlock debug_lock; { if (_raw) { bdout << "ptr " << this << " release " << _raw << bendl; - if (--_raw->nref == 0) { + const bool last_one = (1 == _raw->nref.load(std::memory_order_acquire)); + if (likely(last_one) || --_raw->nref == 0) { // BE CAREFUL: this is called also for hypercombined ptr_node. After // freeing underlying raw, `*this` can become inaccessible as well! const auto* delete_raw = _raw;