Fix: scsi: sd: Atomic write support added in 6.11-rc1
[lttng-modules.git] / include / lttng / events.h
index 0f6b5ab9d4e2b09e8e2742dc3fab9d4ffe3b4b0b..8c04ec280820dd663ba5ab5e7dfc9ea3c5c9c0fb 100644 (file)
@@ -16,7 +16,8 @@
 #include <linux/kref.h>
 #include <linux/uuid.h>
 #include <linux/irq_work.h>
-#include <wrapper/uprobes.h>
+#include <linux/uprobes.h>
+
 #include <lttng/cpuhotplug.h>
 #include <lttng/tracer.h>
 #include <lttng/abi.h>
@@ -26,6 +27,7 @@
 #define lttng_is_signed_type(type)     (((type) -1) < (type) 1)
 
 struct lttng_kernel_channel_buffer;
+struct lttng_kernel_channel_counter;
 struct lttng_kernel_session;
 struct lttng_kernel_ring_buffer_ctx;
 
@@ -75,13 +77,15 @@ struct lttng_kernel_type_integer {
        unsigned int size;              /* in bits */
        unsigned short alignment;       /* in bits */
        unsigned int signedness:1,
-               reverse_byte_order:1;
+               reverse_byte_order:1,
+               user:1;                 /* fetch from user-space */
        unsigned int base;              /* 2, 8, 10, 16, for pretty print */
 };
 
 struct lttng_kernel_type_string {
        struct lttng_kernel_type_common parent;
        enum lttng_kernel_string_encoding encoding;
+       unsigned int user:1;            /* fetch from user-space */
 };
 
 struct lttng_kernel_type_enum {
@@ -94,7 +98,7 @@ struct lttng_kernel_type_array {
        struct lttng_kernel_type_common parent;
        const struct lttng_kernel_type_common *elem_type;
        unsigned int length;                    /* Num. elems. */
-       unsigned int alignment;
+       unsigned int alignment;         /* Alignment in bytes before elements. */
        enum lttng_kernel_string_encoding encoding;
 };
 
@@ -102,7 +106,7 @@ struct lttng_kernel_type_sequence {
        struct lttng_kernel_type_common parent;
        const char *length_name;        /* Length field name. If NULL, use previous field. */
        const struct lttng_kernel_type_common *elem_type;
-       unsigned int alignment;         /* Alignment before elements. */
+       unsigned int alignment;         /* Alignment in bytes before elements. */
        enum lttng_kernel_string_encoding encoding;
 };
 
@@ -110,7 +114,7 @@ struct lttng_kernel_type_struct {
        struct lttng_kernel_type_common parent;
        unsigned int nr_fields;
        const struct lttng_kernel_event_field * const *fields;  /* Array of pointers to fields. */
-       unsigned int alignment;
+       unsigned int alignment;         /* Alignment in bits */
 };
 
 struct lttng_kernel_type_variant {
@@ -118,7 +122,7 @@ struct lttng_kernel_type_variant {
        const char *tag_name;           /* Tag field name. If NULL, use previous field. */
        const struct lttng_kernel_event_field * const *choices; /* Array of pointers to fields. */
        unsigned int nr_choices;
-       unsigned int alignment;
+       unsigned int alignment;         /* Alignment in bytes */
 };
 
 struct lttng_kernel_enum_desc {
@@ -134,7 +138,6 @@ struct lttng_kernel_event_field {
        const char *name;
        const struct lttng_kernel_type_common *type;
        unsigned int nowrite:1,         /* do not write into trace */
-                       user:1,         /* fetch from user-space */
                        nofilter:1;     /* do not consider for filter */
 };
 
@@ -142,7 +145,7 @@ struct lttng_kernel_event_field {
 #define PARAMS(args...)        args
 #endif
 
-#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base)           \
+#define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base)   \
        ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \
                .parent = {                                                                             \
                        .type = lttng_kernel_type_integer,                                                      \
@@ -151,15 +154,27 @@ struct lttng_kernel_event_field {
                .alignment = (_alignment),                                                              \
                .signedness = (_signedness),                                                            \
                .reverse_byte_order = (_byte_order) != __BYTE_ORDER,                                    \
+               .user = (_user),                                                                        \
                .base = (_base),                                                                        \
        }))
 
-#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base)                          \
-       lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT,                                      \
+#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base)           \
+       _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 0, _base)
+
+#define lttng_kernel_static_type_user_integer(_size, _alignment, _signedness, _byte_order, _base)      \
+       _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 1, _base)
+
+#define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base)                  \
+       _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT,                                     \
                        lttng_alignof(_type) * CHAR_BIT,                                                \
                        lttng_is_signed_type(_type),                                                    \
-                       _byte_order,                                                                    \
-                       _base)
+                       _byte_order, _user, _base)
+
+#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base)                          \
+       _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 0, _base)
+
+#define lttng_kernel_static_type_user_integer_from_type(_type, _byte_order, _base)                     \
+       _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 1, _base)
 
 #define lttng_kernel_static_type_enum(_desc, _container_type)                                          \
        ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_enum, { \
@@ -199,12 +214,13 @@ struct lttng_kernel_event_field {
                .elem_type = (_elem_type),                                                              \
        }))
 
-#define lttng_kernel_static_type_string(_encoding)                                                     \
+#define lttng_kernel_static_type_string(_encoding, _user)                                              \
        ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \
                .parent = {                                                                             \
                        .type = lttng_kernel_type_string,                                               \
                },                                                                                      \
                .encoding = lttng_kernel_string_encoding_##_encoding,                                   \
