Update for kernel 5.7: use vmalloc_sync_mappings on kernels >= 5.7
[lttng-modules.git] / lttng-events.h
index 8fe36a7326121f7f7325112c7d77b0105e1eb9ea..8197eb83a5bafc8c11e17f1a3d3f0bbdc5599262 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
+/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
  *
  * lttng-events.h
  *
@@ -20,6 +20,7 @@
 #include <lttng-tracer.h>
 #include <lttng-abi.h>
 #include <lttng-abi-old.h>
+#include <lttng-endian.h>
 
 #define lttng_is_signed_type(type)     (((type)(-1)) < 0)
 
@@ -35,16 +36,12 @@ struct lib_ring_buffer_config;
 
 enum abstract_types {
        atype_integer,
-       atype_enum,
-       atype_array,
-       atype_sequence,
        atype_string,
-       atype_struct,
-       atype_array_compound,           /* Array of compound types. */
-       atype_sequence_compound,        /* Sequence of compound types. */
-       atype_variant,
-       atype_array_bitfield,
-       atype_sequence_bitfield,
+       atype_enum_nestable,
+       atype_array_nestable,
+       atype_sequence_nestable,
+       atype_struct_nestable,
+       atype_variant_nestable,
        NR_ABSTRACT_TYPES,
 };
 
@@ -77,7 +74,7 @@ struct lttng_enum_entry {
                _byte_order, _base, _encoding)  \
        {                                                       \
            .atype = atype_integer,                             \
-           .u.basic.integer =                                  \
+           .u.integer =                                        \
                {                                               \
                  .size = (_size) ? : sizeof(_type) * CHAR_BIT, \
                  .alignment = (_alignment) ? : lttng_alignof(_type) * CHAR_BIT, \
@@ -97,55 +94,38 @@ struct lttng_integer_type {
        enum lttng_string_encodings encoding;
 };
 
-union _lttng_basic_type {
-       struct lttng_integer_type integer;
-       struct {
-               const struct lttng_enum_desc *desc;     /* Enumeration mapping */
-               struct lttng_integer_type container_type;
-       } enumeration;
-       struct {
-               enum lttng_string_encodings encoding;
-       } string;
-};
-
-struct lttng_basic_type {
-       enum abstract_types atype;
-       union {
-               union _lttng_basic_type basic;
-       } u;
-};
-
 struct lttng_type {
        enum abstract_types atype;
        union {
-               union _lttng_basic_type basic;
+               struct lttng_integer_type integer;
                struct {
-                       struct lttng_basic_type elem_type;
-                       unsigned int length;            /* num. elems. */
-                       unsigned int elem_alignment;    /* alignment override */
-               } array;
+                       enum lttng_string_encodings encoding;
+               } string;
                struct {
-                       struct lttng_basic_type length_type;
-                       struct lttng_basic_type elem_type;
-                       unsigned int elem_alignment;    /* alignment override */
-               } sequence;
+                       const struct lttng_enum_desc *desc;     /* Enumeration mapping */
+                       const struct lttng_type *container_type;
+               } enum_nestable;
                struct {
-                       uint32_t nr_fields;
-                       struct lttng_event_field *fields; /* Array of fields. */
-               } _struct;
+                       const struct lttng_type *elem_type;
+                       unsigned int length;                    /* Num. elems. */
+                       unsigned int alignment;
+               } array_nestable;
                struct {
-                       struct lttng_type *elem_type;
-                       unsigned int length;            /* num. elems. */
-               } array_compound;
+                       const char *length_name;                /* Length field name. */
+                       const struct lttng_type *elem_type;
+                       unsigned int alignment;                 /* Alignment before elements. */
+               } sequence_nestable;
                struct {
-                       struct lttng_type *elem_type;
-                       const char *length_name;
-               } sequence_compound;
+                       unsigned int nr_fields;
+                       const struct lttng_event_field *fields; /* Array of fields. */
+                       unsigned int alignment;
+               } struct_nestable;
                struct {
                        const char *tag_name;
-                       struct lttng_event_field *choices; /* Array of fields. */
-                       uint32_t nr_choices;
-               } variant;
+                       const struct lttng_event_field *choices; /* Array of fields. */
+                       unsigned int nr_choices;
+                       unsigned int alignment;
+               } variant_nestable;
        } u;
 };
 
