tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Debugging function of localcount
> Date: Mon, 7 Aug 2017 13:08:35 +0900
> From: Ryota Ozaki <ozaki-r%netbsd.org@localhost>
>
> Anyway I've brought another (stupid) approach that uses an atomic
> counter:
> http://www.netbsd.org/~ozaki-r/localcount_debug_atomic.diff
>
> It counts up a counter with atomic instructions along with localcount
> if LOCKDEBUG enabled. Of course it blows the merit of localcount but
> I can provide an accurate view of the counter.
>
> Do you think that it works and is useful?
That looks plausible. I'd put it under DEBUG && LOCKDEBUG, and
require localcount_debug_refcnt to be used only in KDASSERT, to avoid
adding yet more contention to plain LOCKDEBUG, and to make it safe to
write, e.g.,
KDASSERT(localcount_debug_refcnt(lc) >= 2).
Otherwise, under, e.g., DIAGNOSTIC && !LOCKDEBUG,
KASSERT(localcount_debug_refcnt(lc) >= 2)
would always fail, since localcount_debug_refcnt always returns 0.
Tiny nit: I suggest you always use uint32_t for this, and use
atomic_dec_32_nv(&lc->lc_refcnt) == UINT_MAX to detect underflow,
rather than conversion to int32_t. Maybe check-and-panic on overflow
too: if atomic_inc_32_nv(&lc->lc_refcnt) == 0, panic.
Problem: The ABI is different with and without LOCKDEBUG. The
structure member can't be conditional. I don't see a problem with
changing always adding another 32-bit (or even 64-bit) member to
struct localcount -- they already require O(nobj * ncpu) memory, so an
extra handful of bytes per object is inconsequential -- so I'd just
make it unconditional.
No need for #include <sys/atomic.h> in localcount.h. lc_refcnt member
should be volatile-qualified.
Home |
Main Index |
Thread Index |
Old Index