Merge branch 'fix/misc' into for-linus
[safe/jmp/linux-2.6] / tools / perf / builtin-bench.c
index c7505ea..fcb9626 100644 (file)
@@ -12,6 +12,7 @@
  *
  * Available subsystem list:
  *  sched ... scheduler and IPC mechanism
+ *  mem   ... memory access performance
  *
  */
 
@@ -30,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",
@@ -38,11 +42,22 @@ static struct bench_suite sched_suites[] = {
        { "pipe",
          "Flood of communication over pipe() between two processes",
          bench_sched_pipe      },
+       suite_all,
        { NULL,
          NULL,
          NULL                  }
 };
 
+static struct bench_suite mem_suites[] = {
+       { "memcpy",
+         "Simple memory copy in various ways",
+         bench_mem_memcpy },
+       suite_all,
+       { NULL,
+         NULL,
+         NULL             }
+};
+
 struct bench_subsys {
        const char *name;
        const char *summary;
@@ -53,20 +68,26 @@ static struct bench_subsys subsystems[] = {
        { "sched",
          "scheduler and IPC mechanism",
          sched_suites },
+       { "mem",
+         "memory access performance",
+         mem_suites },
+       { "all",                /* sentinel: easy for help */
+         "test all subsystem (pseudo subsystem)",
+         NULL },
        { NULL,
          NULL,
-         NULL         }
+         NULL       }
 };
 
 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);
 
@@ -74,7 +95,7 @@ static void dump_suites(int subsys_index)
        return;
 }
 
-static char *bench_format_str;
+static const char *bench_format_str;
 int bench_format = BENCH_FORMAT_DEFAULT;
 
 static const struct option bench_options[] = {
@@ -97,15 +118,15 @@ 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");
 }
 
-static int bench_str2int(char *str)
+static int bench_str2int(const char *str)
 {
        if (!str)
                return BENCH_FORMAT_DEFAULT;
@@ -118,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;
@@ -142,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;
@@ -152,10 +209,19 @@ 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;
 
+                       if (bench_format == BENCH_FORMAT_DEFAULT)
+                               printf("# Running %s/%s benchmark...\n",
+                                      subsystems[i].name,
+                                      subsystems[i].suites[j].name);
                        status = subsystems[i].suites[j].fn(argc - 1,
                                                            argv + 1, prefix);
                        goto end;