@@ -161,7 +141,8 @@ struct lttng_event_field {
        const char *name;
        struct lttng_type type;
        unsigned int nowrite:1,         /* do not write into trace */
-                       user:1;         /* fetch from user-space */
+                       user:1,         /* fetch from user-space */
+                       nofilter:1;     /* do not consider for filter */
 };
 
 union lttng_ctx_value {
@@ -314,9 +295,6 @@ struct lttng_event {
                        struct lttng_krp *lttng_krp;
                        char *symbol_name;
                } kretprobe;
-               struct {
-                       char *symbol_name;
-               } ftrace;
                struct {
                        struct inode *inode;
                        struct list_head head;
@@ -489,19 +467,36 @@ struct lttng_dynamic_len_stack {
 DECLARE_PER_CPU(struct lttng_dynamic_len_stack, lttng_dynamic_len_stack);
 
 /*
- * struct lttng_pid_tracker declared in header due to deferencing of *v
+ * struct lttng_id_tracker declared in header due to deferencing of *v
  * in RCU_INITIALIZER(v).
  */
-#define LTTNG_PID_HASH_BITS    6
-#define LTTNG_PID_TABLE_SIZE   (1 << LTTNG_PID_HASH_BITS)
+#define LTTNG_ID_HASH_BITS     6
+#define LTTNG_ID_TABLE_SIZE    (1 << LTTNG_ID_HASH_BITS)
 
-struct lttng_pid_tracker {
-       struct hlist_head pid_hash[LTTNG_PID_TABLE_SIZE];
+enum tracker_type {
+       TRACKER_PID,
+       TRACKER_VPID,
+       TRACKER_UID,
+       TRACKER_VUID,
+       TRACKER_GID,
+       TRACKER_VGID,
+
+       TRACKER_UNKNOWN,
+};
+
+struct lttng_id_tracker_rcu {
+       struct hlist_head id_hash[LTTNG_ID_TABLE_SIZE];
+};
+
+struct lttng_id_tracker {
+       struct lttng_session *session;
+       enum tracker_type tracker_type;
+       struct lttng_id_tracker_rcu *p; /* RCU dereferenced. */
 };
 
-struct lttng_pid_hash_node {
+struct lttng_id_hash_node {
        struct hlist_node hlist;
-       int pid;
+       int id;
 };
 
 struct lttng_session {
@@ -514,7 +509,12 @@ struct lttng_session {
        unsigned int free_chan_id;      /* Next chan ID to allocate */
        uuid_le uuid;                   /* Trace session unique ID */
        struct lttng_metadata_cache *metadata_cache;
-       struct lttng_pid_tracker *pid_tracker;
+       struct lttng_id_tracker pid_tracker;
+       struct lttng_id_tracker vpid_tracker;
+       struct lttng_id_tracker uid_tracker;
+       struct lttng_id_tracker vuid_tracker;
+       struct lttng_id_tracker gid_tracker;
+       struct lttng_id_tracker vgid_tracker;
        unsigned int metadata_dumped:1,
                tstate:1;               /* Transient enable state */
        /* List of enablers */
@@ -611,17 +611,20 @@ void lttng_probes_exit(void);
 int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
                struct channel *chan);
 
-int lttng_pid_tracker_get_node_pid(const struct lttng_pid_hash_node *node);
-struct lttng_pid_tracker *lttng_pid_tracker_create(void);
-void lttng_pid_tracker_destroy(struct lttng_pid_tracker *lpf);
-bool lttng_pid_tracker_lookup(struct lttng_pid_tracker *lpf, int pid);
-int lttng_pid_tracker_add(struct lttng_pid_tracker *lpf, int pid);
-int lttng_pid_tracker_del(struct lttng_pid_tracker *lpf, int pid);
+int lttng_id_tracker_get_node_id(const struct lttng_id_hash_node *node);
+int lttng_id_tracker_empty_set(struct lttng_id_tracker *lf);
+void lttng_id_tracker_destroy(struct lttng_id_tracker *lf, bool rcu);
+bool lttng_id_tracker_lookup(struct lttng_id_tracker_rcu *p, int id);
+int lttng_id_tracker_add(struct lttng_id_tracker *lf, int id);
+int lttng_id_tracker_del(struct lttng_id_tracker *lf, int id);
 
-int lttng_session_track_pid(struct lttng_session *session, int pid);
-int lttng_session_untrack_pid(struct lttng_session *session, int pid);
+int lttng_session_track_id(struct lttng_session *session,
+               enum tracker_type tracker_type, int id);
+int lttng_session_untrack_id(struct lttng_session *session,
+               enum tracker_type tracker_type, int id);
 
-int lttng_session_list_tracker_pids(struct lttng_session *session);
+int lttng_session_list_tracker_ids(struct lttng_session *session,
+               enum tracker_type tracker_type);
 
 void lttng_clock_ref(void);
 void lttng_clock_unref(void);
@@ -718,6 +721,97 @@ int lttng_add_migratable_to_ctx(struct lttng_ctx **ctx)
 
 int lttng_add_callstack_to_ctx(struct lttng_ctx **ctx, int type);
 
+#if defined(CONFIG_CGROUPS) && \
+       ((LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)) || \
+        LTTNG_UBUNTU_KERNEL_RANGE(4,4,0,0, 4,5,0,0))
+int lttng_add_cgroup_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_cgroup_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if defined(CONFIG_IPC_NS) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_ipc_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_ipc_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if !defined(LTTNG_MNT_NS_MISSING_HEADER) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_mnt_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_mnt_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if defined(CONFIG_NET_NS) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_net_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_net_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if defined(CONFIG_PID_NS) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_pid_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_pid_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if defined(CONFIG_USER_NS) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_user_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_user_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+#if defined(CONFIG_UTS_NS) && \
+       (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+int lttng_add_uts_ns_to_ctx(struct lttng_ctx **ctx);
+#else
+static inline
+int lttng_add_uts_ns_to_ctx(struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+#endif
+
+int lttng_add_uid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_euid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_suid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_gid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_egid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_sgid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_vuid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_veuid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_vsuid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_vgid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_vegid_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_vsgid_to_ctx(struct lttng_ctx **ctx);
+
 #if defined(CONFIG_PERF_EVENTS)
 int lttng_add_perf_counter_to_ctx(uint32_t type,
                                  uint64_t config,
@@ -862,32 +956,6 @@ int lttng_kretprobes_event_enable_state(struct lttng_event *event,
 }
 #endif
 
-#if defined(CONFIG_DYNAMIC_FTRACE) && !defined(LTTNG_FTRACE_MISSING_HEADER)
-int lttng_ftrace_register(const char *name,
-                         const char *symbol_name,
-                         struct lttng_event *event);
-void lttng_ftrace_unregister(struct lttng_event *event);
-void lttng_ftrace_destroy_private(struct lttng_event *event);
-#else
-static inline
-int lttng_ftrace_register(const char *name,
-                         const char *symbol_name,
-                         struct lttng_event *event)
-{
-       return -ENOSYS;
-}
-
-static inline
-void lttng_ftrace_unregister(struct lttng_event *event)
-{
-}
-
-static inline
-void lttng_ftrace_destroy_private(struct lttng_event *event)
-{
-}
-#endif
-
 int lttng_calibrate(struct lttng_kernel_calibrate *calibrate);
 
 extern const struct file_operations lttng_tracepoint_list_fops;
@@ -895,4 +963,20 @@ extern const struct file_operations lttng_syscall_list_fops;
 
 #define TRACEPOINT_HAS_DATA_ARG
 
+static inline bool lttng_is_bytewise_integer(const struct lttng_type *type)
+{
+       if (type->atype != atype_integer)
+               return false;
+       switch (type->u.integer.size) {
+       case 8:         /* Fall-through. */
+       case 16:        /* Fall-through. */
+       case 32:        /* Fall-through. */
+       case 64:
+               break;
+       default:
+               return false;
+       }
+       return true;
+}
+
 #endif /* _LTTNG_EVENTS_H */
This page took 0.02841 seconds and 4 git commands to generate.