Re: [PATCH v7 00/14] rv: Add task latency over budget RV monitor
From: Gabriele Monaco
Date: Tue Oct 20 2026 - 11:38:46 EST
On Tue, 2026-10-20 at 03:18 +0800, Wen Yang wrote:
>
> > there's been a conversation at the LPC conference about completely migrating
> > RV
> > to BPF.
> > While we aren't sure of its feasibility yet, and it will take time, it's
> > something to keep in mind for new contributions.
> >
>
> Understood, and I have been following that direction. I spent the last
> few days reading the v2 "rv: Add support for BPF monitors" series in
> detail, so the comparison below is against that code rather than the
> general idea.
Great, I'm going to review your series when I get some time.
> > First of all, would dropping RV in-kernel support negatively affect your
> > current
> > workflow?
> >
> Yes, it would. Some concrete points, all from the current tree.
> (a) Event ABI. event_da_monitor / error_env_* in
> kernel/trace/rv/rv_trace.h are plain tracepoints, so trace-cmd,
> perf and anything else reading tracefs consume them today with no
> extra userspace. The BPF series delivers events through a ring
> buffer read by the rv tool, so the two backends are not
> interchangeable for existing consumers.
Good point, you might have noticed a similar discussion is happening also on the
RV-BPF thread. We cannot have the absolute same ABI in BPF, but we probably need
tracepoints or anything that can easily interact with other tracing tools.
> (b) Build and deployment. On the images we target, BPF is often not
> compiled in or not permitted:
> CONFIG_BPF_SYSCALL default n
> CONFIG_BPF_EVENTS needs BPF_SYSCALL
> CONFIG_DEBUG_INFO_BTF needed for CO-RE; depends on
> !DEBUG_INFO_REDUCED and pahole
> LOCKDOWN_BPF_READ_KERNEL disables the probe_read helpers
> Those are product constraints, not local build issues. tracefs/RV
> works in all of these configurations.
>
> There is also a size cost: BPF implies CONFIG_DEBUG_INFO_BTF, and
> .BTF is resident in RO_DATA and kept in the boot image - about
> 5 MB uncompressed on a full kernel, 1.2-1.6 MB compressed, plus
> roughly 25% per module with DEBUG_INFO_BTF_MODULES. On a
> 16-32 MB kernel partition that matters.
>
I've vaguely heard automotive folks saying they don't want to build BPF support
several times. Finally I get a proper technical reason!
Now I think this isn't easy to sort out, if that's a hard requirement, we are
probably going to need to keep in-kernel monitors around.
> (c) Timing semantics. tlob arms a per-task hrtimer with
> HRTIMER_MODE_REL_HARD. bpf_timer is fixed to
> HRTIMER_MODE_REL_SOFT and the verifier states "bpf_timer callbacks
> are never sleepable" . On PREEMPT_RT the callback runs in a
> threaded
> softirq, so the expiry time carries scheduler latency.
I haven't looked into this yet, but from what you say, the bpf_timers code
doesn't really support PREEMPT_RT.
> For a budget monitor the expiry time is the output, so this is a
> semantic change, not just overhead.
Well, the expiry time you get from an hrtimer is what you configured + some
system jitter. The jitter here is just going to be less predictable but is it
really the output you need in your monitor?
Or am I missing your point?
>
> What a BPF tlob would look like once those exist:
> - model: still tlob.dot, with rvgen -b extended to the hybrid
> backend;
> - state: one record per task in BPF_MAP_TYPE_TASK_STORAGE (or
> the per-object hash map the series has today), holding the
> state, the binding id and the budget;
Yeah I wasn't aware of BPF_MAP_TYPE_TASK_STORAGE before, I have a draft V3
(coming some time after the merge window) using that.
But I'd assume this type of storage would simplify the design of your monitor,
which is currently using a PER_OBJ just to add more things to a PER_TASK.
I'm going to keep in mind your use-case where you essentially extend the storage
(which is perfectly fine in BPF since we don't use the task_struct slot).
> - window: two uprobe programs attached to PATH:START and
> PATH:STOP, with the binding id and budget passed through the
> attach cookie or a small config map populated before load;
> - expiry: a bpf_timer in the same record, armed on state
> transitions and cancelled on STOP, submitting an error entry
> to the monitor's ringbuf;
> - output: the rv tool reads the ringbuf and prints it, and the
> reactor is linked in with bpf_linker as v2 already does.
>
> The DA engine and the ringbuf/reactor plumbing would carry over
> unchanged. The three missing pieces are the uprobe
> attach/configuration path, the timer and env handling in
> da_monitor_bpf.h, and the hybrid backend in rvgen.
>
> None of this argues against migrating. It argues that the BPF
> backend has to reach parity on (a)-(c) before the in-kernel path
> can be removed.
>
Thanks for taking time to assess this, it looks like the right direction.
Gabriele