perf bench: Add "all" pseudo subsystem and "all" pseudo suite
authorHitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Sun, 13 Dec 2009 08:01:59 +0000 (17:01 +0900)
committerIngo Molnar <mingo@elte.hu>
Mon, 14 Dec 2009 07:51:19 +0000 (08:51 +0100)
This patch adds a new "all" pseudo subsystem and an "all" pseudo
suite. These are for testing all subsystem and its all suite, or
all suite of one subsystem.

(This patch also contains a few trivial comment fixes for
bench/* and output style fixes. I judged that there are no
necessity to make them into individual patch.)

Example of use:

| % ./perf bench sched all                      # Test all suites of sched subsystem
| # Running sched/messaging benchmark...
| # 20 sender and receiver processes per group
| # 10 groups == 400 processes run
|
|      Total time: 0.414 [sec]
|
| # Running sched/pipe benchmark...
| # Extecuted 1000000 pipe operations between two tasks
|
|      Total time: 10.999 [sec]
|
|       10.999317 usecs/op
|           90914 ops/sec
|
| % ./perf bench all                            # Test all suites of all subsystems
| # Running sched/messaging benchmark...
| # 20 sender and receiver processes per group
| # 10 groups == 400 processes run
|
|      Total time: 0.420 [sec]
|
| # Running sched/pipe benchmark...
| # Extecuted 1000000 pipe operations between two tasks
|
|      Total time: 11.741 [sec]
|
|       11.741346 usecs/op
|           85169 ops/sec
|
| # Running mem/memcpy benchmark...
| # Copying 1MB Bytes from 0x7ff33e920010 to 0x7ff3401ae010 ...
|
|      808.407437 MB/Sec

Signed-off-by: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <1260691319-4683-1-git-send-email-mitake@dcl.info.waseda.ac.jp>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/bench/sched-messaging.c
tools/perf/bench/sched-pipe.c
tools/perf/builtin-bench.c

index 605a2a959aa839e11e846e88fe47f91bb22d01e0..e249eb22b43bd0409c6179d4904951b2e1740065 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * builtin-bench-messaging.c
+ * sched-messaging.c
  *
  * messaging: Benchmark for scheduler and IPC mechanisms
  *
index 238185f97977f1d86270cd1ce50d8ab2d9b046ac..2354f3830b1e264c6f85e9a4e96305b5fd0618ee 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * builtin-bench-pipe.c
+ * sched-pipe.c
  *
  * pipe: Benchmark for pipe()
  *
@@ -87,7 +87,8 @@ int bench_sched_pipe(int argc, const char **argv,
        if (pid) {
                retpid = waitpid(pid, &wait_stat, 0);
                assert((retpid == pid) && WIFEXITED(wait_stat));
-               return 0;
+       } else {
+               exit(0);
        }
 
        switch (bench_format) {
index e043eb83092aa3576a89016f70e8698e36c97e49..46996774e55967dc1351f9bf731ebc2f0c36cc59 100644 (file)
@@ -31,6 +31,9 @@ struct bench_suite {
        const char *summary;
        int (*fn)(int, const char **, const char *);
 };
+                                               \
+/* sentinel: easy for help */
+#define suite_all { "all", "test all suite (pseudo suite)", NULL }
 
 static struct bench_suite sched_suites[] = {
        { "messaging",
@@ -39,6 +42,7 @@ static struct bench_suite sched_suites[] = {
        { "pipe",
          "Flood of communication over pipe() between two processes",
          bench_sched_pipe      },
+       suite_all,
        { NULL,
          NULL,
          NULL                  }
@@ -48,6 +52,7 @@ static struct bench_suite mem_suites[] = {
        { "memcpy",
          "Simple memory copy in various ways",
          bench_mem_memcpy },
+       suite_all,
        { NULL,
          NULL,
          NULL             }
@@ -66,6 +71,9 @@ static struct bench_subsys subsystems[] = {
        { "mem",
          "memory access performance",
          mem_suites },
+       { "all",                /* sentinel: easy for help */
+         "test all subsystem (pseudo subsystem)",
+         NULL },
        { NULL,
          NULL,
          NULL       }
@@ -75,11 +83,11 @@ static void dump_suites(int subsys_index)
 {
        int i;
 
-       printf("List of available suites for %s...\n\n",
+       printf("List of available suites for %s...\n\n",
               subsystems[subsys_index].name);
 
        for (i = 0; subsystems[subsys_index].suites[i].name; i++)
-               printf("\t%s: %s\n",
+               printf("%14s: %s\n",
                       subsystems[subsys_index].suites[i].name,
                       subsystems[subsys_index].suites[i].summary);
 
@@ -110,10 +118,10 @@ static void print_usage(void)
                printf("\t%s\n", bench_usage[i]);
        printf("\n");
 
-       printf("List of available subsystems...\n\n");
+       printf("List of available subsystems...\n\n");
 
        for (i = 0; subsystems[i].name; i++)
-               printf("\t%s: %s\n",
+               printf("%14s: %s\n",
                       subsystems[i].name, subsystems[i].summary);
        printf("\n");
 }
@@ -131,6 +139,37 @@ static int bench_str2int(char *str)
        return BENCH_FORMAT_UNKNOWN;
 }
 
+static void all_suite(struct bench_subsys *subsys)       /* FROM HERE */
+{
+       int i;
+       const char *argv[2];
+       struct bench_suite *suites = subsys->suites;
+
+       argv[1] = NULL;
+       /*
+        * TODO:
+        * preparing preset parameters for
+        * embedded, ordinary PC, HPC, etc...
+        * will be helpful
+        */
+       for (i = 0; suites[i].fn; i++) {
+               printf("# Running %s/%s benchmark...\n",
+                      subsys->name,
+                      suites[i].name);
+
+               argv[1] = suites[i].name;
+               suites[i].fn(1, argv, NULL);
+               printf("\n");
+       }
+}
+
+static void all_subsystem(void)
+{
+       int i;
+       for (i = 0; subsystems[i].suites; i++)
+               all_suite(&subsystems[i]);
+}
+
 int cmd_bench(int argc, const char **argv, const char *prefix __used)
 {
        int i, j, status = 0;
@@ -155,6 +194,11 @@ int cmd_bench(int argc, const char **argv, const char *prefix __used)
                goto end;
        }
 
+       if (!strcmp(argv[0], "all")) {
+               all_subsystem();
+               goto end;
+       }
+
        for (i = 0; subsystems[i].name; i++) {
                if (strcmp(subsystems[i].name, argv[0]))
                        continue;
@@ -165,6 +209,11 @@ int cmd_bench(int argc, const char **argv, const char *prefix __used)
                        goto end;
                }
 
+               if (!strcmp(argv[1], "all")) {
+                       all_suite(&subsystems[i]);
+                       goto end;
+               }
+
                for (j = 0; subsystems[i].suites[j].name; j++) {
                        if (strcmp(subsystems[i].suites[j].name, argv[1]))
                                continue;