X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_channels.c;h=039750bcb99dc8c7e95d902e5d26656eb3b8c3ea;hp=fbf02a0580c520fc37f9baf62cdd3ec2a962387c;hb=70d0b120691e90d81de7b38af8b845e261b5b40c;hpb=e132a0d4a23036da549cb5d09ea9170183c45543 diff --git a/src/bin/lttng/commands/enable_channels.c b/src/bin/lttng/commands/enable_channels.c index fbf02a058..039750bcb 100644 --- a/src/bin/lttng/commands/enable_channels.c +++ b/src/bin/lttng/commands/enable_channels.c @@ -28,6 +28,7 @@ #include "../command.h" #include +#include static char *opt_channels; static int opt_kernel; @@ -66,7 +67,7 @@ static struct poptOption long_options[] = { {"userspace", 'u', POPT_ARG_NONE, 0, OPT_USERSPACE, 0, 0}, {"discard", 0, POPT_ARG_NONE, 0, OPT_DISCARD, 0, 0}, {"overwrite", 0, POPT_ARG_NONE, 0, OPT_OVERWRITE, 0, 0}, - {"subbuf-size", 0, POPT_ARG_DOUBLE, 0, OPT_SUBBUF_SIZE, 0, 0}, + {"subbuf-size", 0, POPT_ARG_STRING, 0, OPT_SUBBUF_SIZE, 0, 0}, {"num-subbuf", 0, POPT_ARG_INT, 0, OPT_NUM_SUBBUF, 0, 0}, {"switch-timer", 0, POPT_ARG_INT, 0, OPT_SWITCH_TIMER, 0, 0}, {"read-timer", 0, POPT_ARG_INT, 0, OPT_READ_TIMER, 0, 0}, @@ -99,7 +100,7 @@ static void usage(FILE *ofp) DEFAULT_CHANNEL_OVERWRITE ? "" : " (default)"); fprintf(ofp, " --overwrite Flight recorder mode%s\n", DEFAULT_CHANNEL_OVERWRITE ? " (default)" : ""); - fprintf(ofp, " --subbuf-size SIZE Subbuffer size in bytes\n"); + fprintf(ofp, " --subbuf-size SIZE Subbuffer size in bytes {+k,+M,+G}\n"); fprintf(ofp, " (default: %zu, kernel default: %zu)\n", default_get_channel_subbuf_size(), default_get_kernel_channel_subbuf_size()); @@ -299,6 +300,7 @@ int cmd_enable_channels(int argc, const char **argv) int opt, ret = CMD_SUCCESS; static poptContext pc; char *session_name = NULL; + char *opt_arg = NULL; init_channel_config(); @@ -319,8 +321,22 @@ int cmd_enable_channels(int argc, const char **argv) DBG("Channel set to overwrite"); break; case OPT_SUBBUF_SIZE: - /* TODO Replace atol with strtol and check for errors */ - chan.attr.subbuf_size = atol(poptGetOptArg(pc)); + /* Parse the size */ + opt_arg = poptGetOptArg(pc); + if (utils_parse_size_suffix(opt_arg, &chan.attr.subbuf_size) < 0) { + ERR("Wrong value the --subbuf-size parameter: %s", opt_arg); + ret = CMD_ERROR; + goto end; + } + + /* Check if power of 2 */ + if ((chan.attr.subbuf_size - 1) & chan.attr.subbuf_size) { + ERR("The subbuf size is not a power of 2: %" PRIu64 " (%s)", + chan.attr.subbuf_size, opt_arg); + ret = CMD_ERROR; + goto end; + } + DBG("Channel subbuf size set to %" PRIu64, chan.attr.subbuf_size); break; case OPT_NUM_SUBBUF: