Implement --shm-path option for UST sessions (per-uid channels)
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index e5595a1c3c106973bbbd285997612b98d422bca0..0af417b9cdb701f657bb34ddcf0d65a1487bb455 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <poll.h>
 #include <pthread.h>
@@ -61,7 +62,7 @@ int lttng_kconsumer_take_snapshot(struct lttng_consumer_stream *stream)
 
        ret = kernctl_snapshot(infd);
        if (ret != 0) {
-               perror("Getting sub-buffer snapshot.");
+               PERROR("Getting sub-buffer snapshot.");
                ret = -errno;
        }
 
@@ -81,7 +82,7 @@ int lttng_kconsumer_get_produced_snapshot(struct lttng_consumer_stream *stream,
 
        ret = kernctl_snapshot_get_produced(infd, pos);
        if (ret != 0) {
-               perror("kernctl_snapshot_get_produced");
+               PERROR("kernctl_snapshot_get_produced");
                ret = -errno;
        }
 
@@ -101,7 +102,7 @@ int lttng_kconsumer_get_consumed_snapshot(struct lttng_consumer_stream *stream,
 
        ret = kernctl_snapshot_get_consumed(infd, pos);
        if (ret != 0) {
-               perror("kernctl_snapshot_get_consumed");
+               PERROR("kernctl_snapshot_get_consumed");
                ret = -errno;
        }
 
@@ -114,7 +115,7 @@ int lttng_kconsumer_get_consumed_snapshot(struct lttng_consumer_stream *stream,
  * Returns 0 on success, < 0 on error
  */
 int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
-               uint64_t relayd_id, uint64_t max_stream_size,
+               uint64_t relayd_id, uint64_t nb_packets_per_stream,
                struct lttng_consumer_local_data *ctx)
 {
        int ret;
@@ -220,14 +221,9 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
                        }
                }
 
-               /*
-                * The original value is sent back if max stream size is larger than
-                * the possible size of the snapshot. Also, we asume that the session
-                * daemon should never send a maximum stream size that is lower than
-                * subbuffer size.
-                */
-               consumed_pos = consumer_get_consumed_maxsize(consumed_pos,
-                               produced_pos, max_stream_size);
+               consumed_pos = consumer_get_consume_start_pos(consumed_pos,
+                               produced_pos, nb_packets_per_stream,
+                               stream->max_sb_size);
 
                while (consumed_pos < produced_pos) {
                        ssize_t read_len;
@@ -484,7 +480,8 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.channel.tracefile_size,
                                msg.u.channel.tracefile_count, 0,
                                msg.u.channel.monitor,
-                               msg.u.channel.live_timer_interval);
+                               msg.u.channel.live_timer_interval,
+                               NULL);
                if (new_channel == NULL) {
                        lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR);
                        goto end_nosignal;
@@ -642,6 +639,10 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                switch (channel->output) {
                case CONSUMER_CHANNEL_SPLICE:
                        new_stream->output = LTTNG_EVENT_SPLICE;
+                       ret = utils_create_pipe(new_stream->splice_pipe);
+                       if (ret < 0) {
+                               goto end_nosignal;
+                       }
                        break;
                case CONSUMER_CHANNEL_MMAP:
                        new_stream->output = LTTNG_EVENT_MMAP;
@@ -774,7 +775,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                 * Send status code to session daemon.
                 */
                ret = consumer_send_status_msg(sock, ret_code);
-               if (ret < 0) {
+               if (ret < 0 || ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                        /* Somehow, the session daemon is not responding anymore. */
                        goto end_nosignal;
                }
@@ -881,7 +882,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                        ret = lttng_kconsumer_snapshot_channel(msg.u.snapshot_channel.key,
                                        msg.u.snapshot_channel.pathname,
                                        msg.u.snapshot_channel.relayd_id,
-                                       msg.u.snapshot_channel.max_stream_size,
+                                       msg.u.snapshot_channel.nb_packets_per_stream,
                                        ctx);
                        if (ret < 0) {
                                ERR("Snapshot channel failed");
@@ -1083,14 +1084,14 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
        /* Get the full subbuffer size including padding */
        err = kernctl_get_padded_subbuf_size(infd, &len);
        if (err != 0) {
-               perror("Getting sub-buffer len failed.");
+               PERROR("Getting sub-buffer len failed.");
                err = kernctl_put_subbuf(infd);
                if (err != 0) {
                        if (errno == EFAULT) {
-                               perror("Error in unreserving sub buffer\n");
+                               PERROR("Error in unreserving sub buffer\n");
                        } else if (errno == EIO) {
                                /* Should never happen with newer LTTng versions */
-                               perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                               PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                        }
                        ret = -errno;
                        goto end;
@@ -1105,10 +1106,10 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                        err = kernctl_put_subbuf(infd);
                        if (err != 0) {
                                if (errno == EFAULT) {
-                                       perror("Error in unreserving sub buffer\n");
+                                       PERROR("Error in unreserving sub buffer\n");
                                } else if (errno == EIO) {
                                        /* Should never happen with newer LTTng versions */
-                                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                                }
                                ret = -errno;
                                goto end;
@@ -1150,14 +1151,14 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                /* Get subbuffer size without padding */
                err = kernctl_get_subbuf_size(infd, &subbuf_size);
                if (err != 0) {
-                       perror("Getting sub-buffer len failed.");
+                       PERROR("Getting sub-buffer len failed.");
                        err = kernctl_put_subbuf(infd);
                        if (err != 0) {
                                if (errno == EFAULT) {
-                                       perror("Error in unreserving sub buffer\n");
+                                       PERROR("Error in unreserving sub buffer\n");
                                } else if (errno == EIO) {
                                        /* Should never happen with newer LTTng versions */
-                                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                                }
                                ret = -errno;
                                goto end;
@@ -1200,10 +1201,10 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
        err = kernctl_put_next_subbuf(infd);
        if (err != 0) {
                if (errno == EFAULT) {
-                       perror("Error in unreserving sub buffer\n");
+                       PERROR("Error in unreserving sub buffer\n");
                } else if (errno == EIO) {
                        /* Should never happen with newer LTTng versions */
-                       perror("Reader has been pushed by the writer, last sub-buffer corrupted.");
+                       PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
                }
                ret = -errno;
                goto end;
This page took 0.028095 seconds and 5 git commands to generate.