+               .user = (_user),                                                                        \
        }))
 
 #define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment)                          \
@@ -233,12 +249,11 @@ struct lttng_kernel_event_field {
                .alignment = (_alignment),                                                              \
        }))
 
-#define lttng_kernel_static_event_field(_name, _type, _nowrite, _user, _nofilter)                      \
+#define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter)                             \
        __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, {                               \
                .name = (_name),                                                                        \
                .type = (_type),                                                                        \
                .nowrite = (_nowrite),                                                                  \
-               .user = (_user),                                                                        \
                .nofilter = (_nofilter),                                                                \
        })
 
@@ -335,6 +350,7 @@ struct lttng_kernel_event_common_private;
 enum lttng_kernel_event_type {
        LTTNG_KERNEL_EVENT_TYPE_RECORDER = 0,
        LTTNG_KERNEL_EVENT_TYPE_NOTIFIER = 1,
+       LTTNG_KERNEL_EVENT_TYPE_COUNTER = 2
 };
 
 struct lttng_kernel_event_common {
@@ -360,6 +376,21 @@ struct lttng_kernel_event_recorder {
        struct lttng_kernel_channel_buffer *chan;
 };
 
+struct lttng_kernel_event_counter_ctx {
+       int args_available;
+};
+
+struct lttng_kernel_event_counter_private;
+
+struct lttng_kernel_event_counter {
+       struct lttng_kernel_event_common parent;
+       struct lttng_kernel_event_counter_private *priv;        /* Private event counter interface */
+
+       struct lttng_kernel_channel_counter *chan;
+
+       int use_args;                                           /* Use input arguments. */
+};
+
 struct lttng_kernel_notification_ctx {
        int eval_capture;                                       /* Capture evaluation available. */
 };
@@ -383,20 +414,25 @@ struct lttng_kernel_channel_buffer_ops {
        int (*event_reserve)(struct lttng_kernel_ring_buffer_ctx *ctx);
        void (*event_commit)(struct lttng_kernel_ring_buffer_ctx *ctx);
        void (*event_write)(struct lttng_kernel_ring_buffer_ctx *ctx, const void *src,
-                           size_t len);
+                           size_t len, size_t alignment);
        void (*event_write_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
-                                     const void *src, size_t len);
+                                     const void *src, size_t len, size_t alignment);
        void (*event_memset)(struct lttng_kernel_ring_buffer_ctx *ctx,
                             int c, size_t len);
        void (*event_strcpy)(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src,
                             size_t len);
        void (*event_strcpy_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
                                       const char __user *src, size_t len);
+       void (*event_pstrcpy_pad)(struct lttng_kernel_ring_buffer_ctx *ctx,
+                                 const char *src, size_t len);
+       void (*event_pstrcpy_pad_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
+                                 const char __user *src, size_t len);
        void (*lost_event_too_big)(struct lttng_kernel_channel_buffer *lttng_channel);
 };
 
 enum lttng_kernel_channel_type {
        LTTNG_KERNEL_CHANNEL_TYPE_BUFFER = 0,
+       LTTNG_KERNEL_CHANNEL_TYPE_COUNTER = 1,
 };
 
 struct lttng_kernel_channel_common_private;
@@ -420,6 +456,25 @@ struct lttng_kernel_channel_buffer {
        struct lttng_kernel_channel_buffer_ops *ops;
 };
 
+struct lttng_kernel_channel_counter;
+struct lttng_kernel_channel_counter_ops_private;
+
+struct lttng_kernel_channel_counter_ops {
+       struct lttng_kernel_channel_counter_ops_private *priv;  /* Private channel counter ops interface */
+
+       int (*counter_hit)(struct lttng_kernel_event_counter *event_counter,
+               const char *stack_data,
+               struct lttng_kernel_probe_ctx *probe_ctx,
+               struct lttng_kernel_event_counter_ctx *event_counter_ctx);
+};
+
+struct lttng_kernel_channel_counter {
+       struct lttng_kernel_channel_common parent;
+       struct lttng_kernel_channel_counter_private *priv;      /* Private channel counter interface */
+
+       struct lttng_kernel_channel_counter_ops *ops;
+};
+
 #define LTTNG_DYNAMIC_LEN_STACK_SIZE   128
 
 struct lttng_dynamic_len_stack {
@@ -466,4 +521,30 @@ void lttng_kernel_probe_unregister(struct lttng_kernel_probe_desc *desc);
 
 bool lttng_id_tracker_lookup(struct lttng_kernel_id_tracker_rcu *p, int id);
 
+static inline
+struct lttng_kernel_channel_common *lttng_kernel_get_chan_common_from_event_common(
+               struct lttng_kernel_event_common *event)
+{
+       switch (event->type) {
+       case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
+       {
+               struct lttng_kernel_event_recorder *event_recorder =
+                       container_of(event, struct lttng_kernel_event_recorder, parent);
+               struct lttng_kernel_channel_buffer *chan_buf = event_recorder->chan;
+
+               return &chan_buf->parent;
+       }
+       case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
+       {
+               struct lttng_kernel_event_counter *event_counter =
+                       container_of(event, struct lttng_kernel_event_counter, parent);
+               struct lttng_kernel_channel_counter *chan_counter = event_counter->chan;
+
+               return &chan_counter->parent;
+       }
+       default:
+               return NULL;
+       }
+}
+
 #endif /* _LTTNG_EVENTS_H */
This page took 0.026987 seconds and 4 git commands to generate.