From 3b466889afddd5d7a3339869aa6ac129173e241a Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 10 Feb 2022 15:36:48 -0500 Subject: [PATCH] kprobe: implement counter support Signed-off-by: Mathieu Desnoyers Change-Id: I8741ab89b03089ec34f17965749f84ddc23a2601 --- src/probes/lttng-kprobes.c | 62 +++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/probes/lttng-kprobes.c b/src/probes/lttng-kprobes.c index 20d78773..bb6decc0 100644 --- a/src/probes/lttng-kprobes.c +++ b/src/probes/lttng-kprobes.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -24,34 +25,44 @@ int lttng_kprobes_event_handler_pre(struct kprobe *p, struct pt_regs *regs) struct lttng_kernel_event_common_private *event_priv = container_of(p, struct lttng_kernel_event_common_private, u.kprobe.kp); struct lttng_kernel_event_common *event = event_priv->pub; + struct lttng_kernel_channel_common *chan_common; struct lttng_kernel_probe_ctx lttng_probe_ctx = { .event = event, .interruptible = !lttng_regs_irqs_disabled(regs), }; unsigned long data = (unsigned long) p->addr; - 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: { @@ -80,9 +91,18 @@ int lttng_kprobes_event_handler_pre(struct kprobe *p, struct pt_regs *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); + + (void) event_counter->chan->ops->event_counter_add(event_counter, 1); + break; + } default: WARN_ON_ONCE(1); } +end: return 0; } -- 2.34.1