Implement event notifier error counter
[lttng-modules.git] / include / lttng / events.h
index bb3f9363f3d346d45e41ef054269bb8512df4101..b4c5372ae1f9266e9e851992f33059d7544bea90 100644 (file)
@@ -234,6 +234,7 @@ enum lttng_event_type {
 
 enum lttng_bytecode_node_type {
        LTTNG_BYTECODE_NODE_TYPE_FILTER,
+       LTTNG_BYTECODE_NODE_TYPE_CAPTURE,
 };
 
 struct lttng_bytecode_node {
@@ -257,6 +258,8 @@ enum lttng_bytecode_interpreter_ret {
        /* Other bits are kept for future use. */
 };
 
+struct lttng_interpreter_output;
+
 struct lttng_bytecode_runtime {
        /* Associated bytecode */
        struct lttng_bytecode_node *bc;
@@ -264,6 +267,10 @@ struct lttng_bytecode_runtime {
                uint64_t (*filter)(void *filter_data,
                                struct lttng_probe_ctx *lttng_probe_ctx,
                                const char *filter_stack_data);
+               uint64_t (*capture)(void *filter_data,
+                               struct lttng_probe_ctx *lttng_probe_ctx,
+                               const char *capture_stack_data,
+                               struct lttng_interpreter_output *output);
        } interpreter_funcs;
        int link_failed;
        struct list_head node;  /* list of bytecode runtime in event */
@@ -349,6 +356,7 @@ struct lttng_event {
 struct lttng_event_notifier {
        enum lttng_event_type evtype;   /* First field. */
        uint64_t user_token;
+       uint64_t error_counter_index;
        int enabled;
        int registered;                 /* has reg'd tracepoint probe */
        const struct lttng_event_desc *desc;
@@ -373,9 +381,13 @@ struct lttng_event_notifier {
        struct hlist_node hlist;        /* session ht of event_notifiers */
        /* list of struct lttng_bytecode_runtime, sorted by seqnum */
        struct list_head filter_bytecode_runtime_head;
+       size_t num_captures;
+       struct list_head capture_bytecode_runtime_head;
        int has_enablers_without_bytecode;
 
-       void (*send_notification)(struct lttng_event_notifier *event_notifier);
+       void (*send_notification)(struct lttng_event_notifier *event_notifier,
+                       struct lttng_probe_ctx *lttng_probe_ctx,
+                       const char *interpreter_stack_data);
        struct lttng_event_notifier_group *group; /* Weak ref */
 };
 
@@ -393,7 +405,7 @@ struct lttng_enabler {
 
        enum lttng_enabler_format_type format_type;
 
-       /* head list of struct lttng_ust_filter_bytecode_node */
+       /* head list of struct lttng_bytecode_node */
        struct list_head filter_bytecode_head;
 
        struct lttng_kernel_event event_param;
@@ -415,10 +427,16 @@ struct lttng_event_enabler {
 
 struct lttng_event_notifier_enabler {
        struct lttng_enabler base;
+       uint64_t error_counter_index;
        struct list_head node;  /* List of event_notifier enablers */
        struct lttng_event_notifier_group *group;
+
+       /* head list of struct lttng_bytecode_node */
+       struct list_head capture_bytecode_head;
+       uint64_t num_captures;
 };
 
+
 static inline
 struct lttng_enabler *lttng_event_enabler_as_enabler(
                struct lttng_event_enabler *event_enabler)
@@ -496,6 +514,28 @@ struct lttng_channel_ops {
                        uint64_t *id);
 };
 
+struct lttng_counter_ops {
+       struct lib_counter *(*counter_create)(size_t nr_dimensions,
+                       const size_t *max_nr_elem,      /* for each dimension */
+                       int64_t global_sum_step);
+       void (*counter_destroy)(struct lib_counter *counter);
+       int (*counter_add)(struct lib_counter *counter, const size_t *dimension_indexes,
+                       int64_t v);
+       /*
+        * counter_read reads a specific cpu's counter if @cpu >= 0, or
+        * the global aggregation counter if @cpu == -1.
+        */
+       int (*counter_read)(struct lib_counter *counter, const size_t *dimension_indexes, int cpu,
+                        int64_t *value, bool *overflow, bool *underflow);
+       /*
+        * counter_aggregate returns the total sum of all per-cpu counters and
+        * the global aggregation counter.
+        */
+       int (*counter_aggregate)(struct lib_counter *counter, const size_t *dimension_indexes,
+                       int64_t *value, bool *overflow, bool *underflow);
+       int (*counter_clear)(struct lib_counter *counter, const size_t *dimension_indexes);
+};
+
 struct lttng_transport {
        char *name;
        struct module *owner;
@@ -503,6 +543,13 @@ struct lttng_transport {
        struct lttng_channel_ops ops;
 };
 
+struct lttng_counter_transport {
+       char *name;
+       struct module *owner;
+       struct list_head node;
+       struct lttng_counter_ops ops;
+};
+
 struct lttng_syscall_filter;
 
 #define LTTNG_EVENT_HT_BITS            12
@@ -630,6 +677,14 @@ struct lttng_session {
        char creation_time[LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN];
 };
 
+struct lttng_counter {
+       struct file *file;              /* File associated to counter. */
+       struct file *owner;
+       struct lttng_counter_transport *transport;
+       struct lib_counter *counter;
+       struct lttng_counter_ops *ops;
+};
+
 struct lttng_event_notifier_group {
        struct file *file;              /* File associated to event notifier group */
        struct file *notif_file;        /* File used to expose notifications to userspace. */
@@ -714,7 +769,23 @@ int lttng_session_metadata_regenerate(struct lttng_session *session);
 int lttng_session_statedump(struct lttng_session *session);
 void metadata_cache_destroy(struct kref *kref);
 
+struct lttng_counter *lttng_kernel_counter_create(
+               const char *counter_transport_name, size_t number_dimensions,
+               const size_t *dimensions_sizes);
+int lttng_kernel_counter_read(struct lttng_counter *counter,
+               const size_t *dimension_indexes, int32_t cpu,
+               int64_t *val, bool *overflow, bool *underflow);
+int lttng_kernel_counter_aggregate(struct lttng_counter *counter,
+               const size_t *dimension_indexes, int64_t *val,
+               bool *overflow, bool *underflow);
+int lttng_kernel_counter_clear(struct lttng_counter *counter,
+               const size_t *dimension_indexes);
+
+
 struct lttng_event_notifier_group *lttng_event_notifier_group_create(void);
+int lttng_event_notifier_group_create_error_counter(
+               struct file *event_notifier_group_file,
+               const struct lttng_kernel_counter_conf *error_counter_conf);
 void lttng_event_notifier_group_destroy(
                struct lttng_event_notifier_group *event_notifier_group);
 
@@ -750,6 +821,7 @@ struct lttng_event *lttng_event_compat_old_create(struct lttng_channel *chan,
 struct lttng_event_notifier *lttng_event_notifier_create(
                                const struct lttng_event_desc *event_notifier_desc,
                                uint64_t id,
+                               uint64_t error_counter_idx,
                                struct lttng_event_notifier_group *event_notifier_group,
                                struct lttng_kernel_event_notifier *event_notifier_param,
                                void *filter,
@@ -757,6 +829,7 @@ struct lttng_event_notifier *lttng_event_notifier_create(
 struct lttng_event_notifier *_lttng_event_notifier_create(
                                const struct lttng_event_desc *event_notifier_desc,
                                uint64_t id,
+                               uint64_t error_counter_idx,
                                struct lttng_event_notifier_group *event_notifier_group,
                                struct lttng_kernel_event_notifier *event_notifier_param,
                                void *filter,
@@ -773,6 +846,9 @@ 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);
 
+void lttng_counter_transport_register(struct lttng_counter_transport *transport);
+void lttng_counter_transport_unregister(struct lttng_counter_transport *transport);
+
 void synchronize_trace(void);
 int lttng_abi_init(void);
 int lttng_abi_compat_old_init(void);
@@ -900,11 +976,14 @@ int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event
 int lttng_event_notifier_enabler_attach_filter_bytecode(
                struct lttng_event_notifier_enabler *event_notifier_enabler,
                struct lttng_kernel_filter_bytecode __user *bytecode);
+int lttng_event_notifier_enabler_attach_capture_bytecode(
+               struct lttng_event_notifier_enabler *event_notifier_enabler,
+               struct lttng_kernel_capture_bytecode __user *bytecode);
 
 void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                struct lttng_ctx *ctx,
-               struct list_head *bytecode_runtime_head,
-               struct lttng_enabler *enabler);
+               struct list_head *instance_bytecode_runtime_head,
+               struct list_head *enabler_bytecode_runtime_head);
 
 int lttng_probes_init(void);
 
This page took 0.025078 seconds and 4 git commands to generate.