X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttng-events.h;h=d9fdd0cf091b117d68f5cfe0de0edf99af1c835a;hb=07dfc1d0e4b093ad02682499a702dc11e54e8302;hp=567449615cce756284795659679da2ca6f5b2af7;hpb=3c9970797850893aaf1b9019d21868d73580e17d;p=lttng-modules.git diff --git a/lttng-events.h b/lttng-events.h index 56744961..d9fdd0cf 100644 --- a/lttng-events.h +++ b/lttng-events.h @@ -140,6 +140,12 @@ struct lttng_event_field { struct lttng_type type; }; +union lttng_ctx_value { + int64_t s64; + const char *str; + double d; +}; + /* * We need to keep this perf counter field separately from struct * lttng_ctx_field because cpu hotplug needs fixed-location addresses. @@ -157,6 +163,8 @@ struct lttng_ctx_field { void (*record)(struct lttng_ctx_field *field, struct lib_ring_buffer_ctx *ctx, struct lttng_channel *chan); + void (*get_value)(struct lttng_ctx_field *field, + union lttng_ctx_value *value); union { struct lttng_perf_counter_field *perf_counter; } u; @@ -196,6 +204,33 @@ enum lttng_event_type { LTTNG_TYPE_ENABLER = 1, }; +struct lttng_filter_bytecode_node { + struct list_head node; + struct lttng_enabler *enabler; + /* + * struct lttng_kernel_filter_bytecode has var. sized array, must be + * last field. + */ + struct lttng_kernel_filter_bytecode bc; +}; + +/* + * Filter return value masks. + */ +enum lttng_filter_ret { + LTTNG_FILTER_DISCARD = 0, + LTTNG_FILTER_RECORD_FLAG = (1ULL << 0), + /* Other bits are kept for future use. */ +}; + +struct lttng_bytecode_runtime { + /* Associated bytecode */ + struct lttng_filter_bytecode_node *bc; + uint64_t (*filter)(void *filter_data, const char *filter_stack_data); + int link_failed; + struct list_head node; /* list of bytecode runtime in event */ +}; + /* * Objects in a linked-list of enablers, owned by an event. */ @@ -237,6 +272,9 @@ struct lttng_event { struct list_head enablers_ref_head; struct hlist_node hlist; /* session ht of events */ int registered; /* has reg'd tracepoint probe */ + /* list of struct lttng_bytecode_runtime, sorted by seqnum */ + struct list_head bytecode_runtime_head; + int has_enablers_without_bytecode; }; enum lttng_enabler_type { @@ -254,6 +292,8 @@ struct lttng_enabler { enum lttng_enabler_type type; struct list_head node; /* per-session list of enablers */ + /* head list of struct lttng_ust_filter_bytecode_node */ + struct list_head filter_bytecode_head; struct lttng_kernel_event event_param; struct lttng_channel *chan; @@ -460,6 +500,11 @@ struct lttng_event *lttng_event_create(struct lttng_channel *chan, void *filter, const struct lttng_event_desc *event_desc, enum lttng_kernel_instrumentation itype); +struct lttng_event *_lttng_event_create(struct lttng_channel *chan, + struct lttng_kernel_event *event_param, + void *filter, + const struct lttng_event_desc *event_desc, + enum lttng_kernel_instrumentation itype); struct lttng_event *lttng_event_compat_old_create(struct lttng_channel *chan, struct lttng_kernel_old_event *old_event_param, void *filter, @@ -550,9 +595,18 @@ int lttng_abi_syscall_list(void) } #endif +void lttng_filter_sync_state(struct lttng_bytecode_runtime *runtime); +int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler, + struct lttng_kernel_filter_bytecode __user *bytecode); + +extern struct lttng_ctx *lttng_static_ctx; + +int lttng_context_init(void); +void lttng_context_exit(void); struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx); void lttng_context_update(struct lttng_ctx *ctx); int lttng_find_context(struct lttng_ctx *ctx, const char *name); +int lttng_get_context_index(struct lttng_ctx *ctx, const char *name); void lttng_remove_context_field(struct lttng_ctx **ctx, struct lttng_ctx_field *field); void lttng_destroy_context(struct lttng_ctx *ctx);