On Fri, Mar 3, 2023 at 4:53 PM Andreas Gruenbacher <[email protected]> wrote:
> diff --git a/dlm_controld/plock.c b/dlm_controld/plock.c
> index 39bdd1f6..588bcaaa 100644
> --- a/dlm_controld/plock.c
> +++ b/dlm_controld/plock.c
> @@ -8,6 +8,7 @@
>
> #include "dlm_daemon.h"
> #include <linux/dlm_plock.h>
> +#include <sys/sdt.h>
>
> /* FIXME: remove this once everyone is using the version of
> * dlm_plock.h which defines it */
> @@ -211,6 +212,11 @@ static uint64_t dt_usec(const struct timeval *start,
> const struct timeval *stop)
> static void plock_print_start_waiter(const struct lockspace *ls,
> struct lock_waiter *w)
> {
> + const struct dlm_plock_info *info = &w->info;
> +
> + DTRACE_PROBE7(dlm_controld, plock_wait_begin, info->number, w,
> info->start,
> + info->end, info->nodeid, info->pid, info->owner);
> +
> log_plock(ls, "state waiter start %llx %p %llx-%llx %d/%u/%llx",
> (unsigned long long)w->info.number,
> w,
An additional question I have about those events is which information
to log. We need to be able to identify which inode the request is for
(info->number), the locking range (info->start and info->end), whether
it is read or write lock, and which context in the kernel the request
refers to (this seems to be info->owner, but I'm not entirely sure
about that). The pid may be interesting as well, but are w or
info->nodeid really useful? We should try to avoid exposing
unnecessary implementation details like the addresses of objects
inside dlm_controld.
> @@ -223,6 +229,10 @@ static void plock_print_start_waiter(const struct
> lockspace *ls,
> static void plock_print_end_waiter(const struct lockspace *ls,
> const struct lock_waiter *w)
> {
> + const struct dlm_plock_info *info = &w->info;
> +
> + DTRACE_PROBE2(dlm_controld, plock_wait_end, info->number, w);
> +
> log_plock(ls, "state waiter end %llx %p",
> (unsigned long long)w->info.number, w);
> }
> @@ -230,6 +240,9 @@ static void plock_print_end_waiter(const struct lockspace
> *ls,
> static void plock_print_start_plock(const struct lockspace *ls, uint64_t
> number,
> const struct posix_lock *po)
> {
> + DTRACE_PROBE8(dlm_controld, plock_lock_begin, number, po, po->ex,
> po->start,
> + po->end, po->nodeid, po->pid, po->owner);
> +
> log_plock(ls, "state plock start %llx %p %s %llx-%llx %d/%u/%llx",
> (unsigned long long)number,
> po,
> @@ -243,6 +256,8 @@ static void plock_print_start_plock(const struct
> lockspace *ls, uint64_t number,
> static void plock_print_end_plock(const struct lockspace *ls, uint64_t
> number,
> const struct posix_lock *po)
> {
> + DTRACE_PROBE1(dlm_controld, pock_lock_end, po);
> +
> log_plock(ls, "state plock end %llx %p",
> (unsigned long long)number, po);
> }
> --
> 2.39.0
>
Thanks,
Andreas