*/
struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name,
struct lttng_kernel_event *event_param,
- const struct lttng_event_desc *event_desc,
void *filter)
{
struct ltt_event *event;
if (!event)
goto cache_error;
event->chan = chan;
- event->desc = event_desc;
event->filter = filter;
event->id = chan->free_event_id++;
event->instrumentation = event_param->instrumentation;
smp_wmb();
switch (event_param->instrumentation) {
case LTTNG_KERNEL_TRACEPOINTS:
- ret = tracepoint_probe_register(name, event_desc->probe_callback,
- event);
+ event->desc = ltt_event_get(name);
+ if (!event->desc)
+ goto register_error;
+ ret = tracepoint_probe_register(name,
+ event->desc->probe_callback,
+ event);
if (ret)
goto register_error;
break;
case LTTNG_KERNEL_KPROBES:
- event->u.kprobe.kp.pre_handler = lttng_kprobes_handler_pre;
- event->u.kprobe.symbol_name =
- kzalloc(LTTNG_KPROBE_SYM_NAME_LEN * sizeof(char),
- GFP_KERNEL);
- if (!event->u.kprobe.symbol_name)
- goto register_error;
- memcpy(event->u.kprobe.symbol_name,
- event_param->u.kprobe.symbol_name,
- LTTNG_KPROBE_SYM_NAME_LEN * sizeof(char));
- event->u.kprobe.kp.symbol_name =
- event->u.kprobe.symbol_name;
- event->u.kprobe.kp.offset = event_param->u.kprobe.offset;
- event->u.kprobe.kp.addr = (void *) event_param->u.kprobe.addr;
- ret = register_kprobe(&event->u.kprobe.kp);
- if (ret) {
- kfree(event->u.kprobe.symbol_name);
+ ret = lttng_kprobes_register(name,
+ event_param->u.kprobe.symbol_name,
+ event_param->u.kprobe.offset,
+ event_param->u.kprobe.addr,
+ event);
+ if (ret)
goto register_error;
- }
break;
default:
WARN_ON_ONCE(1);
return event;
statedump_error:
- WARN_ON_ONCE(tracepoint_probe_unregister(name, event_desc->probe_callback,
- event));
+ WARN_ON_ONCE(tracepoint_probe_unregister(name,
+ event->desc->probe_callback,
+ event));
+ ltt_event_put(event->desc);
register_error:
kmem_cache_free(event_cache, event);
cache_error:
event);
if (ret)
return ret;
+ ltt_event_put(event->desc);
break;
case LTTNG_KERNEL_KPROBES:
- unregister_kprobe(&event->u.kprobe.kp);
- kfree(event->u.kprobe.symbol_name);
+ lttng_kprobes_unregister(event);
ret = 0;
break;
default: