X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-events.h;h=94ce295b58cb272f69d9cbe66bb665d99c0eced1;hb=3db41b2c5d1fef77ca065dc8ef7f0fdd9c17cf32;hp=304bcb69989b406d8c3b02d76f3320ca5321324c;hpb=f71ecafa46ad2ba9998ba6e4c425645d988d7f8c;p=lttng-modules.git diff --git a/ltt-events.h b/ltt-events.h index 304bcb69..94ce295b 100644 --- a/ltt-events.h +++ b/ltt-events.h @@ -119,6 +119,17 @@ struct lttng_event_field { struct lttng_type type; }; +/* + * We need to keep this perf counter field separately from struct + * lttng_ctx_field because cpu hotplug needs fixed-location addresses. + */ +struct lttng_perf_counter_field { + struct notifier_block nb; + int hp_enable; + struct perf_event_attr *attr; + struct perf_event **e; /* per-cpu array */ +}; + struct lttng_ctx_field { struct lttng_event_field event_field; size_t (*get_size)(size_t offset); @@ -126,12 +137,7 @@ struct lttng_ctx_field { struct lib_ring_buffer_ctx *ctx, struct ltt_channel *chan); union { - struct { - struct perf_event **e; /* per-cpu array */ - struct notifier_block nb; - int hp_enable; - struct perf_event_attr *attr; - } perf_counter; + struct lttng_perf_counter_field *perf_counter; } u; void (*destroy)(struct lttng_ctx_field *field); }; @@ -157,6 +163,8 @@ struct lttng_probe_desc { struct list_head head; /* chain registered probes */ }; +struct lttng_krp; /* Kretprobe handling */ + /* * ltt_event structure is referred to by the tracing fast path. It must be * kept small. @@ -174,6 +182,10 @@ struct ltt_event { struct kprobe kp; char *symbol_name; } kprobe; + struct { + struct lttng_krp *lttng_krp; + char *symbol_name; + } kretprobe; struct { char *symbol_name; } ftrace; @@ -210,6 +222,13 @@ struct ltt_channel_ops { int (*is_disabled)(struct channel *chan); }; +struct ltt_transport { + char *name; + struct module *owner; + struct list_head node; + struct ltt_channel_ops ops; +}; + struct ltt_channel { unsigned int id; struct channel *chan; /* Channel buffers */ @@ -221,6 +240,7 @@ struct ltt_channel { unsigned int free_event_id; /* Next event ID to allocate */ struct list_head list; /* Channel list */ struct ltt_channel_ops *ops; + struct ltt_transport *transport; int header_type; /* 0: unset, 1: compact, 2: large */ int metadata_dumped:1; }; @@ -238,13 +258,6 @@ struct ltt_session { int metadata_dumped:1; }; -struct ltt_transport { - char *name; - struct module *owner; - struct list_head node; - struct ltt_channel_ops ops; -}; - struct ltt_session *ltt_session_create(void); int ltt_session_enable(struct ltt_session *session); int ltt_session_disable(struct ltt_session *session); @@ -344,6 +357,38 @@ void lttng_kprobes_destroy_private(struct ltt_event *event) } #endif +#ifdef CONFIG_KRETPROBES +int lttng_kretprobes_register(const char *name, + const char *symbol_name, + uint64_t offset, + uint64_t addr, + struct ltt_event *event_entry, + struct ltt_event *event_exit); +void lttng_kretprobes_unregister(struct ltt_event *event); +void lttng_kretprobes_destroy_private(struct ltt_event *event); +#else +static inline +int lttng_kretprobes_register(const char *name, + const char *symbol_name, + uint64_t offset, + uint64_t addr, + struct ltt_event *event_entry, + struct ltt_event *event_exit) +{ + return -ENOSYS; +} + +static inline +void lttng_kretprobes_unregister(struct ltt_event *event) +{ +} + +static inline +void lttng_kretprobes_destroy_private(struct ltt_event *event) +{ +} +#endif + #ifdef CONFIG_DYNAMIC_FTRACE int lttng_ftrace_register(const char *name, const char *symbol_name, @@ -370,6 +415,8 @@ void lttng_ftrace_destroy_private(struct ltt_event *event) } #endif +int lttng_calibrate(struct lttng_kernel_calibrate *calibrate); + extern const struct file_operations lttng_tracepoint_list_fops; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))