On Thu, Jan 25, 2018 at 10:10:04AM +0100, ufo19890607 wrote:

SNIP

>  --metric-only::
>  Only print computed metrics. Print them in a single line.
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index 406f546ad74c..427f06dc35cc 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -573,6 +573,7 @@ static int __run_perf_stat(int argc, const char **argv)
>  {
>       int interval = stat_config.interval;
>       int times = stat_config.times;
> +     int time = stat_config.time;
>       char msg[BUFSIZ];
>       unsigned long long t0, t1;
>       struct perf_evsel *counter;
> @@ -586,6 +587,9 @@ static int __run_perf_stat(int argc, const char **argv)
>       if (interval) {
>               ts.tv_sec  = interval / USEC_PER_MSEC;
>               ts.tv_nsec = (interval % USEC_PER_MSEC) * NSEC_PER_MSEC;
> +     } else if (time) {
> +             ts.tv_sec  = time / USEC_PER_MSEC;
> +             ts.tv_nsec = (time % USEC_PER_MSEC) * NSEC_PER_MSEC;

I like the idea.. it won't work with -I option, but let's
keep it like that until someone needs it ;-)

>       } else {
>               ts.tv_sec  = 1;
>               ts.tv_nsec = 0;
> @@ -698,9 +702,11 @@ static int __run_perf_stat(int argc, const char **argv)
>               perf_evlist__start_workload(evsel_list);
>               enable_counters();
>  
> -             if (interval) {
> +             if (interval || time) {
>                       while (!waitpid(child_pid, &status, WNOHANG)) {
>                               nanosleep(&ts, NULL);
> +                             if (time)
> +                                     break;
>                               process_interval();
>                               if (interval_count == true) {
>                                       if (--times == 0)
> @@ -722,7 +728,9 @@ static int __run_perf_stat(int argc, const char **argv)
>               enable_counters();
>               while (!done) {
>                       nanosleep(&ts, NULL);
> -                     if (interval) {
> +                     if (interval || time) {
> +                             if (time)
> +                                     break;

you can put the time check with break directly after nanosleep
to keep some consistency with the workload case


>                               process_interval();
>                               if (interval_count == true) {
>                                       if (--times == 0)
> @@ -1904,6 +1912,8 @@ static const struct option stat_options[] = {
>                   "print counts at regular interval in ms (>= 10)"),
>       OPT_INTEGER(0, "interval-count", &stat_config.times,
>                   "print counts for fixed number of times"),
> +     OPT_UINTEGER(0, "time", &stat_config.time,
> +                 "print counts after a period of time in ms (>= 10)"),
>       OPT_SET_UINT(0, "per-socket", &stat_config.aggr_mode,
>                    "aggregate counts per processor socket", AGGR_SOCKET),
>       OPT_SET_UINT(0, "per-core", &stat_config.aggr_mode,
> @@ -2701,7 +2711,7 @@ int cmd_stat(int argc, const char **argv)
>       int status = -EINVAL, run_idx;
>       const char *mode;
>       FILE *output = stderr;
> -     unsigned int interval;
> +     unsigned int interval, time;
>       int times;
>       const char * const stat_subcommands[] = { "record", "report" };
>  
> @@ -2734,6 +2744,7 @@ int cmd_stat(int argc, const char **argv)
>  
>       interval = stat_config.interval;
>       times = stat_config.times;
> +     time = stat_config.time;
>  
>       /*
>        * For record command the -o is already taken care of.
> @@ -2885,6 +2896,7 @@ int cmd_stat(int argc, const char **argv)
>                                  "The overhead percentage could be high in 
> some cases. "
>                                  "Please proceed with caution.\n");
>       }
> +
>       if (times && interval)
>               interval_count = true;
>       else if (times && !interval) {
> @@ -2895,6 +2907,17 @@ int cmd_stat(int argc, const char **argv)
>               goto out;
>       }
>  
> +     if (time && time < 10) {
> +             pr_err("time must be >= 10ms.\n");

what is this limitation for? please mentioned
that in comment and changelog

thanks,
jirka

Reply via email to