X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=8e972b0693cc28362fe36e9a80b040d128bed62c;hp=f5979c9b4f2cf26028c8d4f6f120349b9a0eed9c;hb=e32d7f274604b77bcd83c24994e88df3761ed658;hpb=dcabc1905756b2999886313ec33705f7571a3fb9 diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index f5979c9b4..8e972b069 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -203,16 +203,15 @@ error: */ static int extract_userspace_probe_offset_function_elf( - struct lttng_userspace_probe_location *probe_location, + const struct lttng_userspace_probe_location *probe_location, struct ltt_kernel_session *session, uint64_t *offset) { int fd; int ret = 0; const char *symbol = NULL; - struct lttng_userspace_probe_location_lookup_method *lookup = NULL; + const struct lttng_userspace_probe_location_lookup_method *lookup = NULL; enum lttng_userspace_probe_location_lookup_method_type lookup_method_type; - assert(lttng_userspace_probe_location_get_type(probe_location) == LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION); @@ -266,12 +265,12 @@ end: */ static int extract_userspace_probe_offset_tracepoint_sdt( - struct lttng_userspace_probe_location *probe_location, + const struct lttng_userspace_probe_location *probe_location, struct ltt_kernel_session *session, uint64_t **offsets, uint32_t *offsets_count) { enum lttng_userspace_probe_location_lookup_method_type lookup_method_type; - struct lttng_userspace_probe_location_lookup_method *lookup = NULL; + const struct lttng_userspace_probe_location_lookup_method *lookup = NULL; const char *probe_name = NULL, *provider_name = NULL; int ret = 0; int fd, i; @@ -342,9 +341,9 @@ static int userspace_probe_add_callsites(struct lttng_event *ev, struct ltt_kernel_session *session, int fd) { - struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL; + const struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL; enum lttng_userspace_probe_location_lookup_method_type type; - struct lttng_userspace_probe_location *location = NULL; + const struct lttng_userspace_probe_location *location = NULL; int ret; assert(ev); @@ -1234,17 +1233,18 @@ void kernel_destroy_channel(struct ltt_kernel_channel *kchan) /* * Take a snapshot for a given kernel session. * - * Return 0 on success or else return a LTTNG_ERR code. + * Return LTTNG_OK on success or else return a LTTNG_ERR code. */ -int kernel_snapshot_record(struct ltt_kernel_session *ksess, +enum lttng_error_code kernel_snapshot_record(struct ltt_kernel_session *ksess, struct snapshot_output *output, int wait, uint64_t nb_packets_per_stream) { int err, ret, saved_metadata_fd; + enum lttng_error_code status = LTTNG_OK; struct consumer_socket *socket; struct lttng_ht_iter iter; struct ltt_kernel_metadata *saved_metadata; - struct ltt_session *session; + struct ltt_session *session = NULL; uint64_t trace_archive_id; assert(ksess); @@ -1267,13 +1267,13 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, ret = kernel_open_metadata(ksess); if (ret < 0) { - ret = LTTNG_ERR_KERN_META_FAIL; + status = LTTNG_ERR_KERN_META_FAIL; goto error; } ret = kernel_open_metadata_stream(ksess); if (ret < 0) { - ret = LTTNG_ERR_KERN_META_FAIL; + status = LTTNG_ERR_KERN_META_FAIL; goto error_open_stream; } @@ -1297,19 +1297,18 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, /* Put back the saved consumer output into the session. */ ksess->consumer = saved_output; if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; + status = LTTNG_ERR_KERN_CONSUMER_FAIL; goto error_consumer; } /* For each channel, ask the consumer to snapshot it. */ cds_list_for_each_entry(chan, &ksess->channel_list.head, list) { - ret = consumer_snapshot_channel(socket, chan->key, output, 0, + status = consumer_snapshot_channel(socket, chan->key, output, 0, ksess->uid, ksess->gid, DEFAULT_KERNEL_TRACE_DIR, wait, nb_packets_per_stream, trace_archive_id); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; + if (status != LTTNG_OK) { (void) kernel_consumer_destroy_metadata(socket, ksess->metadata); goto error_consumer; @@ -1317,12 +1316,11 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, } /* Snapshot metadata, */ - ret = consumer_snapshot_channel(socket, ksess->metadata->key, output, + status = consumer_snapshot_channel(socket, ksess->metadata->key, output, 1, ksess->uid, ksess->gid, DEFAULT_KERNEL_TRACE_DIR, wait, 0, trace_archive_id); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; + if (status != LTTNG_OK) { goto error_consumer; } @@ -1333,8 +1331,6 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, (void) kernel_consumer_destroy_metadata(socket, ksess->metadata); } - ret = LTTNG_OK; - error_consumer: /* Close newly opened metadata stream. It's now on the consumer side. */ err = close(ksess->metadata_stream_fd); @@ -1348,9 +1344,11 @@ error: /* Restore metadata state.*/ ksess->metadata = saved_metadata; ksess->metadata_stream_fd = saved_metadata_fd; - + if (session) { + session_put(session); + } rcu_read_unlock(); - return ret; + return status; } /* @@ -1402,11 +1400,12 @@ error: /* * Rotate a kernel session. * - * Return 0 on success or else return a LTTNG_ERR code. + * Return LTTNG_OK on success or else an LTTng error code. */ -int kernel_rotate_session(struct ltt_session *session) +enum lttng_error_code kernel_rotate_session(struct ltt_session *session) { int ret; + enum lttng_error_code status = LTTNG_OK; struct consumer_socket *socket; struct lttng_ht_iter iter; struct ltt_kernel_session *ksess = session->kernel_session; @@ -1427,37 +1426,17 @@ int kernel_rotate_session(struct ltt_session *session) socket, node.node) { struct ltt_kernel_channel *chan; - /* - * Account the metadata channel first to make sure the - * number of channels waiting for a rotation cannot - * reach 0 before we complete the iteration over all - * the channels. - */ - ret = rotate_add_channel_pending(ksess->metadata->key, - LTTNG_DOMAIN_KERNEL, session); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; - goto error; - } - /* For each channel, ask the consumer to rotate it. */ cds_list_for_each_entry(chan, &ksess->channel_list.head, list) { - ret = rotate_add_channel_pending(chan->key, - LTTNG_DOMAIN_KERNEL, session); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; - goto error; - } - - DBG("Rotate channel %" PRIu64 ", session %s", chan->key, session->name); + DBG("Rotate kernel channel %" PRIu64 ", session %s", + chan->key, session->name); ret = consumer_rotate_channel(socket, chan->key, ksess->uid, ksess->gid, ksess->consumer, ksess->consumer->subdir, /* is_metadata_channel */ false, - session->current_archive_id, - &session->rotate_pending_relay); + session->current_archive_id); if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; + status = LTTNG_ERR_KERN_CONSUMER_FAIL; goto error; } } @@ -1469,17 +1448,14 @@ int kernel_rotate_session(struct ltt_session *session) ksess->uid, ksess->gid, ksess->consumer, ksess->consumer->subdir, /* is_metadata_channel */ true, - session->current_archive_id, - &session->rotate_pending_relay); + session->current_archive_id); if (ret < 0) { - ret = LTTNG_ERR_KERN_CONSUMER_FAIL; + status = LTTNG_ERR_KERN_CONSUMER_FAIL; goto error; } } - ret = LTTNG_OK; - error: rcu_read_unlock(); - return ret; + return status; }