Fix: split UST per UID/PID default values
[lttng-tools.git] / src / bin / lttng-sessiond / channel.c
index 6c7422b292dcb3ffd21665468c0f15cc6a728180..8f835fd8b6276385dd9bc068dca7a92b0202233e 100644 (file)
@@ -33,7 +33,8 @@
 /*
  * 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;
 
@@ -49,10 +50,14 @@ struct lttng_channel *channel_new_default_attr(int dom)
                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;
@@ -61,16 +66,27 @@ struct lttng_channel *channel_new_default_attr(int dom)
                chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_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;
+                       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;
+                       break;
+               }
                break;
        default:
                goto error;     /* Not implemented */
@@ -158,7 +174,8 @@ int channel_kernel_create(struct ltt_kernel_session *ksession,
 
        /* 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;
@@ -214,7 +231,7 @@ int channel_ust_enable(struct ltt_ust_session *usess,
         * 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);
@@ -237,7 +254,7 @@ int channel_ust_create(struct ltt_ust_session *usess,
 
        /* 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;
@@ -245,11 +262,6 @@ int channel_ust_create(struct ltt_ust_session *usess,
                attr = defattr;
        }
 
-       if (attr->attr.subbuf_size < DEFAULT_UST_CHANNEL_SUBBUF_SIZE) {
-               ret = LTTNG_ERR_INVALID;
-               goto error;
-       }
-
        /*
         * Validate UST buffer size and number of buffers: must both be power of 2
         * and nonzero. We validate right here for UST, because applications will
@@ -272,8 +284,39 @@ int channel_ust_create(struct ltt_ust_session *usess,
                goto error;
        }
 
+       /*
+        * The tracefile_size should not be < to the subbuf_size, otherwise
+        * we won't be able to write the packets on disk
+        */
+       if ((attr->attr.tracefile_size > 0) &&
+                       (attr->attr.tracefile_size < attr->attr.subbuf_size)) {
+               ret = LTTNG_ERR_INVALID;
+               goto error;
+       }
+
+       /* Validate buffer type. */
+       switch (type) {
+       case LTTNG_BUFFER_PER_PID:
+               if (attr->attr.subbuf_size <
+                               default_get_ust_pid_channel_subbuf_size()) {
+                       ret = LTTNG_ERR_INVALID;
+                       goto error;
+               }
+               break;
+       case LTTNG_BUFFER_PER_UID:
+               if (attr->attr.subbuf_size <
+                               default_get_ust_uid_channel_subbuf_size()) {
+                       ret = LTTNG_ERR_INVALID;
+                       goto error;
+               }
+               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;
This page took 0.025501 seconds and 4 git commands to generate.