sessiond: ust: Update UST definitions for counters
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Fri, 28 May 2021 12:57:47 +0000 (08:57 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 15 Jul 2024 21:16:04 +0000 (17:16 -0400)
Update the internal ust-abi and ust-ctl headers to match LTTng-UST's
changes to support counter events.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I85fdb02710eaecebab950407d12c85ebfe27615f
Depends-on: lttng-ust: I1a706cf60059c7106525cf484d4a290c38e197c7

src/bin/lttng-sessiond/ust-abi-internal.hpp
src/bin/lttng-sessiond/ust-app.cpp
src/bin/lttng-sessiond/ust-ctl-internal.hpp
src/bin/lttng-sessiond/ust-registry-channel.cpp
src/bin/lttng-sessiond/ust-registry-channel.hpp

index a2a0dcabb3c883756c6d521116a9d05a586febae..b69d6b1483fe6088a8e803a49e9f5355b20155a6 100644 (file)
 #error "LTTNG_PACKED should be defined"
 #endif
 
-#ifndef __ust_stringify
-#define __ust_stringify1(x) #x
-#define __ust_stringify(x)  __ust_stringify1(x)
-#endif /* __ust_stringify */
+#ifndef lttng_ust_stringify
+#define lttng_ust_stringify1(x) #x
+#define lttng_ust_stringify(x)  lttng_ust_stringify1(x)
+#endif /* lttng_ust_stringify */
 
 #define LTTNG_UST_ABI_SYM_NAME_LEN 256
 #define LTTNG_UST_ABI_PROCNAME_LEN 16
 #define LTTNG_UST_ABI_COMM_MAGIC 0xC57C57C5
 
 /* Version for ABI between liblttng-ust, sessiond, consumerd */
-#define LTTNG_UST_ABI_MAJOR_VERSION                  9
+#define LTTNG_UST_ABI_MAJOR_VERSION                  10
 #define LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE 8
 #define LTTNG_UST_ABI_MINOR_VERSION                  0
 
+#define LTTNG_UST_ABI_CMD_MAX_LEN 4096U
+
 enum lttng_ust_abi_instrumentation {
        LTTNG_UST_ABI_TRACEPOINT = 0,
        LTTNG_UST_ABI_PROBE = 1,
@@ -89,43 +91,6 @@ struct lttng_ust_abi_stream {
         */
 } LTTNG_PACKED;
 
-#define LTTNG_UST_ABI_COUNTER_DIMENSION_MAX 4
-
-enum lttng_ust_abi_counter_arithmetic {
-       LTTNG_UST_ABI_COUNTER_ARITHMETIC_MODULAR = 0,
-       LTTNG_UST_ABI_COUNTER_ARITHMETIC_SATURATION = 1,
-};
-
-enum lttng_ust_abi_counter_bitness {
-       LTTNG_UST_ABI_COUNTER_BITNESS_32 = 0,
-       LTTNG_UST_ABI_COUNTER_BITNESS_64 = 1,
-};
-
-struct lttng_ust_abi_counter_dimension {
-       uint64_t size;
-       uint64_t underflow_index;
-       uint64_t overflow_index;
-       uint8_t has_underflow;
-       uint8_t has_overflow;
-} LTTNG_PACKED;
-
-#define LTTNG_UST_ABI_COUNTER_CONF_PADDING1 67
-struct lttng_ust_abi_counter_conf {
-       uint32_t arithmetic; /* enum lttng_ust_abi_counter_arithmetic */
-       uint32_t bitness; /* enum lttng_ust_abi_counter_bitness */
-       uint32_t number_dimensions;
-       int64_t global_sum_step;
-       struct lttng_ust_abi_counter_dimension dimensions[LTTNG_UST_ABI_COUNTER_DIMENSION_MAX];
-       uint8_t coalesce_hits;
-       char padding[LTTNG_UST_ABI_COUNTER_CONF_PADDING1];
-} LTTNG_PACKED;
-
-struct lttng_ust_abi_counter_value {
-       uint32_t number_dimensions;
-       uint64_t dimension_indexes[LTTNG_UST_ABI_COUNTER_DIMENSION_MAX];
-       int64_t value;
-} LTTNG_PACKED;
-
 #define LTTNG_UST_ABI_EVENT_PADDING1 8
 #define LTTNG_UST_ABI_EVENT_PADDING2 (LTTNG_UST_ABI_SYM_NAME_LEN + 32)
 struct lttng_ust_abi_event {
@@ -157,25 +122,86 @@ struct lttng_ust_abi_event_notifier_notification {
        char padding[LTTNG_UST_ABI_EVENT_NOTIFIER_NOTIFICATION_PADDING];
 } LTTNG_PACKED;
 
-#define LTTNG_UST_ABI_COUNTER_PADDING1    (LTTNG_UST_ABI_SYM_NAME_LEN + 32)
-#define LTTNG_UST_ABI_COUNTER_DATA_MAX_LEN 4096U
-struct lttng_ust_abi_counter {
-       uint64_t len;
-       char padding[LTTNG_UST_ABI_COUNTER_PADDING1];
-       char data[]; /* variable sized data */
+enum lttng_ust_abi_key_token_type {
+       LTTNG_UST_ABI_KEY_TOKEN_STRING = 0, /* arg: strtab_offset. */
+       LTTNG_UST_ABI_KEY_TOKEN_EVENT_NAME = 1, /* no arg. */
+       LTTNG_UST_ABI_KEY_TOKEN_PROVIDER_NAME = 2, /* no arg. */
+};
+
+enum lttng_ust_abi_counter_arithmetic {
+       LTTNG_UST_ABI_COUNTER_ARITHMETIC_MODULAR = 0,
+       LTTNG_UST_ABI_COUNTER_ARITHMETIC_SATURATION = 1,
+};
+
+enum lttng_ust_abi_counter_bitness {
+       LTTNG_UST_ABI_COUNTER_BITNESS_32 = 0,
+       LTTNG_UST_ABI_COUNTER_BITNESS_64 = 1,
+};
+
+struct lttng_ust_abi_counter_key_string {
+       uint32_t string_len; /* string length (includes \0) */
+       char str[]; /* Null-terminated string. */
+} LTTNG_PACKED;
+
+struct lttng_ust_abi_key_token {
+       uint32_t len; /* length of this structure. */
+       uint32_t type; /* enum lttng_ust_key_token_type */
+
+       /* Followed by a struct lttng_ust_abi_counter_key_string for LTTNG_UST_ABI_KEY_TOKEN_STRING.
+        */
+} LTTNG_PACKED;
+
+struct lttng_ust_abi_counter_key_dimension {
+       uint32_t len; /* length of this structure */
+       uint32_t nr_key_tokens;
+
+       /* Followed by a variable-length array of key tokens */
+} LTTNG_PACKED;
+
+struct lttng_ust_abi_counter_event {
+       uint32_t len; /* length of this structure */
+
+       struct lttng_ust_abi_event event;
+       uint32_t number_key_dimensions; /* array of dimensions is an array of var. len. elements. */
+
+       /* Followed by a variable-length array of key dimensions */
+} LTTNG_PACKED;
+
+enum lttng_ust_abi_counter_dimension_flags {
+       LTTNG_UST_ABI_COUNTER_DIMENSION_FLAG_UNDERFLOW = (1 << 0),
+       LTTNG_UST_ABI_COUNTER_DIMENSION_FLAG_OVERFLOW = (1 << 1),
+};
+
+struct lttng_ust_abi_counter_dimension {
+       uint32_t flags; /* enum lttng_ust_abi_counter_dimension_flags */
+       uint64_t size; /* dimension size */
+       uint64_t underflow_index;
+       uint64_t overflow_index;
+} LTTNG_PACKED;
+
+enum lttng_ust_abi_counter_conf_flags {
+       LTTNG_UST_ABI_COUNTER_CONF_FLAG_COALESCE_HITS = (1 << 0),
+};
+
+struct lttng_ust_abi_counter_conf {
+       uint32_t len; /* Length of fields before var. len. data. */
+       uint32_t flags; /* enum lttng_ust_abi_counter_conf_flags */
+       uint32_t arithmetic; /* enum lttng_ust_abi_counter_arithmetic */
+       uint32_t bitness; /* enum lttng_ust_abi_counter_bitness */
+       int64_t global_sum_step;
+       uint32_t number_dimensions;
+       uint32_t elem_len; /* array stride (size of lttng_ust_abi_counter_dimension) */
 } LTTNG_PACKED;
 
-#define LTTNG_UST_ABI_COUNTER_GLOBAL_PADDING1 (LTTNG_UST_ABI_SYM_NAME_LEN + 32)
 struct lttng_ust_abi_counter_global {
-       uint64_t len; /* shm len */
-       char padding[LTTNG_UST_ABI_COUNTER_GLOBAL_PADDING1];
+       uint32_t len; /* Length of this structure */
+       uint64_t shm_len; /* shm len */
 } LTTNG_PACKED;
 
-#define LTTNG_UST_ABI_COUNTER_CPU_PADDING1 (LTTNG_UST_ABI_SYM_NAME_LEN + 32)
 struct lttng_ust_abi_counter_cpu {
-       uint64_t len; /* shm len */
+       uint32_t len; /* Length of this structure */
+       uint64_t shm_len; /* shm len */
        uint32_t cpu_nr;
-       char padding[LTTNG_UST_ABI_COUNTER_CPU_PADDING1];
 } LTTNG_PACKED;
 
 enum lttng_ust_abi_field_type {
@@ -281,6 +307,7 @@ enum lttng_ust_abi_object_type {
        LTTNG_UST_ABI_OBJECT_TYPE_COUNTER = 6,
        LTTNG_UST_ABI_OBJECT_TYPE_COUNTER_GLOBAL = 7,
        LTTNG_UST_ABI_OBJECT_TYPE_COUNTER_CPU = 8,
+       LTTNG_UST_ABI_OBJECT_TYPE_COUNTER_EVENT = 9,
 };
 
 #define LTTNG_UST_ABI_OBJECT_DATA_PADDING1 32
@@ -358,9 +385,10 @@ struct lttng_ust_abi_event_exclusion {
        char names[LTTNG_UST_ABI_SYM_NAME_LEN][0];
 } LTTNG_PACKED;
 
-#define LTTNG_UST_ABI_CMD(minor)       (minor)
-#define LTTNG_UST_ABI_CMDR(minor, type) (minor)
-#define LTTNG_UST_ABI_CMDW(minor, type) (minor)
+#define LTTNG_UST_ABI_CMD(minor)                   (minor)
+#define LTTNG_UST_ABI_CMDR(minor, type)                    (minor)
+#define LTTNG_UST_ABI_CMDW(minor, type)                    (minor)
+#define LTTNG_UST_ABI_CMDV(minor, var_len_cmd_type) (minor)
 
 /* Handled by object descriptor */
 #define LTTNG_UST_ABI_RELEASE LTTNG_UST_ABI_CMD(0x1)
@@ -404,17 +432,20 @@ struct lttng_ust_abi_event_exclusion {
 
 /* Event notifier group commands */
 #define LTTNG_UST_ABI_EVENT_NOTIFIER_CREATE \
-       LTTNG_UST_ABI_CMDW(0xB0, struct lttng_ust_abi_event_notifier)
+       LTTNG_UST_ABI_CMDV(0xB0, struct lttng_ust_abi_event_notifier)
 
 /* Event notifier commands */
 #define LTTNG_UST_ABI_CAPTURE LTTNG_UST_ABI_CMD(0xB6)
 
 /* Session and event notifier group commands */
-#define LTTNG_UST_ABI_COUNTER LTTNG_UST_ABI_CMDW(0xC0, struct lttng_ust_abi_counter)
+/* (0xC0) reserved for old ABI. */
+#define LTTNG_UST_ABI_COUNTER LTTNG_UST_ABI_CMDV(0xC1, struct lttng_ust_abi_counter_conf)
 
 /* Counter commands */
-#define LTTNG_UST_ABI_COUNTER_GLOBAL LTTNG_UST_ABI_CMDW(0xD0, struct lttng_ust_abi_counter_global)
-#define LTTNG_UST_ABI_COUNTER_CPU    LTTNG_UST_ABI_CMDW(0xD1, struct lttng_ust_abi_counter_cpu)
+/* (0xD0, 0xD1) reserved for old ABI. */
+#define LTTNG_UST_ABI_COUNTER_GLOBAL LTTNG_UST_ABI_CMDV(0xD2, struct lttng_ust_abi_counter_global)
+#define LTTNG_UST_ABI_COUNTER_CPU    LTTNG_UST_ABI_CMDV(0xD3, struct lttng_ust_abi_counter_cpu)
+#define LTTNG_UST_ABI_COUNTER_EVENT  LTTNG_UST_ABI_CMDV(0xD4, struct lttng_ust_abi_counter_event)
 
 #define LTTNG_UST_ABI_ROOT_HANDLE 0
 
index 39f126b7a1058025570179b3dd4c86924e1f3aa0..9fef3cdcb386b0606b51934ed99b1ad9d8eaf870 100644 (file)
@@ -6617,7 +6617,7 @@ static int add_event_ust_registry(int sock,
                                  char *raw_model_emf_uri)
 {
        int ret, ret_code;
-       uint32_t event_id = 0;
+       lsu::event_id event_id = 0;
        uint64_t chan_reg_key;
        struct ust_app *app;
        struct ust_app_channel *ua_chan;
@@ -6663,7 +6663,7 @@ static int add_event_ust_registry(int sock,
                        try {
                                auto& channel = locked_registry->channel(chan_reg_key);
 
-                               /* event_id is set on success. */
+                               /* id is set on success. */
                                channel.add_event(
                                        sobjd,
                                        cobjd,
@@ -6725,7 +6725,7 @@ static int add_event_ust_registry(int sock,
                return ret;
        }
 
-       DBG3("UST registry event %s with id %" PRId32 " added successfully", name, event_id);
+       DBG_FMT("UST registry event successfully added: name={}, id={}", name, event_id);
        return ret;
 }
 
@@ -6857,6 +6857,7 @@ int ust_app_recv_notify(int sock)
                int sobjd, cobjd, loglevel_value;
                char name[LTTNG_UST_ABI_SYM_NAME_LEN], *sig, *model_emf_uri;
                size_t nr_fields;
+               uint64_t tracer_token = 0;
                struct lttng_ust_ctl_field *fields;
 
                DBG2("UST app ustctl register event received");
@@ -6869,7 +6870,8 @@ int ust_app_recv_notify(int sock)
                                                        &sig,
                                                        &nr_fields,
                                                        &fields,
-                                                       &model_emf_uri);
+                                                       &model_emf_uri,
+                                                       &tracer_token);
                if (ret < 0) {
                        if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
                                DBG3("UST app recv event failed. Application died: sock = %d",
index 79b863ce2f7f36f089e713f049d186c5ce986f71..998f884a28b5f55fa01f0fdb251e91981ee09bac 100644 (file)
 
 /* Default unix socket path */
 #define LTTNG_UST_SOCK_FILENAME \
-       "lttng-ust-sock-" __ust_stringify(LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE)
+       "lttng-ust-sock-" lttng_ust_stringify(LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE)
 
 /*
  * Shared memory files path are automatically related to shm root, e.g.
  * /dev/shm under linux.
  */
 #define LTTNG_UST_WAIT_FILENAME \
-       "lttng-ust-wait-" __ust_stringify(LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE)
-
-struct lttng_ust_shm_handle;
-struct lttng_ust_lib_ring_buffer;
+       "lttng-ust-wait-" lttng_ust_stringify(LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE)
 
 struct lttng_ust_ctl_consumer_channel_attr {
        enum lttng_ust_abi_chan_type type;
@@ -181,7 +178,7 @@ struct lttng_ust_ctl_consumer_channel;
 struct lttng_ust_ctl_consumer_stream;
 struct lttng_ust_ctl_consumer_channel_attr;
 
-int lttng_ust_ctl_get_nr_stream_per_channel();
+int lttng_ust_ctl_get_nr_stream_per_channel(void);
 
 struct lttng_ust_ctl_consumer_channel *lttng_ust_ctl_create_channel(
        struct lttng_ust_ctl_consumer_channel_attr *attr, const int *stream_fds, int nr_stream_fds);
@@ -287,7 +284,7 @@ int lttng_ust_ctl_get_instance_id(struct lttng_ust_ctl_consumer_stream *stream,
 int lttng_ust_ctl_get_current_timestamp(struct lttng_ust_ctl_consumer_stream *stream, uint64_t *ts);
 
 /* returns whether UST has perf counters support. */
-int lttng_ust_ctl_has_perf_counters();
+int lttng_ust_ctl_has_perf_counters(void);
 
 /* Regenerate the statedump. */
 int lttng_ust_ctl_regenerate_statedump(int sock, int handle);
@@ -527,13 +524,14 @@ int lttng_ust_ctl_recv_register_event(int sock,
                                                         */
                                      size_t *nr_fields,
                                      struct lttng_ust_ctl_field **fields,
-                                     char **model_emf_uri);
+                                     char **model_emf_uri,
+                                     uint64_t *user_token);
 
 /*
  * Returns 0 on success, negative error value on error.
  */
 int lttng_ust_ctl_reply_register_event(int sock,
-                                      uint32_t id, /* event id (input) */
+                                      uint64_t id, /* id (input) */
                                       int ret_code); /* return code. 0 ok, negative error */
 
 /*
@@ -591,7 +589,7 @@ enum lttng_ust_ctl_counter_alloc {
 
 struct lttng_ust_ctl_daemon_counter;
 
-int lttng_ust_ctl_get_nr_cpu_per_counter();
+int lttng_ust_ctl_get_nr_cpu_per_counter(void);
 
 struct lttng_ust_ctl_counter_dimension {
        uint64_t size;
@@ -653,6 +651,14 @@ int lttng_ust_ctl_counter_aggregate(struct lttng_ust_ctl_daemon_counter *counter
 int lttng_ust_ctl_counter_clear(struct lttng_ust_ctl_daemon_counter *counter,
                                const size_t *dimension_indexes);
 
+int lttng_ust_ctl_counter_create_event(int sock,
+                                      struct lttng_ust_abi_counter_event *counter_event,
+                                      size_t counter_event_len,
+                                      struct lttng_ust_abi_object_data *counter_data,
+                                      struct lttng_ust_abi_object_data **counter_event_data);
+
 void lttng_ust_ctl_sigbus_handle(void *addr);
 
+int lttng_ust_ctl_get_version(uint32_t *major, uint32_t *minor, uint32_t *patchlevel);
+
 #endif /* LTTNG_UST_CTL_INTERNAL_H */
index 93e031733944e72765ca6b6b1b8c2a4117b5f6b6..84ae5a4483d985b6fa2923e04e4a7cc92e0ab1bd 100644 (file)
@@ -377,9 +377,9 @@ void lsu::registry_channel::add_event(int session_objd,
                                      nonstd::optional<std::string> model_emf_uri,
                                      lttng_buffer_type buffer_type,
                                      const ust_app& app,
-                                     uint32_t& out_event_id)
+                                     lsu::event_id& out_event_id)
 {
-       uint32_t event_id;
+       lsu::event_id event_id;
        struct cds_lfht_node *nptr;
        const lttng::urcu::read_lock_guard read_lock_guard;
 
index 636de94aa9979ebfbf8a23e8d95a5a1c7a32e046..4d847a2b067d5dd5afec145f7f17bd29231f9bd8 100644 (file)
@@ -26,6 +26,8 @@ namespace ust {
 
 class registry_event;
 
+using event_id = uint64_t;
+
 class registry_channel : public lttng::sessiond::trace::stream_class {
 public:
        using registered_listener_fn = std::function<void(const registry_channel&)>;
@@ -46,7 +48,7 @@ public:
                       nonstd::optional<std::string> model_emf_uri,
                       lttng_buffer_type buffer_type,
                       const ust_app& app,
-                      uint32_t& out_event_id);
+                      event_id& out_event_id);
        ~registry_channel() override;
        registry_channel(const registry_channel&) = delete;
        registry_channel(registry_channel&&) = delete;
This page took 0.031091 seconds and 4 git commands to generate.