All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
To: Peter Zijlstra <peterz@infradead.org>
Cc: john smith <whalajam@yahoo.com>, linux-kernel@vger.kernel.org
Subject: Re: perf report for .ko files
Date: Tue, 26 Jan 2010 19:05:52 -0200	[thread overview]
Message-ID: <20100126210552.GA12567@ghostprotocols.net> (raw)
In-Reply-To: <1264533715.4283.1961.camel@laptop>

Em Tue, Jan 26, 2010 at 08:21:55PM +0100, Peter Zijlstra escreveu:
> On Mon, 2010-01-25 at 16:34 -0800, john smith wrote:
> > How can "perf report" be used to get info on (only) the specific manually loadable modules?
> > Driver entry points are reported but without full breakdown (on all the calls).
> 
> Since its sampling it could be a function is just not hit, another
> possibility is inlining of functions, we simply cannot see inlined
> functions.

Well, you could reduce the number of samples collected by asking perf record to
include only kernel samples by fiddling with these perf_event_attr fields:

     exclude_user   :  1, /* don't count user      */
     exclude_kernel :  1, /* ditto kernel          */
     exclude_hv     :  1, /* ditto hypervisor      */
     exclude_idle   :  1, /* don't count when idle */

I.e. setting exclude_user, exclude_hv and exclude_idle to 1, but this requires
a patch for tools/perf/builtin-record.c as this is not exposed yet.

Something similar to what we have in 'perf top'

    -K, --hide_kernel_symbols
                          hide kernel symbols
    -U, --hide_user_symbols
                          hide user symbols

And then increase the frequency.
 
> > If "--symbols" option is used, most of the symbols are not found.
> > ("--dsos" doesn't seem to help)
> 
> I'm not a big module user, but I think --dsos should work, if not feel
> free to send a patch to rectify this situation.

--dsos does work for kernel modules, yes:

[root@doppio linux-2.6-tip]# perf report --dsos '[e1000e]'
# dso: [e1000e]
# Samples: 110518812
#
# Overhead          Command  Symbol
# ........  ...............  ......
#
    22.98%             init  [k] e1000_clean
    21.52%             mutt  [k] e1000_clean
    17.95%             mutt  [k] e1000_intr_msi
    16.60%             init  [k] e1000_intr_msi
    11.82%         events/0  [k] e1000e_update_stats
     1.80%             mutt  [k] e1000_put_txbuf
     1.79%             mutt  [k] e1000_clean_tx_irq
     1.28%             init  [k] e1000_clean_tx_irq
     1.14%             init  [k] e1000_clean_rx_irq
     1.02%             sshd  [k] e1000_xmit_frame
     0.52%             init  [k] pci_unmap_single
     0.43%          openvpn  [k] e1000_xmit_frame
     0.29%             sshd  [k] e1000_intr_msi
     0.18%             init  [k] e1000_update_itr
     0.15%             sshd  [k] pci_dma_mapping_error
     0.15%             init  [k] pci_dma_mapping_error
     0.14%             init  [k] e1000_alloc_rx_buffers
     0.13%             sshd  [k] e1000_clean
     0.11%             init  [k] e1000_rx_checksum
#
# (For a higher level overview, try: perf report --sort comm,dso)
#
[root@doppio linux-2.6-tip]#
 
> --dsos does appear to work on my laptop (where I have iwlagn as a module
> since it sometimes needs a reload to start working, which is hard when
> build in).
> 
> perf report --dsos "[iwlagn]"

yup, exactly like my example above.
 
> does indeed give me all iwlagn hits, albeit without symbol information,
> not sure why that is, /proc/kallsyms does seem to include some iwlagn
> symbols.

but not all, in verbose mode we can see from where it gets the module
symbol information:

[root@doppio linux-2.6-tip]# perf report --verbose --dsos '[e1000e]' |
head -10
Looking at the vmlinux_path (5 entries long)
No build_id in vmlinux, ignoring it
No build_id in /boot/vmlinux, ignoring it
No build_id in /boot/vmlinux-2.6.33-rc5-tip+, ignoring it
Using /lib/modules/2.6.33-rc5-tip+/build/vmlinux for symbols
# dso: [e1000e]
# Samples: 110518812
#
# Overhead          Command  Symbol
# ........  ...............  ......
#
    22.98%             init  0x000000000001088c B [k] e1000_clean
    21.52%             mutt  0x000000000001088c B [k] e1000_clean
    17.95%             mutt  0x000000000000db5c B [k] e1000_intr_msi
    16.60%             init  0x000000000000db5c B [k] e1000_intr_msi
[root@doppio linux-2.6-tip]#

In my case, all came from the buildid-cache, the ' B ' above:

from tools/perf/util/symbol.c (should be in the man page, consider
submitting a patch for that :)):

char dso__symtab_origin(const struct dso *self)
{
        static const char origin[] = {
                [DSO__ORIG_KERNEL] =   'k',
                [DSO__ORIG_JAVA_JIT] = 'j',
                [DSO__ORIG_BUILD_ID_CACHE] = 'B',
                [DSO__ORIG_FEDORA] =   'f',
                [DSO__ORIG_UBUNTU] =   'u',
                [DSO__ORIG_BUILDID] =  'b',
                [DSO__ORIG_DSO] =      'd',
                [DSO__ORIG_KMODULE] =  'K',
        };

        if (self == NULL || self->origin == DSO__ORIG_NOT_FOUND)
                return '!';
        return origin[self->origin];
}

For further info:

Use 'perf buildid-list' to get the build-id for the kernel module used at 'perf
record' time.

[root@doppio linux-2.6-tip]# perf buildid-list | grep e1000e
05c45e33bc92bf4bbc71ddde4128a9f5f1463fcb /lib/modules/2.6.33-rc5-tip+/kernel/drivers/net/e1000e/e1000e.ko

Then look it up in the build-id cache:

[root@doppio linux-2.6-tip]# l ~/.debug/.build-id/05/c45e33bc92bf4bbc71ddde4128a9f5f1463fcb
lrwxrwxrwx 1 root root 110 2010-01-22 12:12 /root/.debug/.build-id/05/c45e33bc92bf4bbc71ddde4128a9f5f1463fcb -> ../../lib/modules/2.6.33-rc5-tip+/kernel/drivers/net/e1000e/e1000e.ko/05c45e33bc92bf4bbc71ddde4128a9f5f1463fcb
[root@doppio linux-2.6-tip]#

So indeed, at 'perf record' time we found that the file that matched the loaded
e1000e.ko file was:

/lib/modules/2.6.33-rc5-tip+/kernel/drivers/net/e1000e/e1000e.ko

by looking at its build-id ELF note and at:

/sys/module/e1000e/sections/.note.gnu.build-id

for the build-id  in the e1000e.ko loaded at that time. 

> Arnaldo might have a clue.

See above :-)

- Arnaldo

  reply	other threads:[~2010-01-26 21:06 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-26  0:34 perf report for .ko files john smith
2010-01-26 19:21 ` Peter Zijlstra
2010-01-26 21:05   ` Arnaldo Carvalho de Melo [this message]
2010-01-29 18:55     ` john smith
2010-01-29 19:15       ` Arnaldo Carvalho de Melo
2010-01-29 21:59         ` john smith
2010-01-30  6:45         ` Mike Galbraith
2010-02-03 17:28           ` Arnaldo Carvalho de Melo
2010-12-05  0:35   ` perf counters, relative costs john smith

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=20100126210552.GA12567@ghostprotocols.net \
    --to=acme@ghostprotocols.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=whalajam@yahoo.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.