X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=ddf01044c816f179b668525c5463c60a6f3483c2;hp=6f2604c607d2c1bc5fe4c24a53a2cf0458a4053d;hb=5c786dedd0156b93984f89ba47ec841277ed7dae;hpb=5f4c2d807e49a7d1a5e149615d37ee824f0155a6 diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 6f2604c60..ddf01044c 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -822,12 +822,13 @@ void kernel_destroy_channel(struct ltt_kernel_channel *kchan) * Return 0 on success or else a negative value. */ int kernel_snapshot_record(struct ltt_kernel_session *ksess, - struct snapshot_output *output, int wait) + struct snapshot_output *output, int wait, unsigned int nb_streams) { int ret, saved_metadata_fd; struct consumer_socket *socket; struct lttng_ht_iter iter; struct ltt_kernel_metadata *saved_metadata; + uint64_t max_size_per_stream = 0; assert(ksess); assert(ksess->consumer); @@ -853,6 +854,10 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, goto error_open_stream; } + if (output->max_size > 0 && nb_streams > 0) { + max_size_per_stream = output->max_size / nb_streams; + } + /* Send metadata to consumer and snapshot everything. */ cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter, socket, node.node) { @@ -881,9 +886,20 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, /* For each channel, ask the consumer to snapshot it. */ cds_list_for_each_entry(chan, &ksess->channel_list.head, list) { + if (max_size_per_stream && + chan->channel->attr.subbuf_size > max_size_per_stream) { + ret = LTTNG_ERR_INVALID; + DBG3("Kernel snapshot record maximum stream size %" PRIu64 + " is smaller than subbuffer size of %" PRIu64, + max_size_per_stream, chan->channel->attr.subbuf_size); + goto error_consumer; + } + pthread_mutex_lock(socket->lock); ret = consumer_snapshot_channel(socket, chan->fd, output, 0, - ksess->uid, ksess->gid, DEFAULT_KERNEL_TRACE_DIR, wait); + ksess->uid, ksess->gid, + DEFAULT_KERNEL_TRACE_DIR, wait, + max_size_per_stream); pthread_mutex_unlock(socket->lock); if (ret < 0) { ret = LTTNG_ERR_KERN_CONSUMER_FAIL; @@ -894,7 +910,8 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess, /* Snapshot metadata, */ pthread_mutex_lock(socket->lock); ret = consumer_snapshot_channel(socket, ksess->metadata->fd, output, - 1, ksess->uid, ksess->gid, DEFAULT_KERNEL_TRACE_DIR, wait); + 1, ksess->uid, ksess->gid, + DEFAULT_KERNEL_TRACE_DIR, wait, max_size_per_stream); pthread_mutex_unlock(socket->lock); if (ret < 0) { ret = LTTNG_ERR_KERN_CONSUMER_FAIL;