Re: [PATCH v4 02/10] user_events: Add minimal support for trace_event into ftrace

From: Steven Rostedt
Date: Tue Nov 09 2021 - 14:25:12 EST


On Tue, 9 Nov 2021 11:08:44 -0800
Beau Belgrave <beaub@xxxxxxxxxxxxxxxxxxx> wrote:

> We need strings to be able to be emitted and recorded in eBPF, perf and
> ftrace. So I would rather go after a solution that lets us keep these in
> the ring buffers, even if it means a perf hit.
>
> Guess what's left is to where the best place to check is, checking in
> the filter with unsafe flags would let us keep most of the perf (we just
> check the undersize case, 1 branch). When these unsafe types are
> filtered then a perf tax is imposed to keep things safe.
>
> It sounded like Steven wanted to think about this a bit, so I'll wait a
> bit before poking again for consensus :)
>
> Do you have any strong feelings about where it goes?

IIUC, the writing into the trace event is done via one big blob, correct?

That is this:

+ if (likely(atomic_read(&tp->key.enabled) > 0)) {
+ struct tracepoint_func *probe_func_ptr;
+ user_event_func_t probe_func;
+ void *tpdata;
+ void *kdata;
+ u32 datalen;
+
+ kdata = kmalloc(i->count, GFP_KERNEL);
+
+ if (unlikely(!kdata))
+ return -ENOMEM;
+
+ datalen = copy_from_iter(kdata, i->count, i);
+
+ rcu_read_lock_sched();
+
+ probe_func_ptr = rcu_dereference_sched(tp->funcs);
+
+ if (probe_func_ptr) {
+ do {
+ probe_func = probe_func_ptr->func;
+ tpdata = probe_func_ptr->data;
+ probe_func(user, kdata, datalen, tpdata);
+ } while ((++probe_func_ptr)->func);
+ }
+
+ rcu_read_unlock_sched();
+
+ kfree(kdata);

So we really are just interested in making sure that the output is correct?

That is, the reading of the trace file?

-- Steve