X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fprobes%2Flttng-kretprobes.c;h=b3e9f6272e5a27df400d5d3909beac64cef4f959;hb=0c023c019b5c133847347f3da005dbb3288312ab;hp=24cb52e4af9c6885451cf7d6463a959d45a8207e;hpb=484ec2179e14ae9272a7ad3d1820c837136fd144;p=deliverable%2Flttng-modules.git diff --git a/src/probes/lttng-kretprobes.c b/src/probes/lttng-kretprobes.c index 24cb52e4..b3e9f627 100644 --- a/src/probes/lttng-kretprobes.c +++ b/src/probes/lttng-kretprobes.c @@ -43,32 +43,48 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi, .event = event, .interruptible = !lttng_regs_irqs_disabled(regs), }; - struct lttng_channel *chan = event->chan; - struct lib_ring_buffer_ctx ctx; + struct lttng_event_container *container = event->container; int ret; struct { unsigned long ip; unsigned long parent_ip; } payload; - if (unlikely(!LTTNG_READ_ONCE(chan->session->active))) + if (unlikely(!LTTNG_READ_ONCE(container->session->active))) return 0; - if (unlikely(!LTTNG_READ_ONCE(chan->enabled))) + if (unlikely(!LTTNG_READ_ONCE(container->enabled))) return 0; if (unlikely(!LTTNG_READ_ONCE(event->enabled))) return 0; - payload.ip = (unsigned long) lttng_get_kretprobe(krpi)->kp.addr; - payload.parent_ip = (unsigned long) krpi->ret_addr; + switch (container->type) { + case LTTNG_EVENT_CONTAINER_CHANNEL: + { + struct lttng_channel *chan = lttng_event_container_get_channel(container); + struct lib_ring_buffer_ctx ctx; - lib_ring_buffer_ctx_init(&ctx, chan->chan, <tng_probe_ctx, sizeof(payload), - lttng_alignof(payload), -1); - ret = chan->ops->event_reserve(&ctx, event->id); - if (ret < 0) - return 0; - lib_ring_buffer_align_ctx(&ctx, lttng_alignof(payload)); - chan->ops->event_write(&ctx, &payload, sizeof(payload)); - chan->ops->event_commit(&ctx); + payload.ip = (unsigned long) lttng_get_kretprobe(krpi)->kp.addr; + payload.parent_ip = (unsigned long) krpi->ret_addr; + + lib_ring_buffer_ctx_init(&ctx, chan->chan, <tng_probe_ctx, sizeof(payload), + lttng_alignof(payload), -1); + ret = chan->ops->event_reserve(&ctx, event->id); + if (ret < 0) + return 0; + lib_ring_buffer_align_ctx(&ctx, lttng_alignof(payload)); + chan->ops->event_write(&ctx, &payload, sizeof(payload)); + chan->ops->event_commit(&ctx); + break; + } + case LTTNG_EVENT_CONTAINER_COUNTER: + { + struct lttng_counter *counter = lttng_event_container_get_counter(container); + size_t index = event->id; + + (void) counter->ops->counter_add(counter->counter, &index, 1); + break; + } + } return 0; }