SoW-2020-0003: Trace Hit Counters
[lttng-tools.git] / src / bin / lttng-sessiond / ust-registry.h
index 414975cafc4b1f3b209e49ce5900c7373e18f2dd..1e3d2fc6be97380e6d11f118141bab5993309d1c 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #ifndef LTTNG_UST_REGISTRY_H
@@ -22,9 +12,9 @@
 #include <stdint.h>
 
 #include <common/hashtable/hashtable.h>
-#include <common/compat/uuid.h>
+#include <common/uuid.h>
 
-#include "ust-ctl.h"
+#include "lttng-ust-ctl.h"
 
 #define CTF_SPEC_MAJOR 1
 #define CTF_SPEC_MINOR 8
@@ -45,10 +35,14 @@ struct ust_registry_session {
        uint32_t next_channel_id;
        /* Once this value reaches UINT32_MAX, no more id can be allocated. */
        uint32_t used_channel_id;
+       /* Next map ID available for a newly registered map. */
+       uint32_t next_map_id;
+       /* Once this value reaches UINT32_MAX, no more id can be allocated. */
+       uint32_t used_map_id;
        /* Next enumeration ID available. */
        uint64_t next_enum_id;
        /* Universal unique identifier used by the tracer. */
-       unsigned char uuid[UUID_LEN];
+       unsigned char uuid[LTTNG_UUID_LEN];
 
        /* session ABI description */
 
@@ -71,6 +65,32 @@ struct ust_registry_session {
        /* Current version of the metadata. */
        uint64_t metadata_version;
 
+       /*
+        * Those fields are only used when a session is created with
+        * the --shm-path option. In this case, the metadata is output
+        * twice: once to the consumer, as ususal, but a second time
+        * also in the shm path directly. This is done so that a copy
+        * of the metadata that is as fresh as possible is available
+        * on the event of a crash.
+        *
+        * root_shm_path contains the shm-path provided by the user, along with
+        * the session's name and timestamp:
+        *   e.g. /tmp/my_shm/my_session-20180612-135822
+        *
+        * shm_path contains the full path of the memory buffers:
+        *   e.g. /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit
+        *
+        * metadata_path contains the full path to the metadata file that
+        * is kept for the "crash buffer" extraction:
+        *  e.g. /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit/metadata
+        *
+        * Note that this is not the trace's final metadata file. It is
+        * only meant to be used to read the contents of the ring buffers
+        * in the event of a crash.
+        *
+        * metadata_fd is a file descriptor that points to the file at
+        * 'metadata_path'.
+        */
        char root_shm_path[PATH_MAX];
        char shm_path[PATH_MAX];
        char metadata_path[PATH_MAX];
@@ -81,6 +101,12 @@ struct ust_registry_session {
         * be accessed with a RCU read side lock acquired.
         */
        struct lttng_ht *channels;
+
+       /*
+        * Hash table containing maps sent by the UST tracer. MUST
+        * be accessed with a RCU read side lock acquired.
+        */
+       struct lttng_ht *maps;
        /*
         * Unique key to identify the metadata on the consumer side.
         */
@@ -105,6 +131,10 @@ struct ust_registry_session {
         */
        uint32_t major;
        uint32_t minor;
+
+       /* The id of the parent session */
+       uint64_t tracing_id;
+       uid_t tracing_uid;
 };
 
 struct ust_registry_channel {
@@ -142,6 +172,45 @@ struct ust_registry_channel {
        struct rcu_head rcu_head;
 };
 
+struct ust_registry_map_key_ht_entry {
+       struct lttng_map_key *key;
+       struct lttng_ht_node_u64 node;
+};
+
+struct ust_registry_map_index_ht_entry {
+       uint64_t index;
+       char *formated_key;
+       struct lttng_ht_node_str node;
+};
+
+struct ust_registry_map {
+       uint64_t key;
+       /* Id set when replying to a register map. */
+       uint32_t map_id;
+
+       /* Indicates if this map registry has already been registered. */
+       unsigned int register_done;
+
+       /*
+        * Hash table containing events sent by the UST tracer. MUST be accessed
+        * with a RCU read side lock acquired.
+        */
+       struct lttng_ht *events_ht;
+       /* Next event ID available for a newly registered event. */
+       uint32_t next_event_id;
+       /* Once this value reaches UINT32_MAX, no more id can be allocated. */
+       uint32_t used_event_id;
+
+       /* tracer_token -> ust_registry_map_key_ht_entry */
+       struct lttng_ht *tracer_token_to_map_key_ht;
+       /* format key -> ust_registry_map_index_ht_entry */
+       struct lttng_ht *key_string_to_bucket_index_ht;
+
+       struct lttng_ht_node_u64 node;
+       /* For delayed reclaim */
+       struct rcu_head rcu_head;
+};
+
 /*
  * Event registered from a UST tracer sent to the session daemon. This is
  * indexed and matched by <event_name/signature>.
@@ -150,7 +219,7 @@ struct ust_registry_event {
        int id;
        /* Both objd are set by the tracer. */
        int session_objd;
-       int channel_objd;
+       int container_objd;
        /* Name of the event returned by the tracer. */
        char name[LTTNG_UST_SYM_NAME_LEN];
        char *signature;
@@ -200,7 +269,7 @@ static inline int ust_registry_is_max_id(uint32_t id)
  * Return a unique channel ID. If max is reached, the used_event_id counter is
  * returned.
  */
-static inline uint32_t ust_registry_get_next_event_id(
+static inline uint32_t ust_registry_channel_get_next_event_id(
                struct ust_registry_channel *r)
 {
        if (ust_registry_is_max_id(r->used_event_id)) {
@@ -211,6 +280,26 @@ static inline uint32_t ust_registry_get_next_event_id(
        return r->next_event_id++;
 }
 
+/*
+ * Return next available event id and increment the used counter. The
+ * ust_registry_is_max_id function MUST be called before in order to validate
+ * if the maximum number of IDs have been reached. If not, it is safe to call
+ * this function.
+ *
+ * Return a unique map ID. If max is reached, the used_event_id counter is
+ * returned.
+ */
+static inline uint32_t ust_registry_map_get_next_event_id(
+               struct ust_registry_map *r)
+{
+       if (ust_registry_is_max_id(r->used_event_id)) {
+               return r->used_event_id;
+       }
+
+       r->used_event_id++;
+       return r->next_event_id++;
+}
+
 /*
  * Return next available channel id and increment the used counter. The
  * ust_registry_is_max_id function MUST be called before in order to validate
@@ -231,6 +320,26 @@ static inline uint32_t ust_registry_get_next_chan_id(
        return r->next_channel_id++;
 }
 
+/*
+ * Return next available map id and increment the used counter. The
+ * ust_registry_is_max_id function MUST be called before in order to validate
+ * if the maximum number of IDs have been reached. If not, it is safe to call
+ * this function.
+ *
+ * Return a unique map ID. If max is reached, the used_map_id counter
+ * is returned.
+ */
+static inline uint32_t ust_registry_get_next_map_id(
+               struct ust_registry_session *r)
+{
+       if (ust_registry_is_max_id(r->used_map_id)) {
+               return r->used_map_id;
+       }
+
+       r->used_map_id++;
+       return r->next_map_id++;
+}
+
 /*
  * Return registry event count. This is read atomically.
  */
@@ -242,6 +351,7 @@ static inline uint32_t ust_registry_get_event_count(
 
 #ifdef HAVE_LIBLTTNG_UST_CTL
 
+/* Channels */
 void ust_registry_channel_destroy(struct ust_registry_session *session,
                struct ust_registry_channel *chan);
 struct ust_registry_channel *ust_registry_channel_find(
@@ -251,6 +361,19 @@ int ust_registry_channel_add(struct ust_registry_session *session,
 void ust_registry_channel_del_free(struct ust_registry_session *session,
                uint64_t key, bool notif);
 
+/* Maps */
+void ust_registry_map_destroy(struct ust_registry_session *session,
+               struct ust_registry_map *map);
+struct ust_registry_map *ust_registry_map_find(
+               struct ust_registry_session *session, uint64_t key);
+int ust_registry_map_add(struct ust_registry_session *session,
+               uint64_t key);
+void ust_registry_map_del_free(struct ust_registry_session *session,
+               uint64_t key);
+int ust_registry_map_add_token_key_mapping(struct ust_registry_session *session,
+               uint64_t map_key, uint64_t tracer_token,
+               struct lttng_map_key *key);
+
 int ust_registry_session_init(struct ust_registry_session **sessionp,
                struct ust_app *app,
                uint32_t bits_per_long,
@@ -265,17 +388,29 @@ int ust_registry_session_init(struct ust_registry_session **sessionp,
                const char *root_shm_path,
                const char *shm_path,
                uid_t euid,
-               gid_t egid);
+               gid_t egid,
+               uint64_t tracing_id,
+               uid_t tracing_uid);
 void ust_registry_session_destroy(struct ust_registry_session *session);
 
-int ust_registry_create_event(struct ust_registry_session *session,
+int ust_registry_chan_create_event(struct ust_registry_session *session,
                uint64_t chan_key, int session_objd, int channel_objd, char *name,
                char *sig, size_t nr_fields, struct ustctl_field *fields,
                int loglevel_value, char *model_emf_uri, int buffer_type,
                uint32_t *event_id_p, struct ust_app *app);
-struct ust_registry_event *ust_registry_find_event(
+struct ust_registry_event *ust_registry_chan_find_event(
                struct ust_registry_channel *chan, char *name, char *sig);
-void ust_registry_destroy_event(struct ust_registry_channel *chan,
+void ust_registry_chan_destroy_event(struct ust_registry_channel *chan,
+               struct ust_registry_event *event);
+
+int ust_registry_map_create_event(struct ust_registry_session *session,
+               uint64_t map_key, int session_objd, int map_objd, char *name,
+               char *sig, size_t nr_fields, struct ustctl_field *fields,
+               int loglevel_value, char *model_emf_uri, int buffer_type,
+               uint64_t tracer_token, uint64_t *counter_index_p, struct ust_app *app);
+struct ust_registry_event *ust_registry_map_find_event(
+               struct ust_registry_map *map, char *name, char *sig);
+void ust_registry_map_destroy_event(struct ust_registry_map *map,
                struct ust_registry_event *event);
 
 /* app can be NULL for registry shared across applications. */
@@ -325,7 +460,15 @@ int ust_registry_session_init(struct ust_registry_session **sessionp,
                uint32_t uint32_t_alignment,
                uint32_t uint64_t_alignment,
                uint32_t long_alignment,
-               int byte_order)
+               int byte_order,
+               uint32_t major,
+               uint32_t minor,
+               const char *root_shm_path,
+               const char *shm_path,
+               uid_t euid,
+               gid_t egid,
+               uint64_t tracing_id,
+               uid_t tracing_uid)
 {
        return 0;
 }
This page took 0.027824 seconds and 5 git commands to generate.