From cc347c39cd5074fe15c54ff8c3d75817f07a1350 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 10 Feb 2022 15:41:58 -0500 Subject: [PATCH] uprobe: implement counter support Signed-off-by: Mathieu Desnoyers Change-Id: I46909ecc57a15d5f0c6b58e1f2f254219e55e01d --- src/probes/lttng-uprobes.c | 63 ++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/probes/lttng-uprobes.c b/src/probes/lttng-uprobes.c index 5463251a..bf4305f3 100644 --- a/src/probes/lttng-uprobes.c +++ b/src/probes/lttng-uprobes.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ int lttng_uprobes_event_handler_pre(struct uprobe_consumer *uc, struct pt_regs * struct lttng_uprobe_handler *uprobe_handler = container_of(uc, struct lttng_uprobe_handler, up_consumer); struct lttng_kernel_event_common *event = uprobe_handler->event; + struct lttng_kernel_channel_common *chan_common; struct lttng_kernel_probe_ctx lttng_probe_ctx = { .event = event, .interruptible = !lttng_regs_irqs_disabled(regs), @@ -39,28 +41,37 @@ int lttng_uprobes_event_handler_pre(struct uprobe_consumer *uc, struct pt_regs * unsigned long ip; } payload; - switch (event->type) { - case LTTNG_KERNEL_EVENT_TYPE_RECORDER: - { - struct lttng_kernel_event_recorder *event_recorder = - container_of(event, struct lttng_kernel_event_recorder, parent); - struct lttng_kernel_channel_buffer *chan = event_recorder->chan; - - if (unlikely(!LTTNG_READ_ONCE(chan->parent.session->active))) - return 0; - if (unlikely(!LTTNG_READ_ONCE(chan->parent.enabled))) - return 0; - break; - } - case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER: - break; - default: - WARN_ON_ONCE(1); - } - if (unlikely(!LTTNG_READ_ONCE(event->enabled))) - return 0; + goto end; + chan_common = lttng_kernel_get_chan_common_from_event_common(event); + if (chan_common) { + struct lttng_kernel_session *session = chan_common->session; + struct lttng_kernel_id_tracker_rcu *lf; + + if (unlikely(!LTTNG_READ_ONCE(session->active))) + goto end; + if (unlikely(!LTTNG_READ_ONCE(chan_common->enabled))) + goto end; + lf = lttng_rcu_dereference(session->pid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, current->tgid))) + goto end; + lf = lttng_rcu_dereference(session->vpid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, task_tgid_vnr(current)))) + goto end; + lf = lttng_rcu_dereference(session->uid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, from_kuid_munged(&init_user_ns, current_uid())))) + goto end; + lf = lttng_rcu_dereference(session->vuid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, from_kuid_munged(current_user_ns(), current_uid())))) + goto end; + lf = lttng_rcu_dereference(session->gid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, from_kgid_munged(&init_user_ns, current_gid())))) + goto end; + lf = lttng_rcu_dereference(session->vgid_tracker.p); + if (lf && likely(!lttng_id_tracker_lookup(lf, from_kgid_munged(current_user_ns(), current_gid())))) + goto end; + } switch (event->type) { case LTTNG_KERNEL_EVENT_TYPE_RECORDER: { @@ -94,9 +105,21 @@ int lttng_uprobes_event_handler_pre(struct uprobe_consumer *uc, struct pt_regs * event_notifier->notification_send(event_notifier, NULL, NULL, ¬if_ctx); break; } + case LTTNG_KERNEL_EVENT_TYPE_COUNTER: + { + struct lttng_kernel_event_counter *event_counter = + container_of(event, struct lttng_kernel_event_counter, parent); + + /* uprobes is invoked with preemption enabled. */ + rcu_read_lock_sched_notrace(); + (void) event_counter->chan->ops->event_counter_add(event_counter, 1); + rcu_read_unlock_sched_notrace(); + break; + } default: WARN_ON_ONCE(1); } +end: return 0; } -- 2.34.1