X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fprobes%2Flttng-kretprobes.c;h=0fa6a1bfc29a62ee1e93461aaace18fa11bc34f2;hb=f5ffbd770ec2b9d1ac9b7059eb33a01432043bce;hp=2b5e91a2fadc1d110784c2955926ff1dfe3653ec;hpb=c2fb9c1c4f890840c02ad4b66a7cf69ae5dca6f7;p=lttng-modules.git diff --git a/src/probes/lttng-kretprobes.c b/src/probes/lttng-kretprobes.c index 2b5e91a2..0fa6a1bf 100644 --- a/src/probes/lttng-kretprobes.c +++ b/src/probes/lttng-kretprobes.c @@ -39,7 +39,7 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi, struct lttng_krp *lttng_krp = container_of(lttng_get_kretprobe(krpi), struct lttng_krp, krp); struct lttng_kernel_event_common *event = lttng_krp->event[type]; - struct lttng_probe_ctx lttng_probe_ctx = { + struct lttng_kernel_probe_ctx lttng_probe_ctx = { .event = event, .interruptible = !lttng_regs_irqs_disabled(regs), }; @@ -53,11 +53,11 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi, { struct lttng_kernel_event_recorder *event_recorder = container_of(event, struct lttng_kernel_event_recorder, parent); - struct lttng_channel *chan = event_recorder->chan; + struct lttng_kernel_channel_buffer *chan = event_recorder->chan; - if (unlikely(!LTTNG_READ_ONCE(chan->session->active))) + if (unlikely(!LTTNG_READ_ONCE(chan->parent.session->active))) return 0; - if (unlikely(!LTTNG_READ_ONCE(chan->enabled))) + if (unlikely(!LTTNG_READ_ONCE(chan->parent.enabled))) return 0; break; } @@ -74,8 +74,8 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi, { struct lttng_kernel_event_recorder *event_recorder = container_of(event, struct lttng_kernel_event_recorder, parent); - struct lttng_channel *chan = event_recorder->chan; - struct lib_ring_buffer_ctx ctx; + struct lttng_kernel_channel_buffer *chan = event_recorder->chan; + struct lttng_kernel_ring_buffer_ctx ctx; int ret; payload.ip = (unsigned long) lttng_get_kretprobe(krpi)->kp.addr; @@ -86,8 +86,7 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi, ret = chan->ops->event_reserve(&ctx); 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_write(&ctx, &payload, sizeof(payload), lttng_alignof(payload)); chan->ops->event_commit(&ctx); break; } @@ -112,8 +111,19 @@ int lttng_kretprobes_handler_exit(struct kretprobe_instance *krpi, return _lttng_kretprobes_handler(krpi, regs, EVENT_EXIT); } -static const struct lttng_kernel_type_common *event_type = - lttng_kernel_static_type_integer_from_type(unsigned long, __BYTE_ORDER, 16); +static const struct lttng_kernel_event_field *event_fields[] = { + lttng_kernel_static_event_field("ip", + lttng_kernel_static_type_integer_from_type(unsigned long, __BYTE_ORDER, 16), + false, false, false), + lttng_kernel_static_event_field("parent_ip", + lttng_kernel_static_type_integer_from_type(unsigned long, __BYTE_ORDER, 16), + false, false, false), +}; + +static const struct lttng_kernel_tracepoint_class tp_class = { + .nr_fields = ARRAY_SIZE(event_fields), + .fields = event_fields, +}; /* * Create event description @@ -122,8 +132,6 @@ static int lttng_create_kprobe_event(const char *name, struct lttng_kernel_event_recorder *event_recorder, enum lttng_kretprobe_type type) { - const struct lttng_kernel_event_field **fieldp_array; - struct lttng_kernel_event_field *field; struct lttng_kernel_event_desc *desc; char *alloc_name; size_t name_len; @@ -151,43 +159,12 @@ int lttng_create_kprobe_event(const char *name, struct lttng_kernel_event_record strcpy(alloc_name, name); strcat(alloc_name, suffix); desc->event_name = alloc_name; - desc->nr_fields = 2; - fieldp_array = kzalloc(desc->nr_fields * sizeof(struct lttng_kernel_event_field *), GFP_KERNEL); - if (!fieldp_array) { - ret = -ENOMEM; - goto error_fieldp_array; - } - desc->fields = fieldp_array; - - field = kzalloc(sizeof(struct lttng_kernel_event_field), GFP_KERNEL); - if (!field) { - ret = -ENOMEM; - goto error_field0; - } - field->name = "ip"; - field->type = event_type; - desc->fields[0] = field; - - field = kzalloc(sizeof(struct lttng_kernel_event_field), GFP_KERNEL); - if (!field) { - ret = -ENOMEM; - goto error_field1; - } - field->name = "parent_ip"; - field->type = event_type; - desc->fields[1] = field; - + desc->tp_class = &tp_class; desc->owner = THIS_MODULE; event_recorder->priv->parent.desc = desc; return 0; -error_field1: - kfree(desc->fields[0]); -error_field0: - kfree(fieldp_array); -error_fieldp_array: - kfree(desc->event_name); error_str: kfree(desc); return ret; @@ -268,15 +245,9 @@ register_error: name_error: kfree(lttng_krp); krp_error: - kfree(event_recorder_exit->priv->parent.desc->fields[0]); - kfree(event_recorder_exit->priv->parent.desc->fields[1]); - kfree(event_recorder_exit->priv->parent.desc->fields); kfree(event_recorder_exit->priv->parent.desc->event_name); kfree(event_recorder_exit->priv->parent.desc); event_exit_error: - kfree(event_recorder_entry->priv->parent.desc->fields[0]); - kfree(event_recorder_entry->priv->parent.desc->fields[1]); - kfree(event_recorder_entry->priv->parent.desc->fields); kfree(event_recorder_entry->priv->parent.desc->event_name); kfree(event_recorder_entry->priv->parent.desc); error: @@ -309,9 +280,6 @@ void _lttng_kretprobes_release(struct kref *kref) void lttng_kretprobes_destroy_private(struct lttng_kernel_event_recorder *event_recorder) { - kfree(event_recorder->priv->parent.desc->fields[0]); - kfree(event_recorder->priv->parent.desc->fields[1]); - kfree(event_recorder->priv->parent.desc->fields); kfree(event_recorder->priv->parent.desc->event_name); kfree(event_recorder->priv->parent.desc); kref_put(&event_recorder->priv->parent.u.kretprobe.lttng_krp->kref_alloc,