All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jin Yao <yao.jin@linux.intel.com>
To: acme@kernel.org, jolsa@kernel.org
Cc: Linux-kernel@vger.kernel.org, ak@linux.intel.com,
	kan.liang@intel.com, milian.wolff@kdab.com,
	Jin Yao <yao.jin@linux.intel.com>
Subject: [PATCH v4 0/5] perf report: Show inline stack
Date: Fri,  3 Mar 2017 18:43:00 +0800	[thread overview]
Message-ID: <1488537785-10684-1-git-send-email-yao.jin@linux.intel.com> (raw)

v4: Remove the options "--inline-line" and "--inline-name". Just use
    a new option "--inline" to print the inline function information.
    The policy is if the inline function name can be resolved then
    print the name in priority. If the name can't be resolved, then
    print the source line number.

    For example:
    perf report --stdio --inline

    0.69%     0.00%  inline   ld-2.23.so           [.] dl_main
           |
           ---dl_main
              |
               --0.56%--_dl_relocate_object
                         |
                         ---_dl_relocate_object (inline)
                            elf_dynamic_do_Rela (inline)
  
    Following 3 patches are updated according to this change.
    perf report: Show inline stack in browser mode
    perf report: Show inline stack in stdio mode
    perf report: Create new inline option

    Followings are not changed.
    perf report: Find the inline stack for a given address
    perf report: Refactor common code in srcline.c

v3: Iterate on RIPs of all callchain entries to check if the RIP is in
    inline functions.

    Reverse the order of the inliner printout if necessary.

    Provide new options "--inline-line" / "--inline-name" to print
    inline function name or print inline function source line.

v2: Thanks so much for Arnaldo's comments!
    The modifications are:

    1. Divide v1 patch "perf report: Find the inline stack for a
       given address" into 2 patches:
       a. perf report: Refactor common code in srcline.c
       b. perf report: Find the inline stack for a given address

       Some function names are changed:
       dso_name_get -> dso__name
       ilist_apend -> inline_list__append
       get_inline_node -> dso__parse_addr_inlines
       free_inline_node -> inline_node__delete

    2. Since the function name are changed, update following patches
       accordingly.
       a. perf report: Show inline stack in stdio mode
       b. perf report: Show inline stack in browser mode

    3. Rebase to latest perf/core branch. This patch is impacted.
       a. perf report: Create a new option "--inline"

v1: Initial post

It would be useful for perf to support a mode to query the
inline stack for callgraph addresses. This would simplify
finding the right code in code that does a lot of inlining.

For example, the c code:

static inline void f3(void)
{
        int i;
        for (i = 0; i < 1000;) {

                if(i%2)
                        i++;
                else
                        i++;
        }
        printf("hello f3\n");   /* D */
}

/* < CALLCHAIN: f2 <- f1 > */
static inline void f2(void)
{
        int i;
        for (i = 0; i < 100; i++) {
                f3();   /* C */
        }
}

/* < CALLCHAIN: f1 <- main > */
static inline void f1(void)
{
        int i;
        for (i = 0; i < 100; i++) {
                f2();   /* B */
        }
}

/* < CALLCHAIN: main <- TOP > */
int main()
{
        struct timeval tv;
        time_t start, end;

        gettimeofday(&tv, NULL);
        start = end = tv.tv_sec;
        while((end - start) < 5) {
                f1();   /* A */
                gettimeofday(&tv, NULL);
                end = tv.tv_sec;
        }
        return 0;
}

The printed inline stack is:

0.05%  test2    test2              [.] main
       |
       ---/home/perf-dev/lck-2867/test/test2.c:27 (inline)
          /home/perf-dev/lck-2867/test/test2.c:35 (inline)
          /home/perf-dev/lck-2867/test/test2.c:45 (inline)
          /home/perf-dev/lck-2867/test/test2.c:61 (inline)

I tag A/B/C/D in above c code to indicate the source line,
actually the inline stack is equal to:

0.05%  test2    test2              [.] main
       |
       ---D
          C
          B
          A

Jin Yao (5): 
  perf report: Refactor common code in srcline.c
  perf report: Find the inline stack for a given address
  perf report: Create new inline option
  perf report: Show inline stack in stdio mode
  perf report: Show inline stack in browser mode

 tools/perf/Documentation/perf-report.txt |   4 +
 tools/perf/builtin-report.c              |   2 +
 tools/perf/ui/browsers/hists.c           | 168 ++++++++++++++++++++--
 tools/perf/ui/stdio/hist.c               |  76 +++++++++-
 tools/perf/util/hist.c                   |   5 +
 tools/perf/util/sort.h                   |   1 +
 tools/perf/util/srcline.c                | 237 +++++++++++++++++++++++++++----
 tools/perf/util/symbol-elf.c             |   5 +
 tools/perf/util/symbol.h                 |   5 +-
 tools/perf/util/util.h                   |  16 +++
 10 files changed, 481 insertions(+), 38 deletions(-)

-- 
2.7.4

             reply	other threads:[~2017-03-03  2:46 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-03 10:43 Jin Yao [this message]
2017-03-03 10:43 ` [PATCH v4 1/5] perf report: Refactor common code in srcline.c Jin Yao
2017-03-03 10:43 ` [PATCH v4 2/5] perf report: Find the inline stack for a given address Jin Yao
2017-03-03 10:43 ` [PATCH v4 3/5] perf report: Create new inline option Jin Yao
2017-03-03 10:43 ` [PATCH v4 4/5] perf report: Show inline stack in stdio mode Jin Yao
2017-03-03 10:43 ` [PATCH v4 5/5] perf report: Show inline stack in browser mode Jin Yao
2017-03-14  1:16 ` [PATCH v4 0/5] perf report: Show inline stack Jin, Yao
2017-03-14 12:59 ` Milian Wolff
2017-03-16 13:47   ` Jin, Yao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1488537785-10684-1-git-send-email-yao.jin@linux.intel.com \
    --to=yao.jin@linux.intel.com \
    --cc=Linux-kernel@vger.kernel.org \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@intel.com \
    --cc=milian.wolff@kdab.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.