HELP_FORMAT_INFO),
        OPT_END(),
        };
-       const char * const builtin_help_usage[] = {
+       const char * const builtin_help_subcommands[] = {
+               "buildid-cache", "buildid-list", "diff", "evlist", "help", "list",
+               "record", "report", "bench", "stat", "timechart", "top", "annotate",
+               "script", "sched", "kmem", "lock", "kvm", "test", "inject", "mem", "data",
+#ifdef HAVE_LIBELF_SUPPORT
+               "probe",
+#endif
+#ifdef HAVE_LIBAUDIT_SUPPORT
+               "trace",
+#endif
+       NULL };
+       const char *builtin_help_usage[] = {
                "perf help [--all] [--man|--web|--info] [command]",
                NULL
        };
 
        perf_config(perf_help_config, &help_format);
 
-       argc = parse_options(argc, argv, builtin_help_options,
-                       builtin_help_usage, 0);
+       argc = parse_options_subcommand(argc, argv, builtin_help_options,
+                       builtin_help_subcommands, builtin_help_usage, 0);
 
        if (show_all) {
                printf("\n usage: %s\n\n", perf_usage_string);
 
                __perfcomp_colon "$evts" "$cur"
        else
                # List subcommands for perf commands
-               if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched|data) ]]; then
+               if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched|data|help) ]]; then
                        subcmds=$($cmd $prev_skip_opts --list-cmds)
                        __perfcomp_colon "$subcmds" "$cur"
                fi