consumerd: move address computation from on_read_subbuffer_mmap
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index 0a232dcfc0bd5a430746407f57c557250f005db9..4c454da0023bc1647f3c7f9a70b6921d91a1454a 100644 (file)
@@ -16,6 +16,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include <stdint.h>
 #define _LGPL_SOURCE
 #include <assert.h>
 #include <poll.h>
@@ -109,6 +110,25 @@ int lttng_kconsumer_get_consumed_snapshot(struct lttng_consumer_stream *stream,
        return ret;
 }
 
+static
+int get_current_subbuf_addr(struct lttng_consumer_stream *stream,
+               const char **addr)
+{
+       int ret;
+       unsigned long mmap_offset;
+       const char *mmap_base = stream->mmap_base;
+
+       ret = kernctl_get_mmap_read_offset(stream->wait_fd, &mmap_offset);
+       if (ret < 0) {
+               PERROR("Failed to get mmap read offset");
+               goto error;
+       }
+
+       *addr = mmap_base + mmap_offset;
+error:
+       return ret;
+}
+
 /*
  * Take a snapshot of all the stream of a channel
  *
@@ -238,6 +258,7 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
                while (consumed_pos < produced_pos) {
                        ssize_t read_len;
                        unsigned long len, padded_len;
+                       const char *subbuf_addr;
 
                        health_code_update();
 
@@ -267,7 +288,13 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
                                goto error_put_subbuf;
                        }
 
-                       read_len = lttng_consumer_on_read_subbuffer_mmap(ctx, stream, len,
+                       ret = get_current_subbuf_addr(stream, &subbuf_addr);
+                       if (ret) {
+                               goto error_put_subbuf;
+                       }
+
+                       read_len = lttng_consumer_on_read_subbuffer_mmap(ctx,
+                                       stream, subbuf_addr, len,
                                        padded_len - len, NULL);
                        /*
                         * We write the padded len in local tracefiles but the data len
@@ -1387,6 +1414,9 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                }
                break;
        case CONSUMER_CHANNEL_MMAP:
+       {
+               const char *subbuf_addr;
+
                /* Get subbuffer size without padding */
                err = kernctl_get_subbuf_size(infd, &subbuf_size);
                if (err != 0) {
@@ -1406,13 +1436,20 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                        goto end;
                }
 
+               ret = get_current_subbuf_addr(stream, &subbuf_addr);
+               if (ret) {
+                       goto error_put_subbuf;
+               }
+
                /* Make sure the tracer is not gone mad on us! */
                assert(len >= subbuf_size);
 
                padding = len - subbuf_size;
 
                /* write the subbuffer to the tracefile */
-               ret = lttng_consumer_on_read_subbuffer_mmap(ctx, stream, subbuf_size,
+               ret = lttng_consumer_on_read_subbuffer_mmap(ctx, stream,
+                               subbuf_addr,
+                               subbuf_size,
                                padding, &index);
                /*
                 * The mmap operation should write subbuf_size amount of data when
@@ -1432,11 +1469,12 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                        write_index = 0;
                }
                break;
+       }
        default:
                ERR("Unknown output method");
                ret = -EPERM;
        }
-
+error_put_subbuf:
        err = kernctl_put_next_subbuf(infd);
        if (err != 0) {
                if (err == -EFAULT) {
This page took 0.026325 seconds and 5 git commands to generate.