Re: [PATCH 0/5] locking/qspinlock: Add contended_release tracepoint
Juergen Gross <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel,dev.linux.lists.virtualization,org.kernel.vger.kvm,org.kernel.vger.linux-arch,org.kernel.vger.linux-hyperv,org.kernel.vger.linux-kernel,org.kernel.vger.linux-mips,org.kernel.vger.linux-trace-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 04.08.26 09:15, Dmitry Ilvokhin wrote: > The contended_release tracepoint landed in v7.2-rc2 for sleeping locks > (4f070ccb4dc4 "locking: Add contended_release tracepoint to sleepable > locks"). Spinlock support was dropped from that series. This one adds it > for queued spinlocks. > > The existing contention_begin/contention_end tracepoints fire on the > waiter side. The holder's identity and stack can be captured at > contention_begin time (e.g. perf lock contention --lock-owner), but only > for locks with an owner field to read: mutex and rwsem. qspinlock has > none, so a contended spinlock cannot be attributed to its holder at all. > Even where the owner can be read, it reflects the holder's state when a > waiter arrives, not when the lock is released. > > This series adds a contended_release tracepoint to qspinlock that fires > on the holder side when a lock with waiters is released. This provides: > > - Hold time estimation: when the holder's own acquisition was > contended, its contention_end (acquisition) and contended_release > can be correlated to measure how long the lock was held under > contention. > > - The holder's stack at release time, which for spinlocks is not > available by any other means. > > The unlock path might be quite hot, so the tracepoint is made as cheap > as possible, to keep it usable in production: > > - x86 with PARAVIRT_SPINLOCKS=y, which is what distributions ship, swaps > the unlock implementation via static_call() when the tracepoint is > enabled. The disabled path is byte-identical to today's: the same > inline movb, no NOP and no call. > > - Everywhere else a static-branch check is compiled into > queued_spin_unlock(). On x86_64 that is a single NOP on the executed > path, with the call to the traced helper emitted out of line and > unreachable while the tracepoint is off. On other architectures a few > more instructions to manage a stack frame land on the executed path > too, so the generic path sits behind > CONFIG_QUEUED_SPINLOCKS_TRACE_CONTENDED_RELEASE (default n). > > Costs and measurements are in the individual changelogs. Briefly, no > throughput or latency change is measurable on either x86_64 or arm64 > with QUEUED_SPINLOCKS_TRACE_CONTENDED_RELEASE=y. > > Tested: x86_64 with PARAVIRT_SPINLOCKS=y and =n, arm64, tracepoint on > and off, disassembly checked in both states, locktorture with tracepoint > on and off. > > Not covered: qrwlock, and architectures with fully custom qspinlock > implementations (e.g. PowerPC). The stack frame managing instructions on > arm64 should be avoidable, but that is not done in this patchset. > > Patch 1 is Peter's draft from [1] and is missing his Signed-off-by. > Peter, please add it if you are happy with the patch. > > [1]: https://lore.kernel.org/all/[email protected]/ > > Dmitry Ilvokhin (4): > locking: Factor out queued_spin_release() > locking/qspinlock: Add contended_release tracepoint > tracing/lock: Use TRACE_EVENT_FN() for contended_release > x86/paravirt: Trace contended_release on unlock > > Peter Zijlstra (1): > x86/paravirt: Use static_call() for the paravirt spinlock ops > > arch/mips/include/asm/spinlock.h | 6 +-- > arch/x86/hyperv/hv_spinlock.c | 4 +- > arch/x86/include/asm/cpufeatures.h | 1 - > arch/x86/include/asm/paravirt-spinlock.h | 21 +++++--- > arch/x86/kernel/kvm.c | 5 +- > arch/x86/kernel/paravirt-spinlocks.c | 63 +++++++++++++++++++++--- > arch/x86/kernel/static_call.c | 27 ++++++++++ > arch/x86/xen/spinlock.c | 5 +- > include/asm-generic/qspinlock.h | 38 ++++++++++++-- > include/trace/events/lock.h | 10 +++- > kernel/Kconfig.locks | 20 ++++++++ > kernel/locking/mutex.c | 4 ++ > kernel/locking/qspinlock.c | 22 +++++++++ > tools/arch/x86/include/asm/cpufeatures.h | 1 - > 14 files changed, 195 insertions(+), 32 deletions(-) > > > base-commit: 5e601ab3615c86be7c4068ce992f94654693a032 For the whole series: Acked-by: Juergen Gross <[email protected]> I'm considering some followup patches replacing the remaining paravirt cases not covered by CONFIG_PARAVIRT_XXL with static_call(), too. This will allow to drop the 32-bit paravirt patching completely. :-) The queued_spin_unlock() hook was the main reason I didn't do that yet. Juergen
OpenPGP_0xB0DE9DD628BF132F.asc
(application/pgp-keys, 3.6 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 kt+z4drzFUyEjLM1vVvIMjkUoJs= =eeAB -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc
(application/pgp-signature, 495 B)
-----BEGIN PGP SIGNATURE----- wsB5BAABCAAjFiEEhRJncuj2BJSl0Jf3sN6d1ii/Ey8FAmpxm2MFAwAAAAAACgkQsN6d1ii/Ey+9 Agf+IWx5eXJ7mO6oP+n4rxGw46J5o8kxhJQXckuPe4UqJ4KZp2eDhMwkS/QfmUPt+V4ojeOdZa1V t5qalPRfTCjVf4ZjarkTErmzJEGtvM5UFOPA1nJBFIGlV8VkDzRzYXof0c0ySuzecPKbh7pY3vUz VAUq0Q4EI6/WZY9jlKSQPoVjFFnIaWF5MoA2mGETIaZNXIBKSb/JmKfyRKxoY+u6IIeXrzl3wnIp VRnKsfQY36idWLXCtgq72WaTEl8HBUfpg0cTNGX0Fs6DZ4wH41e/KenwyCtV/RoC9vMyVKhvshqA JQOnAn0AVEbRYSsu6FmlqT/H4mCv6HrNanDhE76nUA== =gT7a -----END PGP SIGNATURE-----