diff options
Diffstat (limited to 'tools/perf/bench/sched-pipe.c')
-rw-r--r-- | tools/perf/bench/sched-pipe.c | 115 |
1 files changed, 29 insertions, 86 deletions
diff --git a/tools/perf/bench/sched-pipe.c b/tools/perf/bench/sched-pipe.c index 07a8d76..69cfba8 100644 --- a/tools/perf/bench/sched-pipe.c +++ b/tools/perf/bench/sched-pipe.c @@ -7,7 +7,9 @@ * 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" @@ -26,24 +28,12 @@ #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; - -/* Use processes by default: */ -static bool threaded; +static int loops = LOOPS_DEFAULT; static const struct option options[] = { - OPT_INTEGER('l', "loop", &loops, "Specify number of loops"), - OPT_BOOLEAN('T', "threaded", &threaded, "Specify threads/process based task setup"), + OPT_INTEGER('l', "loop", &loops, + "Specify number of loops"), OPT_END() }; @@ -52,37 +42,13 @@ 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) +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? @@ -92,66 +58,43 @@ int bench_sched_pipe(int argc, const char **argv, const char *prefix __maybe_unu 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)); - gettimeofday(&start, NULL); - - for (t = 0; t < nr_threads; t++) { - td = threads + t; + pid = fork(); + assert(pid >= 0); - 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]; - } - } - - - 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; + gettimeofday(&start, NULL); - ret = pthread_join(td->pthread, NULL); - BUG_ON(ret); + 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 { - pid = fork(); - assert(pid >= 0); - - if (!pid) { - worker_thread(threads + 0); - exit(0); - } else { - worker_thread(threads + 1); + for (i = 0; i < loops; i++) { + ret = write(pipe_1[1], &m, sizeof(int)); + ret = read(pipe_2[0], &m, sizeof(int)); } - - retpid = waitpid(pid, &wait_stat, 0); - assert((retpid == pid) && WIFEXITED(wait_stat)); } gettimeofday(&stop, NULL); timersub(&stop, &start, &diff); + if (pid) { + retpid = waitpid(pid, &wait_stat, 0); + assert((retpid == pid) && WIFEXITED(wait_stat)); + } else { + exit(0); + } + switch (bench_format) { case BENCH_FORMAT_DEFAULT: - printf("# Executed %d pipe operations between two %s\n\n", - loops, threaded ? "threads" : "processes"); + printf("# Executed %d pipe operations between two tasks\n\n", + loops); result_usec = diff.tv_sec * 1000000; result_usec += diff.tv_usec; |