lkml.org 
[lkml]   [2016]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 52/59] perf report: Show random usage tip on the help line
    Date
    From: Namhyung Kim <namhyung@kernel.org>

    Currently perf report only shows a help message "For a higher level
    overview, try: perf report --sort comm,dso" unconditionally (even if
    the sort keys were used). Add more help tips and show randomly.

    Load tips from ${prefix}/share/doc/perf-tip/tips.txt file.

    $ perf report | tail
    0.10% swapper [kernel.vmlinux] [k] irq_exit
    0.09% swapper [kernel.vmlinux] [k] flush_smp_call_function_queue
    0.08% swapper [kernel.vmlinux] [k] native_write_msr_safe
    0.03% swapper [kernel.vmlinux] [k] group_sched_in
    0.01% perf [kernel.vmlinux] [k] native_write_msr_safe

    #
    # (Tip: Search options using a keyword: perf report -h <keyword>)
    #

    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    Acked-by: Ingo Molnar <mingo@kernel.org>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/r/1452166913-27046-1-git-send-email-namhyung@kernel.org
    [ Renamed it to perf_tip() and the parameter dirname to dirpath to fix the build on older distros ]
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/Build | 1 +
    tools/perf/Documentation/tips.txt | 14 ++++++++++++++
    tools/perf/Makefile.perf | 3 +++
    tools/perf/builtin-report.c | 2 +-
    tools/perf/config/Makefile | 6 ++++++
    tools/perf/perf.c | 4 ++++
    tools/perf/util/util.c | 27 +++++++++++++++++++++++++++
    tools/perf/util/util.h | 2 ++
    8 files changed, 58 insertions(+), 1 deletion(-)
    create mode 100644 tools/perf/Documentation/tips.txt

    diff --git a/tools/perf/Build b/tools/perf/Build
    index 00c4b8c3d8ca..6b67e6f4179f 100644
    --- a/tools/perf/Build
    +++ b/tools/perf/Build
    @@ -41,6 +41,7 @@ CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" \
    -DPREFIX="BUILD_STR($(prefix_SQ))" \
    -include $(OUTPUT)PERF-VERSION-FILE
    CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_SQ))"
    +CFLAGS_builtin-report.o += -DTIPDIR="BUILD_STR($(tipdir_SQ))"

    libperf-y += util/
    libperf-y += arch/
    diff --git a/tools/perf/Documentation/tips.txt b/tools/perf/Documentation/tips.txt
    new file mode 100644
    index 000000000000..a1c10e360db5
    --- /dev/null
    +++ b/tools/perf/Documentation/tips.txt
    @@ -0,0 +1,14 @@
    +For a higher level overview, try: perf report --sort comm,dso
    +Sample related events with: perf record -e '{cycles,instructions}:S'
    +Compare performance results with: perf diff [<old file> <new file>]
    +Boolean options have negative forms, e.g.: perf report --no-children
    +Customize output of perf script with: perf script -F event,ip,sym
    +Generate a script for your data: perf script -g <lang>
    +Save output of perf stat using: perf stat record <target workload>
    +Create an archive with symtabs to analyse on other machine: perf archive
    +Search options using a keyword: perf report -h <keyword>
    +Use parent filter to see specific call path: perf report -p <regex>
    +List events using substring match: perf list <keyword>
    +To see list of saved events and attributes: perf evlist -v
    +Use --symfs <dir> if your symbol files are in non-standard locations
    +To see callchains in a more compact form: perf report -g folded
    diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
    index 1025ea79b90b..0a22407e1d7d 100644
    --- a/tools/perf/Makefile.perf
    +++ b/tools/perf/Makefile.perf
    @@ -567,6 +567,9 @@ endif
    $(call QUIET_INSTALL, perf_completion-script) \
    $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \
    $(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
    + $(call QUIET_INSTALL, perf-tip) \
    + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \
    + $(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'

    install-tests: all install-gtk
    $(call QUIET_INSTALL, tests) \
    diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
    index f10c663af996..d5a42ee12529 100644
    --- a/tools/perf/builtin-report.c
    +++ b/tools/perf/builtin-report.c
    @@ -433,7 +433,7 @@ static int report__browse_hists(struct report *rep)
    int ret;
    struct perf_session *session = rep->session;
    struct perf_evlist *evlist = session->evlist;
    - const char *help = "For a higher level overview, try: perf report --sort comm,dso";
    + const char *help = perf_tip(TIPDIR);

    switch (use_browser) {
    case 1:
    diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
    index 18b2f96d0941..254d06e39bea 100644
    --- a/tools/perf/config/Makefile
    +++ b/tools/perf/config/Makefile
    @@ -691,6 +691,7 @@ sharedir = $(prefix)/share
    template_dir = share/perf-core/templates
    STRACE_GROUPS_DIR = share/perf-core/strace/groups
    htmldir = share/doc/perf-doc
    +tipdir = share/doc/perf-tip
    ifeq ($(prefix),/usr)
    sysconfdir = /etc
    ETC_PERFCONFIG = $(sysconfdir)/perfconfig
    @@ -717,6 +718,7 @@ infodir_SQ = $(subst ','\'',$(infodir))
    perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
    template_dir_SQ = $(subst ','\'',$(template_dir))
    htmldir_SQ = $(subst ','\'',$(htmldir))
    +tipdir_SQ = $(subst ','\'',$(tipdir))
    prefix_SQ = $(subst ','\'',$(prefix))
    sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
    libdir_SQ = $(subst ','\'',$(libdir))
    @@ -724,12 +726,15 @@ libdir_SQ = $(subst ','\'',$(libdir))
    ifneq ($(filter /%,$(firstword $(perfexecdir))),)
    perfexec_instdir = $(perfexecdir)
    STRACE_GROUPS_INSTDIR = $(STRACE_GROUPS_DIR)
    +tip_instdir = $(tipdir)
    else
    perfexec_instdir = $(prefix)/$(perfexecdir)
    STRACE_GROUPS_INSTDIR = $(prefix)/$(STRACE_GROUPS_DIR)
    +tip_instdir = $(prefix)/$(tipdir)
    endif
    perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
    STRACE_GROUPS_INSTDIR_SQ = $(subst ','\'',$(STRACE_GROUPS_INSTDIR))
    +tip_instdir_SQ = $(subst ','\'',$(tip_instdir))

    # If we install to $(HOME) we keep the traceevent default:
    # $(HOME)/.traceevent/plugins
    @@ -770,6 +775,7 @@ $(call detected_var,ETC_PERFCONFIG_SQ)
    $(call detected_var,STRACE_GROUPS_DIR_SQ)
    $(call detected_var,prefix_SQ)
    $(call detected_var,perfexecdir_SQ)
    +$(call detected_var,tipdir_SQ)
    $(call detected_var,LIBDIR)
    $(call detected_var,GTK_CFLAGS)
    $(call detected_var,PERL_EMBED_CCOPTS)
    diff --git a/tools/perf/perf.c b/tools/perf/perf.c
    index cb1d2499c45c..a929618b8eb6 100644
    --- a/tools/perf/perf.c
    +++ b/tools/perf/perf.c
    @@ -19,6 +19,8 @@
    #include "util/debug.h"
    #include <api/fs/tracing_path.h>
    #include <pthread.h>
    +#include <stdlib.h>
    +#include <time.h>

    const char perf_usage_string[] =
    "perf [--version] [--help] [OPTIONS] COMMAND [ARGS]";
    @@ -542,6 +544,8 @@ int main(int argc, const char **argv)
    if (!cmd)
    cmd = "perf-help";

    + srandom(time(NULL));
    +
    /* get debugfs/tracefs mount point from /proc/mounts */
    tracing_path_mount();

    diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
    index aff0cfd83662..88b8f8d21f58 100644
    --- a/tools/perf/util/util.c
    +++ b/tools/perf/util/util.c
    @@ -16,6 +16,8 @@
    #include <linux/kernel.h>
    #include <unistd.h>
    #include "callchain.h"
    +#include "strlist.h"
    +#include <subcmd/exec-cmd.h>

    struct callchain_param callchain_param = {
    .mode = CHAIN_GRAPH_ABS,
    @@ -663,3 +665,28 @@ fetch_kernel_version(unsigned int *puint, char *str,
    *puint = (version << 16) + (patchlevel << 8) + sublevel;
    return 0;
    }
    +
    +const char *perf_tip(const char *dirpath)
    +{
    + struct strlist *tips;
    + struct str_node *node;
    + char *tip = NULL;
    + struct strlist_config conf = {
    + .dirname = system_path(dirpath) ,
    + };
    +
    + tips = strlist__new("tips.txt", &conf);
    + if (tips == NULL || strlist__nr_entries(tips) == 1) {
    + tip = (char *)"Cannot find tips.txt file";
    + goto out;
    + }
    +
    + node = strlist__entry(tips, random() % strlist__nr_entries(tips));
    + if (asprintf(&tip, "Tip: %s", node->s) < 0)
    + tip = (char *)"Tip: get more memory! ;-)";
    +
    +out:
    + strlist__delete(tips);
    +
    + return tip;
    +}
    diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
    index 4b519c59bdc3..fe915e616f9b 100644
    --- a/tools/perf/util/util.h
    +++ b/tools/perf/util/util.h
    @@ -342,4 +342,6 @@ int fetch_kernel_version(unsigned int *puint,
    #define KVER_FMT "%d.%d.%d"
    #define KVER_PARAM(x) KVER_VERSION(x), KVER_PATCHLEVEL(x), KVER_SUBLEVEL(x)

    +const char *perf_tip(const char *dirpath);
    +
    #endif /* GIT_COMPAT_UTIL_H */
    --
    2.1.0
    \
     
     \ /
      Last update: 2016-01-08 20:01    [W:4.191 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site