X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsave.cpp;h=e8205bf7f1ff76e7aff37f84c25649948539d19e;hp=7333c50930db01aad5cdc4dc3fa9e9530034dcc0;hb=HEAD;hpb=cd9adb8b829564212158943a0d279bb35322ab30 diff --git a/src/bin/lttng-sessiond/save.cpp b/src/bin/lttng-sessiond/save.cpp index 7333c5093..b4ca4c080 100644 --- a/src/bin/lttng-sessiond/save.cpp +++ b/src/bin/lttng-sessiond/save.cpp @@ -17,10 +17,12 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -530,7 +532,6 @@ static int save_kernel_kprobe_event(struct config_writer *writer, struct ltt_ker symbol_name = addr ? nullptr : event->event->u.kretprobe.symbol_name; break; default: - LTTNG_ASSERT(1); ERR("Unsupported kernel instrumentation type."); ret = LTTNG_ERR_INVALID; goto end; @@ -1106,21 +1107,22 @@ static int save_ust_events(struct config_writer *writer, struct lttng_ht *events goto end; } - rcu_read_lock(); - cds_lfht_for_each_entry (events->ht, &iter.iter, node, node) { - event = lttng::utils::container_of(node, <t_ust_event::node); + { + lttng::urcu::read_lock_guard read_lock; - if (event->internal) { - /* Internal events must not be exposed to clients */ - continue; - } - ret = save_ust_event(writer, event); - if (ret != LTTNG_OK) { - rcu_read_unlock(); - goto end; + cds_lfht_for_each_entry (events->ht, &iter.iter, node, node) { + event = lttng::utils::container_of(node, <t_ust_event::node); + + if (event->internal) { + /* Internal events must not be exposed to clients */ + continue; + } + ret = save_ust_event(writer, event); + if (ret != LTTNG_OK) { + goto end; + } } } - rcu_read_unlock(); /* /events */ ret = config_writer_close_element(writer); @@ -1186,32 +1188,32 @@ static int save_agent_events(struct config_writer *writer, struct agent *agent) goto end; } - rcu_read_lock(); - cds_lfht_for_each_entry (agent->events->ht, &iter.iter, node, node) { - struct agent_event *agent_event; - struct ltt_ust_event fake_event; - - memset(&fake_event, 0, sizeof(fake_event)); - agent_event = lttng::utils::container_of(node, &agent_event::node); - - /* - * Initialize a fake ust event to reuse the same serialization - * function since UST and agent events contain the same info - * (and one could wonder why they don't reuse the same - * structures...). - */ - ret = init_ust_event_from_agent_event(&fake_event, agent_event); - if (ret != LTTNG_OK) { - rcu_read_unlock(); - goto end; - } - ret = save_ust_event(writer, &fake_event); - if (ret != LTTNG_OK) { - rcu_read_unlock(); - goto end; + { + lttng::urcu::read_lock_guard read_lock; + + cds_lfht_for_each_entry (agent->events->ht, &iter.iter, node, node) { + struct agent_event *agent_event; + struct ltt_ust_event fake_event; + + memset(&fake_event, 0, sizeof(fake_event)); + agent_event = lttng::utils::container_of(node, &agent_event::node); + + /* + * Initialize a fake ust event to reuse the same serialization + * function since UST and agent events contain the same info + * (and one could wonder why they don't reuse the same + * structures...). + */ + ret = init_ust_event_from_agent_event(&fake_event, agent_event); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_ust_event(writer, &fake_event); + if (ret != LTTNG_OK) { + goto end; + } } } - rcu_read_unlock(); /* /events */ ret = config_writer_close_element(writer); @@ -2035,19 +2037,20 @@ static int save_ust_domain(struct config_writer *writer, goto end; } - rcu_read_lock(); - cds_lfht_for_each_entry ( - session->ust_session->domain_global.channels->ht, &iter.iter, node, node) { - ust_chan = lttng::utils::container_of(node, <t_ust_channel::node); - if (domain == ust_chan->domain) { - ret = save_ust_channel(writer, ust_chan, session->ust_session); - if (ret != LTTNG_OK) { - rcu_read_unlock(); - goto end; + { + lttng::urcu::read_lock_guard read_lock; + + cds_lfht_for_each_entry ( + session->ust_session->domain_global.channels->ht, &iter.iter, node, node) { + ust_chan = lttng::utils::container_of(node, <t_ust_channel::node); + if (domain == ust_chan->domain) { + ret = save_ust_channel(writer, ust_chan, session->ust_session); + if (ret != LTTNG_OK) { + goto end; + } } } } - rcu_read_unlock(); /* /channels */ ret = config_writer_close_element(writer); @@ -2315,40 +2318,43 @@ static int save_snapshot_outputs(struct config_writer *writer, struct snapshot * goto end; } - rcu_read_lock(); - cds_lfht_for_each_entry (snapshot->output_ht->ht, &iter.iter, output, node.node) { - ret = config_writer_open_element(writer, config_element_output); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end_unlock; - } + { + lttng::urcu::read_lock_guard read_lock; - ret = config_writer_write_element_string(writer, config_element_name, output->name); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end_unlock; - } + cds_lfht_for_each_entry (snapshot->output_ht->ht, &iter.iter, output, node.node) { + ret = config_writer_open_element(writer, config_element_output); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end_unlock; + } - ret = config_writer_write_element_unsigned_int( - writer, config_element_max_size, output->max_size); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end_unlock; - } + ret = config_writer_write_element_string( + writer, config_element_name, output->name); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end_unlock; + } - ret = save_consumer_output(writer, output->consumer); - if (ret != LTTNG_OK) { - goto end_unlock; - } + ret = config_writer_write_element_unsigned_int( + writer, config_element_max_size, output->max_size); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end_unlock; + } - /* /output */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end_unlock; + ret = save_consumer_output(writer, output->consumer); + if (ret != LTTNG_OK) { + goto end_unlock; + } + + /* /output */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end_unlock; + } } } - rcu_read_unlock(); /* /snapshot_outputs */ ret = config_writer_close_element(writer); @@ -2361,7 +2367,6 @@ static int save_snapshot_outputs(struct config_writer *writer, struct snapshot * end: return ret; end_unlock: - rcu_read_unlock(); return ret; }