#include <common/sessiond-comm/sessiond-comm.h>
#include "channel.h"
+#include "lttng-sessiond.h"
#include "kernel.h"
#include "ust-ctl.h"
#include "utils.h"
/*
* Return allocated channel attributes.
*/
-struct lttng_channel *channel_new_default_attr(int dom)
+struct lttng_channel *channel_new_default_attr(int dom,
+ enum lttng_buffer_type type)
{
struct lttng_channel *chan;
goto error;
}
+ /* Same for all domains. */
chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
+ chan->attr.tracefile_size = DEFAULT_CHANNEL_TRACEFILE_SIZE;
+ chan->attr.tracefile_count = DEFAULT_CHANNEL_TRACEFILE_COUNT;
switch (dom) {
case LTTNG_DOMAIN_KERNEL:
+ assert(type == LTTNG_BUFFER_GLOBAL);
chan->attr.subbuf_size =
default_get_kernel_channel_subbuf_size();
chan->attr.num_subbuf = DEFAULT_KERNEL_CHANNEL_SUBBUF_NUM;
chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
+ chan->attr.live_timer_interval = DEFAULT_KERNEL_CHANNEL_LIVE_TIMER;
break;
case LTTNG_DOMAIN_UST:
-#if 0
- case LTTNG_DOMAIN_UST_PID:
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
- case LTTNG_DOMAIN_UST_EXEC_NAME:
-#endif
- chan->attr.subbuf_size = default_get_ust_channel_subbuf_size();
- chan->attr.num_subbuf = DEFAULT_UST_CHANNEL_SUBBUF_NUM;
- chan->attr.output = DEFAULT_UST_CHANNEL_OUTPUT;
- chan->attr.switch_timer_interval = DEFAULT_UST_CHANNEL_SWITCH_TIMER;
- chan->attr.read_timer_interval = DEFAULT_UST_CHANNEL_READ_TIMER;
+ switch (type) {
+ case LTTNG_BUFFER_PER_UID:
+ chan->attr.subbuf_size = default_get_ust_uid_channel_subbuf_size();
+ chan->attr.num_subbuf = DEFAULT_UST_UID_CHANNEL_SUBBUF_NUM;
+ chan->attr.output = DEFAULT_UST_UID_CHANNEL_OUTPUT;
+ chan->attr.switch_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_SWITCH_TIMER;
+ chan->attr.read_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_READ_TIMER;
+ chan->attr.live_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ break;
+ case LTTNG_BUFFER_PER_PID:
+ default:
+ chan->attr.subbuf_size = default_get_ust_pid_channel_subbuf_size();
+ chan->attr.num_subbuf = DEFAULT_UST_PID_CHANNEL_SUBBUF_NUM;
+ chan->attr.output = DEFAULT_UST_PID_CHANNEL_OUTPUT;
+ chan->attr.switch_timer_interval =
+ DEFAULT_UST_PID_CHANNEL_SWITCH_TIMER;
+ chan->attr.read_timer_interval =
+ DEFAULT_UST_PID_CHANNEL_READ_TIMER;
+ chan->attr.live_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ break;
+ }
break;
default:
goto error; /* Not implemented */
/* Creating channel attributes if needed */
if (attr == NULL) {
- defattr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL);
+ defattr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
+ LTTNG_BUFFER_GLOBAL);
if (defattr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
attr = defattr;
}
+ if (ksession->snapshot_mode) {
+ /* Force channel attribute for snapshot mode. */
+ attr->attr.overwrite = 1;
+ attr->attr.output = LTTNG_EVENT_MMAP;
+ }
+
/* Channel not found, creating it */
ret = kernel_create_channel(ksession, attr);
if (ret < 0) {
* successfully created on the session daemon side so the enable-channel
* command is a success.
*/
- (void) ust_app_create_channel_glb(usess, uchan);
+ (void) ust_app_enable_channel_glb(usess, uchan);
uchan->enabled = 1;
DBG2("Channel %s enabled successfully", uchan->name);
/* Creating channel attributes if needed */
if (attr == NULL) {
- defattr = channel_new_default_attr(LTTNG_DOMAIN_UST);
+ defattr = channel_new_default_attr(LTTNG_DOMAIN_UST, type);
if (defattr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
attr = defattr;
}
- if (attr->attr.subbuf_size < DEFAULT_UST_CHANNEL_SUBBUF_SIZE) {
- ret = LTTNG_ERR_INVALID;
- goto error;
+ if (usess->snapshot_mode) {
+ /* Force channel attribute for snapshot mode. */
+ attr->attr.overwrite = 1;
+ attr->attr.output = LTTNG_EVENT_MMAP;
}
/*
goto error;
}
+ /*
+ * Invalid subbuffer size if it's lower then the page size.
+ */
+ if (attr->attr.subbuf_size < page_size) {
+ ret = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
if (!attr->attr.num_subbuf ||
(attr->attr.num_subbuf & (attr->attr.num_subbuf - 1))) {
ret = LTTNG_ERR_INVALID;
goto error;
}
+ /* Validate buffer type. */
+ switch (type) {
+ case LTTNG_BUFFER_PER_PID:
+ break;
+ case LTTNG_BUFFER_PER_UID:
+ break;
+ default:
+ ret = LTTNG_ERR_BUFFER_NOT_SUPPORTED;
+ goto error;
+ }
+
/* Create UST channel */
- uchan = trace_ust_create_channel(attr, usess->pathname);
+ uchan = trace_ust_create_channel(attr);
if (uchan == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
/* Adding the channel to the channel hash table. */
rcu_read_lock();
- lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+ if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
+ sizeof(uchan->name))) {
+ lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+ } else {
+ /*
+ * Copy channel attribute to session if this is metadata so if NO
+ * application exists we can access that data in the shadow copy during
+ * the global update of newly registered application.
+ */
+ memcpy(&usess->metadata_attr, &uchan->attr,
+ sizeof(usess->metadata_attr));
+ }
rcu_read_unlock();
DBG2("Channel %s created successfully", uchan->name);