* [PATCH] perf bench sched: Add --threaded 0/1 option
@ 2013-09-17 11:42 Ingo Molnar
2013-09-23 6:52 ` Namhyung Kim
2013-10-15 5:28 ` [tip:perf/core] " tip-bot for Ingo Molnar
0 siblings, 2 replies; 4+ messages in thread
From: Ingo Molnar @ 2013-09-17 11:42 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Peter Zijlstra, Namhyung Kim, Jiri Olsa
Allow the measurement of thread versus process context switch performance.
The default stays at 'process' based measurement, like lmbench's lat_ctx
benchmark.
Sample output:
comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 0
# Running sched/pipe benchmark...
# Executed 1000000 pipe operations between two processes
Total time: 4.138 [sec]
4.138729 usecs/op
241620 ops/sec
comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 1
# Running sched/pipe benchmark...
# Executed 1000000 pipe operations between two threads
Total time: 3.667 [sec]
3.667667 usecs/op
272652 ops/sec
Signed-off-by: Ingo Molnar <mingo@kernel.org>
diff --git a/tools/perf/bench/sched-pipe.c b/tools/perf/bench/sched-pipe.c
index 69cfba8..7630dc6 100644
--- a/tools/perf/bench/sched-pipe.c
+++ b/tools/perf/bench/sched-pipe.c
@@ -28,12 +28,25 @@
#include <sys/time.h>
#include <sys/types.h>
+#include <pthread.h>
+
+struct thread_data {
+ int nr;
+ int pipe_read;
+ int pipe_write;
+ pthread_t pthread;
+};
+
#define LOOPS_DEFAULT 1000000
static int loops = LOOPS_DEFAULT;
+static int threaded = 0;
+
static const struct option options[] = {
OPT_INTEGER('l', "loop", &loops,
"Specify number of loops"),
+ OPT_INTEGER('T', "threaded", &threaded,
+ "Specify threaded/process based task setup"),
OPT_END()
};
@@ -42,13 +55,38 @@ static const char * const bench_sched_pipe_usage[] = {
NULL
};
+static void *worker_thread(void *__tdata)
+{
+ struct thread_data *td = __tdata;
+ int m = 0, i;
+ int ret;
+
+ for (i = 0; i < loops; i++) {
+ if (!td->nr) {
+ ret = read(td->pipe_read, &m, sizeof(int));
+ BUG_ON(ret != sizeof(int));
+ ret = write(td->pipe_write, &m, sizeof(int));
+ BUG_ON(ret != sizeof(int));
+ } else {
+ ret = write(td->pipe_write, &m, sizeof(int));
+ BUG_ON(ret != sizeof(int));
+ ret = read(td->pipe_read, &m, sizeof(int));
+ BUG_ON(ret != sizeof(int));
+ }
+ }
+
+ return NULL;
+}
+
int bench_sched_pipe(int argc, const char **argv,
const char *prefix __maybe_unused)
{
+ struct thread_data threads[2], *td;
int pipe_1[2], pipe_2[2];
- int m = 0, i;
struct timeval start, stop, diff;
unsigned long long result_usec = 0;
+ int nr_threads = 2;
+ int t;
/*
* why does "ret" exist?
@@ -58,43 +96,66 @@ int bench_sched_pipe(int argc, const char **argv,
int __maybe_unused ret, wait_stat;
pid_t pid, retpid __maybe_unused;
- argc = parse_options(argc, argv, options,
- bench_sched_pipe_usage, 0);
+ argc = parse_options(argc, argv, options, bench_sched_pipe_usage, 0);
BUG_ON(pipe(pipe_1));
BUG_ON(pipe(pipe_2));
- pid = fork();
- assert(pid >= 0);
-
gettimeofday(&start, NULL);
- if (!pid) {
- for (i = 0; i < loops; i++) {
- ret = read(pipe_1[0], &m, sizeof(int));
- ret = write(pipe_2[1], &m, sizeof(int));
- }
- } else {
- for (i = 0; i < loops; i++) {
- ret = write(pipe_1[1], &m, sizeof(int));
- ret = read(pipe_2[0], &m, sizeof(int));
+ for (t = 0; t < nr_threads; t++) {
+ td = threads + t;
+
+ td->nr = t;
+
+ if (t == 0) {
+ td->pipe_read = pipe_1[0];
+ td->pipe_write = pipe_2[1];
+ } else {
+ td->pipe_write = pipe_1[1];
+ td->pipe_read = pipe_2[0];
}
}
- gettimeofday(&stop, NULL);
- timersub(&stop, &start, &diff);
- if (pid) {
+ if (threaded) {
+
+ for (t = 0; t < nr_threads; t++) {
+ td = threads + t;
+
+ ret = pthread_create(&td->pthread, NULL, worker_thread, td);
+ BUG_ON(ret);
+ }
+
+ for (t = 0; t < nr_threads; t++) {
+ td = threads + t;
+
+ ret = pthread_join(td->pthread, NULL);
+ BUG_ON(ret);
+ }
+
+ } else {
+ pid = fork();
+ assert(pid >= 0);
+
+ if (!pid) {
+ worker_thread(threads + 0);
+ exit(0);
+ } else {
+ worker_thread(threads + 1);
+ }
+
retpid = waitpid(pid, &wait_stat, 0);
assert((retpid == pid) && WIFEXITED(wait_stat));
- } else {
- exit(0);
}
+ gettimeofday(&stop, NULL);
+ timersub(&stop, &start, &diff);
+
switch (bench_format) {
case BENCH_FORMAT_DEFAULT:
- printf("# Executed %d pipe operations between two tasks\n\n",
- loops);
+ printf("# Executed %d pipe operations between two %s\n\n",
+ loops, threaded ? "threads" : "processes");
result_usec = diff.tv_sec * 1000000;
result_usec += diff.tv_usec;
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] perf bench sched: Add --threaded 0/1 option 2013-09-17 11:42 [PATCH] perf bench sched: Add --threaded 0/1 option Ingo Molnar @ 2013-09-23 6:52 ` Namhyung Kim 2013-09-23 8:17 ` [PATCH] perf bench sched: Add --threaded option Ingo Molnar 2013-10-15 5:28 ` [tip:perf/core] " tip-bot for Ingo Molnar 1 sibling, 1 reply; 4+ messages in thread From: Namhyung Kim @ 2013-09-23 6:52 UTC (permalink / raw) To: Ingo Molnar Cc: Arnaldo Carvalho de Melo, linux-kernel, Peter Zijlstra, Namhyung Kim, Jiri Olsa Hi Ingo, Just a few nitpicks... On Tue, 17 Sep 2013 13:42:56 +0200, Ingo Molnar wrote: > Allow the measurement of thread versus process context switch performance. > > The default stays at 'process' based measurement, like lmbench's lat_ctx > benchmark. > > Sample output: > > comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 0 > # Running sched/pipe benchmark... > # Executed 1000000 pipe operations between two processes > > Total time: 4.138 [sec] > > 4.138729 usecs/op > 241620 ops/sec > comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 1 Why not just make it boolean? IMHO the integer argument can confuse users as they can think it a number of threads.. > # Running sched/pipe benchmark... > # Executed 1000000 pipe operations between two threads > > Total time: 3.667 [sec] > > 3.667667 usecs/op > 272652 ops/sec > > Signed-off-by: Ingo Molnar <mingo@kernel.org> > > diff --git a/tools/perf/bench/sched-pipe.c b/tools/perf/bench/sched-pipe.c > index 69cfba8..7630dc6 100644 > --- a/tools/perf/bench/sched-pipe.c > +++ b/tools/perf/bench/sched-pipe.c > @@ -28,12 +28,25 @@ > #include <sys/time.h> > #include <sys/types.h> > > +#include <pthread.h> > + > +struct thread_data { > + int nr; > + int pipe_read; > + int pipe_write; > + pthread_t pthread; > +}; > + > #define LOOPS_DEFAULT 1000000 > static int loops = LOOPS_DEFAULT; > > +static int threaded = 0; > + > static const struct option options[] = { > OPT_INTEGER('l', "loop", &loops, > "Specify number of loops"), > + OPT_INTEGER('T', "threaded", &threaded, > + "Specify threaded/process based task setup"), > OPT_END() > }; > > @@ -42,13 +55,38 @@ static const char * const bench_sched_pipe_usage[] = { > NULL > }; > > +static void *worker_thread(void *__tdata) > +{ > + struct thread_data *td = __tdata; Whitespace damaged. Otherwise looks good to me! Thanks, Namhyung > + int m = 0, i; > + int ret; > + > + for (i = 0; i < loops; i++) { > + if (!td->nr) { > + ret = read(td->pipe_read, &m, sizeof(int)); > + BUG_ON(ret != sizeof(int)); > + ret = write(td->pipe_write, &m, sizeof(int)); > + BUG_ON(ret != sizeof(int)); > + } else { > + ret = write(td->pipe_write, &m, sizeof(int)); > + BUG_ON(ret != sizeof(int)); > + ret = read(td->pipe_read, &m, sizeof(int)); > + BUG_ON(ret != sizeof(int)); > + } > + } > + > + return NULL; > +} ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] perf bench sched: Add --threaded option 2013-09-23 6:52 ` Namhyung Kim @ 2013-09-23 8:17 ` Ingo Molnar 0 siblings, 0 replies; 4+ messages in thread From: Ingo Molnar @ 2013-09-23 8:17 UTC (permalink / raw) To: Namhyung Kim Cc: Arnaldo Carvalho de Melo, linux-kernel, Peter Zijlstra, Namhyung Kim, Jiri Olsa * Namhyung Kim <namhyung@kernel.org> wrote: > Hi Ingo, > > Just a few nitpicks... > > On Tue, 17 Sep 2013 13:42:56 +0200, Ingo Molnar wrote: > > Allow the measurement of thread versus process context switch performance. > > > > The default stays at 'process' based measurement, like lmbench's lat_ctx > > benchmark. > > > > Sample output: > > > > comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 0 > > # Running sched/pipe benchmark... > > # Executed 1000000 pipe operations between two processes > > > > Total time: 4.138 [sec] > > > > 4.138729 usecs/op > > 241620 ops/sec > > comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded 1 > > Why not just make it boolean? IMHO the integer argument can confuse > users as they can think it a number of threads.. Agreed, fixed. Btw., we should allow "--flag 0/1" type of input for bool options as well, it's easier for scripting. Any other integer should be rejected, and non-integer should be interpreted as the next option. In addition, it would be nice to allow the following two aliases as well: --non-flag --dont-flag So that the following can be written: --threaded --non-threaded or, if the option name is a verb: --use-threads --dont-use-threads Instead of forcing the following incorrect grammar on users: --no-threaded --no-use-threads > > +static void *worker_thread(void *__tdata) > > +{ > > + struct thread_data *td = __tdata; > > Whitespace damaged. Otherwise looks good to me! Fixed this too - new version attached. Thanks, Ingo ---------------------------------> Subject: perf bench sched: Add --threaded option From: Ingo Molnar <mingo@kernel.org> Date: Tue, 17 Sep 2013 13:42:56 +0200 Allow the measurement of thread versus process context switch performance. The default stays at 'process' based measurement, like lmbench's lat_ctx benchmark. Sample output: comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe # Running sched/pipe benchmark... # Executed 1000000 pipe operations between two processes Total time: 4.138 [sec] 4.138729 usecs/op 241620 ops/sec comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded # Running sched/pipe benchmark... # Executed 1000000 pipe operations between two threads Total time: 3.667 [sec] 3.667667 usecs/op 272652 ops/sec Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Link: http://lkml.kernel.org/r/20130917114256.GA31159@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- tools/perf/bench/sched-pipe.c | 115 +++++++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 29 deletions(-) Index: tip/tools/perf/bench/sched-pipe.c =================================================================== --- tip.orig/tools/perf/bench/sched-pipe.c +++ tip/tools/perf/bench/sched-pipe.c @@ -7,9 +7,7 @@ * Based on pipe-test-1m.c by Ingo Molnar <mingo@redhat.com> * http://people.redhat.com/mingo/cfs-scheduler/tools/pipe-test-1m.c * Ported to perf by Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp> - * */ - #include "../perf.h" #include "../util/util.h" #include "../util/parse-options.h" @@ -28,12 +26,24 @@ #include <sys/time.h> #include <sys/types.h> +#include <pthread.h> + +struct thread_data { + int nr; + int pipe_read; + int pipe_write; + pthread_t pthread; +}; + #define LOOPS_DEFAULT 1000000 -static int loops = LOOPS_DEFAULT; +static int loops = LOOPS_DEFAULT; + +/* Use processes by default: */ +static bool threaded; static const struct option options[] = { - OPT_INTEGER('l', "loop", &loops, - "Specify number of loops"), + OPT_INTEGER('l', "loop", &loops, "Specify number of loops"), + OPT_BOOLEAN('T', "threaded", &threaded, "Specify threads/process based task setup"), OPT_END() }; @@ -42,13 +52,37 @@ static const char * const bench_sched_pi NULL }; -int bench_sched_pipe(int argc, const char **argv, - const char *prefix __maybe_unused) +static void *worker_thread(void *__tdata) { - int pipe_1[2], pipe_2[2]; + struct thread_data *td = __tdata; int m = 0, i; + int ret; + + for (i = 0; i < loops; i++) { + if (!td->nr) { + ret = read(td->pipe_read, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + ret = write(td->pipe_write, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + } else { + ret = write(td->pipe_write, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + ret = read(td->pipe_read, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + } + } + + return NULL; +} + +int bench_sched_pipe(int argc, const char **argv, const char *prefix __maybe_unused) +{ + struct thread_data threads[2], *td; + int pipe_1[2], pipe_2[2]; struct timeval start, stop, diff; unsigned long long result_usec = 0; + int nr_threads = 2; + int t; /* * why does "ret" exist? @@ -58,43 +92,66 @@ int bench_sched_pipe(int argc, const cha int __maybe_unused ret, wait_stat; pid_t pid, retpid __maybe_unused; - argc = parse_options(argc, argv, options, - bench_sched_pipe_usage, 0); + argc = parse_options(argc, argv, options, bench_sched_pipe_usage, 0); BUG_ON(pipe(pipe_1)); BUG_ON(pipe(pipe_2)); - pid = fork(); - assert(pid >= 0); - gettimeofday(&start, NULL); - if (!pid) { - for (i = 0; i < loops; i++) { - ret = read(pipe_1[0], &m, sizeof(int)); - ret = write(pipe_2[1], &m, sizeof(int)); - } - } else { - for (i = 0; i < loops; i++) { - ret = write(pipe_1[1], &m, sizeof(int)); - ret = read(pipe_2[0], &m, sizeof(int)); + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + td->nr = t; + + if (t == 0) { + td->pipe_read = pipe_1[0]; + td->pipe_write = pipe_2[1]; + } else { + td->pipe_write = pipe_1[1]; + td->pipe_read = pipe_2[0]; } } - gettimeofday(&stop, NULL); - timersub(&stop, &start, &diff); - if (pid) { + if (threaded) { + + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + ret = pthread_create(&td->pthread, NULL, worker_thread, td); + BUG_ON(ret); + } + + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + ret = pthread_join(td->pthread, NULL); + BUG_ON(ret); + } + + } else { + pid = fork(); + assert(pid >= 0); + + if (!pid) { + worker_thread(threads + 0); + exit(0); + } else { + worker_thread(threads + 1); + } + retpid = waitpid(pid, &wait_stat, 0); assert((retpid == pid) && WIFEXITED(wait_stat)); - } else { - exit(0); } + gettimeofday(&stop, NULL); + timersub(&stop, &start, &diff); + switch (bench_format) { case BENCH_FORMAT_DEFAULT: - printf("# Executed %d pipe operations between two tasks\n\n", - loops); + printf("# Executed %d pipe operations between two %s\n\n", + loops, threaded ? "threads" : "processes"); result_usec = diff.tv_sec * 1000000; result_usec += diff.tv_usec; ^ permalink raw reply [flat|nested] 4+ messages in thread
* [tip:perf/core] perf bench sched: Add --threaded option 2013-09-17 11:42 [PATCH] perf bench sched: Add --threaded 0/1 option Ingo Molnar 2013-09-23 6:52 ` Namhyung Kim @ 2013-10-15 5:28 ` tip-bot for Ingo Molnar 1 sibling, 0 replies; 4+ messages in thread From: tip-bot for Ingo Molnar @ 2013-10-15 5:28 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, hpa, mingo, a.p.zijlstra, namhyung.kim, jolsa, acme, tglx Commit-ID: a9faa0cab619fad380c2669825aa84212943d528 Gitweb: http://git.kernel.org/tip/a9faa0cab619fad380c2669825aa84212943d528 Author: Ingo Molnar <mingo@kernel.org> AuthorDate: Mon, 23 Sep 2013 10:17:35 +0200 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 11 Oct 2013 12:17:25 -0300 perf bench sched: Add --threaded option Allow the measurement of thread versus process context switch performance. The default stays at 'process' based measurement, like lmbench's lat_ctx benchmark. Sample output: comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe # Running sched/pipe benchmark... # Executed 1000000 pipe operations between two processes Total time: 4.138 [sec] 4.138729 usecs/op 241620 ops/sec comet:~/tip/tools/perf> taskset 1 ./perf bench sched pipe --threaded # Running sched/pipe benchmark... # Executed 1000000 pipe operations between two threads Total time: 3.667 [sec] 3.667667 usecs/op 272652 ops/sec Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Link: http://lkml.kernel.org/r/20130917114256.GA31159@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/bench/sched-pipe.c | 115 +++++++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 29 deletions(-) diff --git a/tools/perf/bench/sched-pipe.c b/tools/perf/bench/sched-pipe.c index 69cfba8..07a8d76 100644 --- a/tools/perf/bench/sched-pipe.c +++ b/tools/perf/bench/sched-pipe.c @@ -7,9 +7,7 @@ * Based on pipe-test-1m.c by Ingo Molnar <mingo@redhat.com> * http://people.redhat.com/mingo/cfs-scheduler/tools/pipe-test-1m.c * Ported to perf by Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp> - * */ - #include "../perf.h" #include "../util/util.h" #include "../util/parse-options.h" @@ -28,12 +26,24 @@ #include <sys/time.h> #include <sys/types.h> +#include <pthread.h> + +struct thread_data { + int nr; + int pipe_read; + int pipe_write; + pthread_t pthread; +}; + #define LOOPS_DEFAULT 1000000 -static int loops = LOOPS_DEFAULT; +static int loops = LOOPS_DEFAULT; + +/* Use processes by default: */ +static bool threaded; static const struct option options[] = { - OPT_INTEGER('l', "loop", &loops, - "Specify number of loops"), + OPT_INTEGER('l', "loop", &loops, "Specify number of loops"), + OPT_BOOLEAN('T', "threaded", &threaded, "Specify threads/process based task setup"), OPT_END() }; @@ -42,13 +52,37 @@ static const char * const bench_sched_pipe_usage[] = { NULL }; -int bench_sched_pipe(int argc, const char **argv, - const char *prefix __maybe_unused) +static void *worker_thread(void *__tdata) { - int pipe_1[2], pipe_2[2]; + struct thread_data *td = __tdata; int m = 0, i; + int ret; + + for (i = 0; i < loops; i++) { + if (!td->nr) { + ret = read(td->pipe_read, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + ret = write(td->pipe_write, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + } else { + ret = write(td->pipe_write, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + ret = read(td->pipe_read, &m, sizeof(int)); + BUG_ON(ret != sizeof(int)); + } + } + + return NULL; +} + +int bench_sched_pipe(int argc, const char **argv, const char *prefix __maybe_unused) +{ + struct thread_data threads[2], *td; + int pipe_1[2], pipe_2[2]; struct timeval start, stop, diff; unsigned long long result_usec = 0; + int nr_threads = 2; + int t; /* * why does "ret" exist? @@ -58,43 +92,66 @@ int bench_sched_pipe(int argc, const char **argv, int __maybe_unused ret, wait_stat; pid_t pid, retpid __maybe_unused; - argc = parse_options(argc, argv, options, - bench_sched_pipe_usage, 0); + argc = parse_options(argc, argv, options, bench_sched_pipe_usage, 0); BUG_ON(pipe(pipe_1)); BUG_ON(pipe(pipe_2)); - pid = fork(); - assert(pid >= 0); - gettimeofday(&start, NULL); - if (!pid) { - for (i = 0; i < loops; i++) { - ret = read(pipe_1[0], &m, sizeof(int)); - ret = write(pipe_2[1], &m, sizeof(int)); - } - } else { - for (i = 0; i < loops; i++) { - ret = write(pipe_1[1], &m, sizeof(int)); - ret = read(pipe_2[0], &m, sizeof(int)); + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + td->nr = t; + + if (t == 0) { + td->pipe_read = pipe_1[0]; + td->pipe_write = pipe_2[1]; + } else { + td->pipe_write = pipe_1[1]; + td->pipe_read = pipe_2[0]; } } - gettimeofday(&stop, NULL); - timersub(&stop, &start, &diff); - if (pid) { + if (threaded) { + + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + ret = pthread_create(&td->pthread, NULL, worker_thread, td); + BUG_ON(ret); + } + + for (t = 0; t < nr_threads; t++) { + td = threads + t; + + ret = pthread_join(td->pthread, NULL); + BUG_ON(ret); + } + + } else { + pid = fork(); + assert(pid >= 0); + + if (!pid) { + worker_thread(threads + 0); + exit(0); + } else { + worker_thread(threads + 1); + } + retpid = waitpid(pid, &wait_stat, 0); assert((retpid == pid) && WIFEXITED(wait_stat)); - } else { - exit(0); } + gettimeofday(&stop, NULL); + timersub(&stop, &start, &diff); + switch (bench_format) { case BENCH_FORMAT_DEFAULT: - printf("# Executed %d pipe operations between two tasks\n\n", - loops); + printf("# Executed %d pipe operations between two %s\n\n", + loops, threaded ? "threads" : "processes"); result_usec = diff.tv_sec * 1000000; result_usec += diff.tv_usec; ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-10-15 5:29 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-09-17 11:42 [PATCH] perf bench sched: Add --threaded 0/1 option Ingo Molnar 2013-09-23 6:52 ` Namhyung Kim 2013-09-23 8:17 ` [PATCH] perf bench sched: Add --threaded option Ingo Molnar 2013-10-15 5:28 ` [tip:perf/core] " tip-bot for Ingo Molnar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox