SoW-2020-0002: Trace Hit Counters
[lttng-tools.git] / src / bin / lttng-sessiond / save.c
index 6ca756365de18f8177309c52e2d93301d6db651e..da6d948c4283c313437714362a446ac69b7166fc 100644 (file)
@@ -131,6 +131,87 @@ end:
        return ret;
 }
 
+static
+int save_map_attributes(struct config_writer *writer,
+       struct lttng_map *map)
+{
+       int ret;
+       unsigned int i;
+
+       ret = config_writer_write_element_unsigned_int(writer,
+               config_element_bitness,
+               lttng_map_get_bitness(map)==LTTNG_MAP_BITNESS_32BITS ? 32: 64);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       assert( lttng_map_get_boundary_policy(map) == LTTNG_MAP_BOUNDARY_POLICY_OVERFLOW);
+       ret = config_writer_write_element_string(writer,
+               config_element_boundary_policy, config_boundary_policy_overflow);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_write_element_bool(writer,
+                       config_element_coalesce_hits,
+                       lttng_map_get_coalesce_hits(map));
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_open_element(writer,
+                       config_element_dimensions);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+       for (i = 0; i < lttng_map_get_dimension_count(map); i++) {
+               enum lttng_map_status map_status;
+               uint64_t dim_len;
+
+               ret = config_writer_open_element(writer,
+                               config_element_dimension);
+               if (ret) {
+                       ret = LTTNG_ERR_SAVE_IO_FAIL;
+                       goto end;
+               }
+
+               map_status = lttng_map_get_dimension_length(map, i, &dim_len);
+               if (map_status != LTTNG_MAP_STATUS_OK) {
+                       ret = LTTNG_ERR_SAVE_IO_FAIL;
+                       goto end;
+               }
+
+               ret = config_writer_write_element_unsigned_int(writer,
+                       config_element_dimension_size, dim_len);
+               if (ret) {
+                       ret = LTTNG_ERR_SAVE_IO_FAIL;
+                       goto end;
+               }
+
+               /* dimension */
+               ret = config_writer_close_element(writer);
+               if (ret) {
+                       ret = LTTNG_ERR_SAVE_IO_FAIL;
+                       goto end;
+               }
+       }
+
+       /* dimensions */
+       ret = config_writer_close_element(writer);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+end:
+       return ret;
+}
+
+
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
 static
 int save_ust_channel_attributes(struct config_writer *writer,
@@ -1642,6 +1723,61 @@ end:
        return ret;
 }
 
+/* Return LTTNG_OK on success else a LTTNG_ERR* code. */
+static
+int save_kernel_map(struct config_writer *writer,
+       struct ltt_kernel_map *kmap)
+{
+       int ret;
+       const char *map_name = NULL;
+       enum lttng_map_status map_status;
+
+       assert(writer);
+       assert(kmap);
+
+       ret = config_writer_open_element(writer, config_element_map);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       map_status = lttng_map_get_name(kmap->map, &map_name);
+       if (map_status != LTTNG_MAP_STATUS_OK) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_write_element_string(writer, config_element_name,
+               map_name);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_write_element_bool(writer, config_element_enabled,
+               lttng_map_get_is_enabled(kmap->map));
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = save_map_attributes(writer, kmap->map);
+       if (ret) {
+               goto end;
+       }
+
+       /* map */
+       ret = config_writer_close_element(writer);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = LTTNG_OK;
+end:
+       return ret;
+}
+
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
 static
 int save_ust_channel(struct config_writer *writer,
@@ -1745,6 +1881,56 @@ end:
        return ret;
 }
 
+/* Return LTTNG_OK on success else a LTTNG_ERR* code. */
+static
+int save_ust_map(struct config_writer *writer,
+       struct ltt_ust_map *ust_map,
+       struct ltt_ust_session *session)
+{
+       int ret;
+
+       assert(writer);
+       assert(ust_map);
+       assert(session);
+
+       ret = config_writer_open_element(writer, config_element_map);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_write_element_string(writer, config_element_name,
+               ust_map->name);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = config_writer_write_element_bool(writer, config_element_enabled,
+               ust_map->enabled);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = save_map_attributes(writer, ust_map->map);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       /* /map */
+       ret = config_writer_close_element(writer);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
+       ret = LTTNG_OK;
+end:
+       return ret;
+}
+
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
 static
 int save_kernel_session(struct config_writer *writer,
@@ -1752,6 +1938,7 @@ int save_kernel_session(struct config_writer *writer,
 {
        int ret;
        struct ltt_kernel_channel *kchan;
+       struct ltt_kernel_map *kmap;
 
        assert(writer);
        assert(session);
@@ -1785,6 +1972,14 @@ int save_kernel_session(struct config_writer *writer,
                }
        }
 
+       cds_list_for_each_entry(kmap, &session->kernel_session->map_list.head,
+                       list) {
+               ret = save_kernel_map(writer, kmap);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+       }
+
        /* /channels */
        ret = config_writer_close_element(writer);
        if (ret) {
@@ -2085,6 +2280,7 @@ int save_ust_domain(struct config_writer *writer,
 {
        int ret;
        struct ltt_ust_channel *ust_chan;
+       struct ltt_ust_map *ust_map;
        const char *buffer_type_string;
        struct lttng_ht_node_str *node;
        struct lttng_ht_iter iter;
@@ -2155,6 +2351,32 @@ int save_ust_domain(struct config_writer *writer,
                goto end;
        }
 
+       ret = config_writer_open_element(writer, config_element_maps);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+       rcu_read_lock();
+       cds_lfht_for_each_entry(session->ust_session->domain_global.maps->ht,
+                       &iter.iter, node, node) {
+               ust_map = caa_container_of(node, struct ltt_ust_map, node);
+               if (domain == LTTNG_DOMAIN_UST) {
+                       ret = save_ust_map(writer, ust_map, session->ust_session);
+                       if (ret != LTTNG_OK) {
+                               rcu_read_unlock();
+                               goto end;
+                       }
+               }
+       }
+       rcu_read_unlock();
+
+       /* /maps */
+       ret = config_writer_close_element(writer);
+       if (ret) {
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+               goto end;
+       }
+
        if (domain == LTTNG_DOMAIN_UST) {
                ret = config_writer_open_element(
                                writer, config_element_process_attr_trackers);
This page took 0.027229 seconds and 5 git commands to generate.