/*
- * Copyright (C) 2014 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2014 Jérémie Galarneau <jeremie.galarneau@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.
*/
#define _LGPL_SOURCE
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) {
}
/* Return LTTNG_OK on success else a LTTNG_ERR* code. */
-static int save_id_tracker(struct config_writer *writer,
+static int save_process_attr_tracker(struct config_writer *writer,
struct ltt_session *sess,
int domain,
- enum lttng_tracker_type tracker_type)
+ enum lttng_process_attr process_attr)
{
int ret = LTTNG_OK;
- size_t nr_ids = 0, i;
- struct lttng_tracker_ids *ids = NULL;
const char *element_id_tracker, *element_target_id, *element_id;
- const struct lttng_tracker_id *id;
- enum lttng_tracker_id_status status;
- int value;
- const char *string;
-
- switch (tracker_type) {
- case LTTNG_TRACKER_PID:
- element_id_tracker = config_element_pid_tracker;
- element_target_id = config_element_target_pid;
- element_id = config_element_pid;
- break;
- case LTTNG_TRACKER_VPID:
- element_id_tracker = config_element_vpid_tracker;
- element_target_id = config_element_target_vpid;
- element_id = config_element_id;
- break;
- case LTTNG_TRACKER_UID:
- element_id_tracker = config_element_uid_tracker;
- element_target_id = config_element_target_uid;
- element_id = config_element_id;
- break;
- case LTTNG_TRACKER_VUID:
- element_id_tracker = config_element_vuid_tracker;
- element_target_id = config_element_target_vuid;
- element_id = config_element_id;
- break;
- case LTTNG_TRACKER_GID:
- element_id_tracker = config_element_gid_tracker;
- element_target_id = config_element_target_gid;
- element_id = config_element_id;
- break;
- case LTTNG_TRACKER_VGID:
- element_id_tracker = config_element_vgid_tracker;
- element_target_id = config_element_target_vgid;
- element_id = config_element_id;
+ const struct process_attr_tracker *tracker;
+ enum lttng_tracking_policy tracking_policy;
+ struct lttng_process_attr_values *values = NULL;
+
+ switch (process_attr) {
+ case LTTNG_PROCESS_ATTR_PROCESS_ID:
+ element_id_tracker = config_element_process_attr_tracker_pid;
+ element_target_id = config_element_process_attr_pid_value;
+ element_id = config_element_process_attr_id;
+ break;
+ case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
+ element_id_tracker = config_element_process_attr_tracker_vpid;
+ element_target_id = config_element_process_attr_vpid_value;
+ element_id = config_element_process_attr_id;
+ break;
+ case LTTNG_PROCESS_ATTR_USER_ID:
+ element_id_tracker = config_element_process_attr_tracker_uid;
+ element_target_id = config_element_process_attr_uid_value;
+ element_id = config_element_process_attr_id;
+ break;
+ case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
+ element_id_tracker = config_element_process_attr_tracker_vuid;
+ element_target_id = config_element_process_attr_vuid_value;
+ element_id = config_element_process_attr_id;
+ break;
+ case LTTNG_PROCESS_ATTR_GROUP_ID:
+ element_id_tracker = config_element_process_attr_tracker_gid;
+ element_target_id = config_element_process_attr_gid_value;
+ element_id = config_element_process_attr_id;
+ break;
+ case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
+ element_id_tracker = config_element_process_attr_tracker_vgid;
+ element_target_id = config_element_process_attr_vgid_value;
+ element_id = config_element_process_attr_id;
break;
default:
ret = LTTNG_ERR_SAVE_IO_FAIL;
switch (domain) {
case LTTNG_DOMAIN_KERNEL:
{
- ret = kernel_list_tracker_ids(
- tracker_type, sess->kernel_session, &ids);
- if (ret != LTTNG_OK) {
- ret = LTTNG_ERR_KERN_LIST_FAIL;
- goto end;
- }
+ tracker = kernel_get_process_attr_tracker(
+ sess->kernel_session, process_attr);
+ assert(tracker);
break;
}
case LTTNG_DOMAIN_UST:
{
- ret = trace_ust_list_tracker_ids(
- tracker_type, sess->ust_session, &ids);
- if (ret != LTTNG_OK) {
- ret = LTTNG_ERR_UST_LIST_FAIL;
- goto end;
- }
+ tracker = trace_ust_get_process_attr_tracker(
+ sess->ust_session, process_attr);
+ assert(tracker);
break;
}
case LTTNG_DOMAIN_JUL:
case LTTNG_DOMAIN_LOG4J:
case LTTNG_DOMAIN_PYTHON:
default:
- ret = LTTNG_ERR_UNKNOWN_DOMAIN;
+ ret = LTTNG_ERR_UNSUPPORTED_DOMAIN;
goto end;
}
- nr_ids = lttng_tracker_ids_get_count(ids);
-
- if (nr_ids == 1) {
- id = lttng_tracker_ids_get_at_index(ids, 0);
- if (id && lttng_tracker_id_get_type(id) == LTTNG_ID_ALL) {
- /* Tracking all, nothing to output. */
- ret = LTTNG_OK;
- goto end;
- }
+ tracking_policy = process_attr_tracker_get_tracking_policy(tracker);
+ if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_ALL) {
+ /* Tracking all, nothing to output. */
+ ret = LTTNG_OK;
+ goto end;
}
ret = config_writer_open_element(writer, element_id_tracker);
goto end;
}
- ret = config_writer_open_element(writer, config_element_targets);
+ ret = config_writer_open_element(
+ writer, config_element_process_attr_values);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
- if (nr_ids == 0) {
- /* Tracking none: empty list. */
- ret = config_writer_open_element(writer, element_target_id);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
+ if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_SET) {
+ unsigned int i, count;
+ enum process_attr_tracker_status status =
+ process_attr_tracker_get_inclusion_set(
+ tracker, &values);
- /* /$element_target_id */
- ret = config_writer_close_element(writer);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
+ if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
+ ret = LTTNG_ERR_NOMEM;
goto end;
}
- } else {
- /* Tracking list. */
- for (i = 0; i < nr_ids; i++) {
- id = lttng_tracker_ids_get_at_index(ids, i);
- if (!id) {
+
+ count = _lttng_process_attr_values_get_count(values);
+
+ for (i = 0; i < count; i++) {
+ unsigned int integral_value = UINT_MAX;
+ const char *name = NULL;
+ const struct process_attr_value *value =
+ lttng_process_attr_tracker_values_get_at_index(
+ values, i);
+
+ assert(value);
+ ret = config_writer_open_element(
+ writer, element_target_id);
+ if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
- switch (lttng_tracker_id_get_type(id)) {
- case LTTNG_ID_VALUE:
- ret = config_writer_open_element(
- writer, element_target_id);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- status = lttng_tracker_id_get_value(id, &value);
- ret = config_writer_write_element_unsigned_int(
- writer, element_id, value);
+
+ switch (value->type) {
+ case LTTNG_PROCESS_ATTR_VALUE_TYPE_PID:
+ integral_value =
+ (unsigned int) value->value.pid;
break;
- case LTTNG_ID_STRING:
- ret = config_writer_open_element(
- writer, element_target_id);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- status = lttng_tracker_id_get_string(
- id, &string);
- ret = config_writer_write_element_string(writer,
- config_element_name, string);
+ case LTTNG_PROCESS_ATTR_VALUE_TYPE_UID:
+ integral_value =
+ (unsigned int) value->value.uid;
+ break;
+ case LTTNG_PROCESS_ATTR_VALUE_TYPE_GID:
+ integral_value =
+ (unsigned int) value->value.gid;
+ break;
+ case LTTNG_PROCESS_ATTR_VALUE_TYPE_USER_NAME:
+ name = value->value.user_name;
+ assert(name);
+ break;
+ case LTTNG_PROCESS_ATTR_VALUE_TYPE_GROUP_NAME:
+ name = value->value.group_name;
+ assert(name);
break;
default:
- /* Unexpected. */
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
+ abort();
}
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
+
+ if (name) {
+ ret = config_writer_write_element_string(writer,
+ config_element_name, name);
+ } else {
+ ret = config_writer_write_element_unsigned_int(
+ writer, element_id,
+ integral_value);
}
- if (status != LTTNG_TRACKER_ID_STATUS_OK) {
+
+ if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
}
}
- /* /targets */
+ /* /values */
ret = config_writer_close_element(writer);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
ret = LTTNG_OK;
end:
- lttng_tracker_ids_destroy(ids);
+ lttng_process_attr_values_destroy(values);
return ret;
}
/* Return LTTNG_OK on success else a LTTNG_ERR* code. */
-static int save_id_trackers(struct config_writer *writer,
+static int save_process_attr_trackers(struct config_writer *writer,
struct ltt_session *sess,
int domain)
{
switch (domain) {
case LTTNG_DOMAIN_KERNEL:
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_PID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VPID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_UID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VUID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_GID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VGID);
- if (ret != LTTNG_OK)
- return ret;
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_PROCESS_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_USER_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_GROUP_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
break;
case LTTNG_DOMAIN_UST:
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VPID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VUID);
- if (ret != LTTNG_OK)
- return ret;
- ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VGID);
- if (ret != LTTNG_OK)
- return ret;
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
+ ret = save_process_attr_tracker(writer, sess, domain,
+ LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID);
+ if (ret != LTTNG_OK) {
+ goto end;
+ }
break;
default:
- return LTTNG_ERR_INVALID;
+ ret = LTTNG_ERR_INVALID;
+ goto end;
}
- return LTTNG_OK;
+ ret = LTTNG_OK;
+end:
+ return ret;
}
/* Return LTTNG_OK on success else a LTTNG_ERR* code. */
{
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_trackers);
+ ret = config_writer_open_element(
+ writer, config_element_process_attr_trackers);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
- ret = save_id_trackers(writer, session, LTTNG_DOMAIN_UST);
+ ret = save_process_attr_trackers(
+ writer, session, LTTNG_DOMAIN_UST);
if (ret != LTTNG_OK) {
goto end;
}
goto end;
}
- ret = config_writer_open_element(writer,
- config_element_trackers);
+ ret = config_writer_open_element(
+ writer, config_element_process_attr_trackers);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
- ret = save_id_trackers(writer, session, LTTNG_DOMAIN_KERNEL);
+ ret = save_process_attr_trackers(
+ writer, session, LTTNG_DOMAIN_KERNEL);
if (ret != LTTNG_OK) {
goto end;
}
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;
}