linux-trace-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Gabriele Monaco <gmonaco@redhat.com>
To: Nam Cao <namcao@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>,
	linux-trace-kernel@vger.kernel.org,
		linux-kernel@vger.kernel.org, john.ogness@linutronix.de
Subject: Re: [PATCH v3 13/22] rv: Add support for LTL monitors
Date: Wed, 16 Apr 2025 15:05:12 +0200	[thread overview]
Message-ID: <c152e0f5f431739eb2aa5fb78ef6e17521f3826b.camel@redhat.com> (raw)
In-Reply-To: <20250416115658.AkFAts-B@linutronix.de>



On Wed, 2025-04-16 at 13:56 +0200, Nam Cao wrote:
> On Wed, Apr 16, 2025 at 11:34:53AM +0200, Gabriele Monaco wrote:
> > On Wed, 2025-04-16 at 08:51 +0200, Nam Cao wrote:
> > >  #endif /* CONFIG_DA_MON_EVENTS_ID */
> > > +#if CONFIG_LTL_MON_EVENTS_ID
> > > +TRACE_EVENT(event_ltl_monitor_id,
> > > +
> > > +	TP_PROTO(struct task_struct *task, char *states, char
> > > *atoms, char *next),
> > > +
> > > +	TP_ARGS(task, states, atoms, next),
> > > +
> > > +	TP_STRUCT__entry(
> > > +		__string(comm, task->comm)
> > > +		__field(pid_t, pid)
> > > +		__string(states, states)
> > > +		__string(atoms, atoms)
> > > +		__string(next, next)
> > > +	),
> > > +
> > > +	TP_fast_assign(
> > > +		__assign_str(comm);
> > > +		__entry->pid = task->pid;
> > > +		__assign_str(states);
> > > +		__assign_str(atoms);
> > > +		__assign_str(next);
> > > +	),
> > > +
> > > +	TP_printk("%s[%d]: (%s) x (%s) -> (%s)",
> > > __get_str(comm),
> > > __entry->pid, __get_str(states),
> > > +		  __get_str(atoms), __get_str(next))
> > > +);
> > > +
> > > +TRACE_EVENT(error_ltl_monitor_id,
> > > +
> > > +	TP_PROTO(struct task_struct *task),
> > > +
> > > +	TP_ARGS(task),
> > > +
> > > +	TP_STRUCT__entry(
> > > +		__string(comm, task->comm)
> > > +		__field(pid_t, pid)
> > > +	),
> > > +
> > > +	TP_fast_assign(
> > > +		__assign_str(comm);
> > > +		__entry->pid = task->pid;
> > > +	),
> > > +
> > > +	TP_printk("%s[%d]: violation detected", __get_str(comm),
> > 
> > In your workflow you're probably using events and errors together,
> > but
> > wouldn't it help printing the atoms together with the violation
> > detected?
> > At least to give a clue on the error in case the user doesn't want
> > to
> > see the entire trace (which might be needed for a full debug
> > though).
> > 
> > The same could be said from reactors, the user doesn't have much
> > information to infer what went wrong.
> 
> Actually my intention for the "event" tracepoints are only for
> debugging
> the monitor itself. I don't want to bother users with the Büchi
> automaton,
> because that's implementation details.
> 
> The "error" tracepoints should be enough for identifying problems
> with
> realtime applications. Because errors from the monitors are
> unambiguous:
> 
>   - pagefault monitor: error means an RT task is raising pagefault
>   - sleep monitor: error means an RT task is delayed unboundedly
> 
> That and a stacktrace (e.g. from perf) is enough to understand the
> problem.
> That was all I need to identifying problems with pipewire using the
> monitors.
> 
> In the future, we can have other monitors whose warnings are
> ambiguous, and
> a more detailed error message will be necessary. But for now, I think
> we
> can keep it simple.
> 

Mmh alright, makes sense, you can ignore it then.

> > > +def abbreviate_atoms(atoms: list[str]) -> list[str]:
> > > +    abbrs = list()
> > > +    for atom in atoms:
> > > +        size = 1
> > > +        while True:
> > > +            abbr = atom[:size]
> > > +            if sum(a.startswith(abbr) for a in atoms) == 1:
> > > +                break
> > > +            size += 1
> > > +        abbrs.append(abbr.lower())
> > > +    return abbrs
> > 
> > I get this is just a matter of preference, so feel free to ignore
> > my
> > suggestion.
> > This abbreviation algorithm doesn't work too well with atoms
> > starting
> > with the same substring and can produce some unexpected result:
> > 
> > LTL_BLOCK_ON_RT_MUTEX:                b,
> > LTL_KERNEL_THREAD:                    ke,
> > LTL_KTHREAD_SHOULD_STOP:              kt,
> > LTL_NANOSLEEP:                        n,
> > LTL_PI_FUTEX:                         p,
> > LTL_RT:                               r,
> > LTL_SLEEP:                            s,
> > LTL_TASK_IS_MIGRATION:                task_is_m,
> > LTL_TASK_IS_RCU:                      task_is_r,
> > LTL_WAKE:                             wa,
> > LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO:    woken_by_e,
> > LTL_WOKEN_BY_HARDIRQ:                 woken_by_h,
> > LTL_WOKEN_BY_NMI:                     woken_by_n,
> > 
> > "woken_by_*" and "task_is_*" atom can get unnecessarily long and
> > while reading "kt" I might think about kernel_thread.
> > 
> > I was thinking about something like:
> > 
> > LTL_BLOCK_ON_RT_MUTEX:                b_o_r_m
> > LTL_KERNEL_THREAD:                    k_t
> > LTL_KTHREAD_SHOULD_STOP:              k_s_s
> > LTL_NANOSLEEP:                        n
> > LTL_PI_FUTEX:                         p_f
> > LTL_RT:                               r
> > LTL_SLEEP:                            s
> > LTL_TASK_IS_MIGRATION:                t_i_m
> > LTL_TASK_IS_RCU:                      t_i_r
> > LTL_WAKE:                             w
> > LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO:    w_b_e_o_h_p
> > LTL_WOKEN_BY_HARDIRQ:                 w_b_h
> > LTL_WOKEN_BY_NMI:                     w_b_n
> > 
> > or even
> > 
> > LTL_BLOCK_ON_RT_MUTEX:                b_m
> > LTL_KERNEL_THREAD:                    k_t
> > LTL_KTHREAD_SHOULD_STOP:              k_s_s
> > LTL_NANOSLEEP:                        n
> > LTL_PI_FUTEX:                         p_f
> > LTL_RT:                               r
> > LTL_SLEEP:                            s
> > LTL_TASK_IS_MIGRATION:                t_m
> > LTL_TASK_IS_RCU:                      t_r
> > LTL_WAKE:                             w
> > LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO:    w_e_h_p
> > LTL_WOKEN_BY_HARDIRQ:                 w_h
> > LTL_WOKEN_BY_NMI:                     w_n
> > 
> > I used the following code to come up with this:
> > 
> > def abbreviate_atoms(atoms: list[str]) -> list[str]:
> >     # completely arbitrary..
> >     skip = [ "is", "by", "or", "and" ]
> >     def abbr (n, s):
> >         return '_'.join(word[:n] for word in s.lower().split('_')
> > if word not in skip)
> >     for n in range(1, 32):
> >         abbrs = [abbr(n, a) for a in atoms]
> >         if len(abbrs) == len(set(abbrs)):
> >             return abbrs
> > 
> > Which could even be tuned to use 2 letters per block instead of 1
> > (improving readability by a lot actually)..
> > 'bl_on_rt_mu', 'ke_th', 'kt_sh_st', 'na', 'pi_fu', 'rt', 'sl',
> > 'ta_mi',
> > 'ta_rc', 'wa', 'wo_eq_hi_pr', 'wo_ha', 'wo_nm'
> > 
> > What do you think?
> 
> Yes, this would be very nice. But as mentioned, this is mainly for
> debugging the monitors, not for end users. Therefore I don't want to
> spend
> too much energy on it.
> 
> Let me see how "nice" we can make it without spending too many hours.
> Thanks for the suggestion!
> 

Sure, do what you see fit.
From my point of view the monitors (19-20/22) and synthesis look good.

Reviewed-by: Gabriele Monaco <gmonaco@redhat.com>

Thanks,
Gabriele

  reply	other threads:[~2025-04-16 13:05 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-16  6:51 [PATCH v3 00/22] RV: Linear temporal logic monitors for RT application Nam Cao
2025-04-16  6:51 ` [PATCH v3 01/22] rv: Add #undef TRACE_INCLUDE_FILE Nam Cao
2025-04-16  6:51 ` [PATCH v3 02/22] printk: Make vprintk_deferred() public Nam Cao
2025-04-16  6:51 ` [PATCH v3 03/22] panic: Add vpanic() Nam Cao
2025-04-16  6:51 ` [PATCH v3 04/22] rv: Let the reactors take care of buffers Nam Cao
2025-04-16  6:51 ` [PATCH v3 05/22] verification/dot2k: Make a separate dot2k_templates/Kconfig_container Nam Cao
2025-04-16  6:51 ` [PATCH v3 06/22] verification/dot2k: Remove __buff_to_string() Nam Cao
2025-04-16  6:51 ` [PATCH v3 07/22] verification/dot2k: Replace is_container() hack with subparsers Nam Cao
2025-04-16  6:51 ` [PATCH v3 08/22] rv: rename CONFIG_DA_MON_EVENTS to CONFIG_RV_MON_EVENTS Nam Cao
2025-04-16  6:51 ` [PATCH v3 09/22] verification/dot2k: Prepare the frontend for LTL inclusion Nam Cao
2025-04-16 13:21   ` Gabriele Monaco
2025-04-16  6:51 ` [PATCH v3 10/22] Documentation/rv: Prepare monitor synthesis document " Nam Cao
2025-04-16  6:51 ` [PATCH v3 11/22] verification/rvgen: Restructure the templates files Nam Cao
2025-04-16  6:51 ` [PATCH v3 12/22] verification/rvgen: Restructure the classes to prepare for LTL inclusion Nam Cao
2025-04-16  6:51 ` [PATCH v3 13/22] rv: Add support for LTL monitors Nam Cao
2025-04-16  9:34   ` Gabriele Monaco
2025-04-16 11:56     ` Nam Cao
2025-04-16 13:05       ` Gabriele Monaco [this message]
2025-04-16 14:13       ` Gabriele Monaco
2025-04-16 14:15         ` Nam Cao
2025-04-16 14:29   ` Gabriele Monaco
2025-04-16  6:51 ` [PATCH v3 14/22] rv: Add rtapp container monitor Nam Cao
2025-04-16  7:32   ` Gabriele Monaco
2025-04-17  5:42     ` Nam Cao
2025-04-16  6:51 ` [PATCH v3 15/22] x86/tracing: Remove redundant trace_pagefault_key Nam Cao
2025-04-16  6:51 ` [PATCH v3 16/22] x86/tracing: Move page fault trace points to generic Nam Cao
2025-04-16  6:51 ` [PATCH v3 17/22] arm64: mm: Add page fault trace points Nam Cao
2025-04-16  6:51 ` [PATCH v3 18/22] riscv: " Nam Cao
2025-04-16  6:51 ` [PATCH v3 19/22] rv: Add rtapp_pagefault monitor Nam Cao
2025-04-16  6:51 ` [PATCH v3 20/22] rv: Add rtapp_sleep monitor Nam Cao
2025-04-16  6:51 ` [PATCH v3 21/22] rv: Add documentation for rtapp monitor Nam Cao
2025-04-16  8:56   ` Gabriele Monaco
2025-04-16  6:51 ` [PATCH v3 22/22] rv: Allow to configure the number of per-task monitor Nam Cao
2025-08-10 21:12 ` [PATCH v3 00/22] RV: Linear temporal logic monitors for RT application patchwork-bot+linux-riscv

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c152e0f5f431739eb2aa5fb78ef6e17521f3826b.camel@redhat.com \
    --to=gmonaco@redhat.com \
    --cc=john.ogness@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=namcao@linutronix.de \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).