OPT_BOOLEAN(0, "raw-ip", &raw_ip, "show raw ip instead of symbol"),
        OPT_END()
        };
-       const char * const kmem_usage[] = {
-               "perf kmem [<options>] {record|stat}",
+       const char *const kmem_subcommands[] = { "record", "stat", NULL };
+       const char *kmem_usage[] = {
+               NULL,
                NULL
        };
-       argc = parse_options(argc, argv, kmem_options, kmem_usage, 0);
+       argc = parse_options_subcommand(argc, argv, kmem_options,
+                                       kmem_subcommands, kmem_usage, 0);
 
        if (!argc)
                usage_with_options(kmem_usage, kmem_options);
 
        elif [[ $prev == "-e" && "${words[1]}" == @(record|stat|top) ]]; then
                evts=$($cmd list --raw-dump)
                __perfcomp_colon "$evts" "$cur"
-       # List subcommands for 'perf kvm'
-       elif [[ $prev == "kvm" ]]; then
+       # List subcommands for perf commands
+       elif [[ $prev == @(kvm|kmem) ]]; then
                subcmds=$($cmd $prev --list-cmds)
                __perfcomp_colon "$subcmds" "$cur"
        # List long option names