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;
+ extended_attr->blocking_timeout = DEFAULT_KERNEL_CHANNEL_BLOCKING_TIMEOUT;
extended_attr->monitor_timer_interval =
DEFAULT_KERNEL_CHANNEL_MONITOR_TIMER;
break;
DEFAULT_UST_UID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_UID_CHANNEL_BLOCKING_TIMEOUT;
extended_attr->monitor_timer_interval =
DEFAULT_UST_UID_CHANNEL_MONITOR_TIMER;
break;
DEFAULT_UST_PID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
DEFAULT_UST_PID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_PID_CHANNEL_BLOCKING_TIMEOUT;
extended_attr->monitor_timer_interval =
DEFAULT_UST_PID_CHANNEL_MONITOR_TIMER;
break;
return 0;
}
+static int channel_validate_kernel(struct lttng_channel *attr)
+{
+ /* Kernel channels do not support blocking timeout. */
+ if (((struct lttng_channel_extended *)attr->attr.extended.ptr)->blocking_timeout) {
+ return -1;
+ }
+ return 0;
+}
+
/*
* Create kernel channel of the kernel session and notify kernel thread.
*/
attr->attr.overwrite = !!ksession->snapshot_mode;
}
- /* Enforce mmap output for snapshot sessions. */
- if (ksession->snapshot_mode) {
- attr->attr.output = LTTNG_EVENT_MMAP;
- }
-
/* Validate common channel properties. */
if (channel_validate(attr) < 0) {
ret = LTTNG_ERR_INVALID;
goto error;
}
+ if (channel_validate_kernel(attr) < 0) {
+ ret = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
/* Channel not found, creating it */
ret = kernel_create_channel(ksession, attr);
if (ret < 0) {
DBG3("Channel %s already enabled. Skipping", uchan->name);
ret = LTTNG_ERR_UST_CHAN_EXIST;
goto end;
+ } else {
+ uchan->enabled = 1;
+ DBG2("Channel %s enabled successfully", uchan->name);
+ }
+
+ if (!usess->active) {
+ /*
+ * The channel will be activated against the apps
+ * when the session is started as part of the
+ * application channel "synchronize" operation.
+ */
+ goto end;
}
DBG2("Channel %s being enabled in UST domain", uchan->name);
*/
(void) ust_app_enable_channel_glb(usess, uchan);
- uchan->enabled = 1;
- DBG2("Channel %s enabled successfully", uchan->name);
end:
return ret;
struct ltt_ust_channel *uchan = NULL;
struct lttng_channel *defattr = NULL;
enum lttng_domain_type domain = LTTNG_DOMAIN_UST;
+ bool chan_published = false;
assert(usess);
goto error_free_chan;
}
- /* Enable channel for global domain */
- ret = ust_app_create_channel_glb(usess, uchan);
- if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
- ret = LTTNG_ERR_UST_CHAN_FAIL;
- goto error_free_chan;
+ if (usess->active) {
+ /* Enable channel for global domain */
+ ret = ust_app_create_channel_glb(usess, uchan);
+ if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
+ ret = LTTNG_ERR_UST_CHAN_FAIL;
+ goto error_free_chan;
+ }
}
/* Adding the channel to the channel hash table. */
if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
sizeof(uchan->name))) {
lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+ chan_published = true;
} else {
/*
* Copy channel attribute to session if this is metadata so if NO
agt = agent_create(domain);
if (!agt) {
ret = LTTNG_ERR_NOMEM;
- goto error_free_chan;
+ goto error_remove_chan;
}
agent_add(agt, usess->agents);
}
channel_attr_destroy(defattr);
return LTTNG_OK;
+error_remove_chan:
+ if (chan_published) {
+ trace_ust_delete_channel(usess->domain_global.channels, uchan);
+ }
error_free_chan:
- /*
- * No need to remove the channel from the hash table because at this point
- * it was not added hence the direct call and no call_rcu().
- */
trace_ust_destroy_channel(uchan);
error:
channel_attr_destroy(defattr);
DBG2("Channel UST %s already disabled", uchan->name);
goto end;
}
+ if (!usess->active) {
+ goto end;
+ }
DBG2("Channel %s being disabled in UST global domain", uchan->name);
/* Disable channel for global domain */