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,
case LTTNG_KERNEL_CONTEXT_PID_NS:
context_type_string = config_event_context_pid_ns;
break;
+ case LTTNG_KERNEL_CONTEXT_TIME_NS:
+ context_type_string = config_event_context_time_ns;
+ break;
case LTTNG_KERNEL_CONTEXT_USER_NS:
context_type_string = config_event_context_user_ns;
break;
case LTTNG_UST_CONTEXT_NET_NS:
context_type_string = config_event_context_net_ns;
break;
+ case LTTNG_UST_CONTEXT_TIME_NS:
+ context_type_string = config_event_context_time_ns;
+ break;
case LTTNG_UST_CONTEXT_PID_NS:
context_type_string = config_event_context_pid_ns;
break;
int ret;
enum lttng_ust_loglevel_type ust_loglevel_type;
- ust_event->enabled = agent_event->enabled;
+ ust_event->enabled = AGENT_EVENT_IS_ENABLED(agent_event);
ust_event->attr.instrumentation = LTTNG_UST_TRACEPOINT;
if (lttng_strncpy(ust_event->attr.name, agent_event->name,
LTTNG_SYMBOL_NAME_LEN)) {
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,
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,
{
int ret;
struct ltt_kernel_channel *kchan;
+ struct ltt_kernel_map *kmap;
assert(writer);
assert(session);
}
}
+ 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) {
goto end;
}
- if (tracking_policy == LTTNG_TRACKING_POLICY_EXCLUDE_ALL) {
- /* Tracking nothing; empty list. */
- ret = config_writer_open_element(writer, element_target_id);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
-
- /* /$element_target_id */
- ret = config_writer_close_element(writer);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- } else {
+ if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_SET) {
unsigned int i, count;
enum process_attr_tracker_status status =
process_attr_tracker_get_inclusion_set(
}
}
- /* /targets */
+ /* /values */
ret = config_writer_close_element(writer);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
break;
default:
ret = LTTNG_ERR_INVALID;
+ goto end;
}
ret = LTTNG_OK;
end:
{
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;
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);
memset(config_file_path, 0, sizeof(config_file_path));
if (!session_access_ok(session,
- LTTNG_SOCK_GET_UID_CRED(creds),
- LTTNG_SOCK_GET_GID_CRED(creds)) || session->destroyed) {
+ LTTNG_SOCK_GET_UID_CRED(creds)) || session->destroyed) {
ret = LTTNG_ERR_EPERM;
goto end;
}