X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Fevents.h;h=09ab3cf21b544133832cc9bc09b424ac85b69ccc;hb=754d534a316149de6b19f5f0d2a1dd3b246bd1c9;hp=4c94116eec236470bebbfe4de3815a228dae1b3d;hpb=21f58fb7e62071dae3ddf13817631749bcab4e00;p=lttng-modules.git diff --git a/include/lttng/events.h b/include/lttng/events.h index 4c94116e..09ab3cf2 100644 --- a/include/lttng/events.h +++ b/include/lttng/events.h @@ -10,12 +10,12 @@ #ifndef _LTTNG_EVENTS_H #define _LTTNG_EVENTS_H -#include #include #include #include #include #include +#include #include #include #include @@ -170,6 +170,7 @@ struct lttng_perf_counter_field { struct lttng_probe_ctx { struct lttng_event *event; + struct lttng_event_notifier *event_notifier; // Not sure if we will ever need it. uint8_t interruptible; }; @@ -212,6 +213,7 @@ struct lttng_event_desc { const struct lttng_event_field *fields; /* event payload */ unsigned int nr_fields; struct module *owner; + void *event_notifier_callback; }; struct lttng_probe_desc { @@ -268,12 +270,25 @@ struct lttng_enabler_ref { }; struct lttng_uprobe_handler { - struct lttng_event *event; + union { + struct lttng_event *event; + struct lttng_event_notifier *event_notifier; + } u; loff_t offset; struct uprobe_consumer up_consumer; struct list_head node; }; +struct lttng_kprobe { + struct kprobe kp; + char *symbol_name; +}; + +struct lttng_uprobe { + struct inode *inode; + struct list_head head; +}; + enum lttng_syscall_entryexit { LTTNG_SYSCALL_ENTRY, LTTNG_SYSCALL_EXIT, @@ -298,18 +313,12 @@ struct lttng_event { struct lttng_ctx *ctx; enum lttng_kernel_instrumentation instrumentation; union { - struct { - struct kprobe kp; - char *symbol_name; - } kprobe; + struct lttng_kprobe kprobe; struct { struct lttng_krp *lttng_krp; char *symbol_name; } kretprobe; - struct { - struct inode *inode; - struct list_head head; - } uprobe; + struct lttng_uprobe uprobe; struct { char *syscall_name; enum lttng_syscall_entryexit entryexit; @@ -340,6 +349,8 @@ struct lttng_event_notifier { enum lttng_kernel_instrumentation instrumentation; union { + struct lttng_kprobe kprobe; + struct lttng_uprobe uprobe; } u; /* Backward references: list of lttng_enabler_ref (ref to enablers) */ @@ -654,7 +665,9 @@ int lttng_event_notifier_enabler_enable( int lttng_event_notifier_enabler_disable( struct lttng_event_notifier_enabler *event_notifier_enabler); int lttng_fix_pending_events(void); +int lttng_fix_pending_event_notifiers(void); int lttng_session_active(void); +bool lttng_event_notifier_active(void); struct lttng_session *lttng_session_create(void); int lttng_session_enable(struct lttng_session *session); @@ -717,6 +730,9 @@ int lttng_channel_disable(struct lttng_channel *channel); int lttng_event_enable(struct lttng_event *event); int lttng_event_disable(struct lttng_event *event); +int lttng_event_notifier_enable(struct lttng_event_notifier *event_notifier); +int lttng_event_notifier_disable(struct lttng_event_notifier *event_notifier); + void lttng_transport_register(struct lttng_transport *transport); void lttng_transport_unregister(struct lttng_transport *transport); @@ -755,22 +771,24 @@ void lttng_clock_ref(void); void lttng_clock_unref(void); #if defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS) -int lttng_syscalls_register(struct lttng_channel *chan, void *filter); -int lttng_syscalls_unregister(struct lttng_channel *chan); -int lttng_syscalls_destroy(struct lttng_channel *chan); -int lttng_syscall_filter_enable(struct lttng_channel *chan, +int lttng_syscalls_register_event(struct lttng_channel *chan, void *filter); +int lttng_syscalls_unregister_event(struct lttng_channel *chan); +int lttng_syscalls_destroy_event(struct lttng_channel *chan); +int lttng_syscall_filter_enable_event(struct lttng_channel *chan, struct lttng_event *event); -int lttng_syscall_filter_disable(struct lttng_channel *chan, +int lttng_syscall_filter_disable_event(struct lttng_channel *chan, struct lttng_event *event); long lttng_channel_syscall_mask(struct lttng_channel *channel, struct lttng_kernel_syscall_mask __user *usyscall_mask); + #else -static inline int lttng_syscalls_register(struct lttng_channel *chan, void *filter) +static inline int lttng_syscalls_register_event( + struct lttng_channel *chan, void *filter) { return -ENOSYS; } -static inline int lttng_syscalls_unregister(struct lttng_channel *chan) +static inline int lttng_syscalls_unregister_event(struct lttng_channel *chan) { return 0; } @@ -780,13 +798,13 @@ static inline int lttng_syscalls_destroy(struct lttng_channel *chan) return 0; } -static inline int lttng_syscall_filter_enable(struct lttng_channel *chan, +static inline int lttng_syscall_filter_enable_event(struct lttng_channel *chan, struct lttng_event *event); { return -ENOSYS; } -static inline int lttng_syscall_filter_disable(struct lttng_channel *chan, +static inline int lttng_syscall_filter_disable_event(struct lttng_channel *chan, struct lttng_event *event); { return -ENOSYS; @@ -1003,16 +1021,22 @@ void lttng_logger_exit(void); extern int lttng_statedump_start(struct lttng_session *session); #ifdef CONFIG_KPROBES -int lttng_kprobes_register(const char *name, +int lttng_kprobes_register_event(const char *name, const char *symbol_name, uint64_t offset, uint64_t addr, struct lttng_event *event); -void lttng_kprobes_unregister(struct lttng_event *event); -void lttng_kprobes_destroy_private(struct lttng_event *event); +void lttng_kprobes_unregister_event(struct lttng_event *event); +void lttng_kprobes_destroy_event_private(struct lttng_event *event); +int lttng_kprobes_register_event_notifier(const char *symbol_name, + uint64_t offset, + uint64_t addr, + struct lttng_event_notifier *event_notifier); +void lttng_kprobes_unregister_event_notifier(struct lttng_event_notifier *event_notifier); +void lttng_kprobes_destroy_event_notifier_private(struct lttng_event_notifier *event_notifier); #else static inline -int lttng_kprobes_register(const char *name, +int lttng_kprobes_register_event(const char *name, const char *symbol_name, uint64_t offset, uint64_t addr, @@ -1022,12 +1046,31 @@ int lttng_kprobes_register(const char *name, } static inline -void lttng_kprobes_unregister(struct lttng_event *event) +void lttng_kprobes_unregister_event(struct lttng_event *event) { } static inline -void lttng_kprobes_destroy_private(struct lttng_event *event) +void lttng_kprobes_destroy_event_private(struct lttng_event *event) +{ +} + +static inline +int lttng_kprobes_register_event_notifier(const char *symbol_name, + uint64_t offset, + uint64_t addr, + struct lttng_event_notifier *event_notifier) +{ + return -ENOSYS; +} + +static inline +void lttng_kprobes_unregister_event_notifier(struct lttng_event_notifier *event_notifier) +{ +} + +static inline +void lttng_kprobes_destroy_event_notifier_private(struct lttng_event_notifier *event_notifier) { } #endif @@ -1035,35 +1078,68 @@ void lttng_kprobes_destroy_private(struct lttng_event *event) int lttng_event_add_callsite(struct lttng_event *event, struct lttng_kernel_event_callsite *callsite); +int lttng_event_notifier_add_callsite(struct lttng_event_notifier *event_notifier, + struct lttng_kernel_event_callsite *callsite); + #ifdef CONFIG_UPROBES -int lttng_uprobes_register(const char *name, +int lttng_uprobes_register_event(const char *name, int fd, struct lttng_event *event); -int lttng_uprobes_add_callsite(struct lttng_event *event, +int lttng_uprobes_event_add_callsite(struct lttng_event *event, + struct lttng_kernel_event_callsite *callsite); +void lttng_uprobes_unregister_event(struct lttng_event *event); +void lttng_uprobes_destroy_event_private(struct lttng_event *event); +int lttng_uprobes_register_event_notifier(const char *name, + int fd, struct lttng_event_notifier *event_notifier); +int lttng_uprobes_event_notifier_add_callsite(struct lttng_event_notifier *event_notifier, struct lttng_kernel_event_callsite *callsite); -void lttng_uprobes_unregister(struct lttng_event *event); -void lttng_uprobes_destroy_private(struct lttng_event *event); +void lttng_uprobes_unregister_event_notifier(struct lttng_event_notifier *event_notifier); +void lttng_uprobes_destroy_event_notifier_private(struct lttng_event_notifier *event_notifier); #else static inline -int lttng_uprobes_register(const char *name, +int lttng_uprobes_register_event(const char *name, int fd, struct lttng_event *event) { return -ENOSYS; } static inline -int lttng_uprobes_add_callsite(struct lttng_event *event, +int lttng_uprobes_event_add_callsite(struct lttng_event *event, + struct lttng_kernel_event_callsite *callsite) +{ + return -ENOSYS; +} + +static inline +void lttng_uprobes_unregister_event(struct lttng_event *event) +{ +} + +static inline +void lttng_uprobes_destroy_event_private(struct lttng_event *event) +{ +} + +static inline +int lttng_uprobes_register_event_notifier(const char *name, + int fd, struct lttng_event_notifier *event_notifier) +{ + return -ENOSYS; +} + +static inline +int lttng_uprobes_event_notifier_add_callsite(struct lttng_event_notifier *event_notifier, struct lttng_kernel_event_callsite *callsite) { return -ENOSYS; } static inline -void lttng_uprobes_unregister(struct lttng_event *event) +void lttng_uprobes_unregister_event_notifier(struct lttng_event_notifier *event_notifier) { } static inline -void lttng_uprobes_destroy_private(struct lttng_event *event) +void lttng_uprobes_destroy_event_notifier_private(struct lttng_event_notifier *event_notifier) { } #endif