From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: "kettenis@gnu.org" <kettenis@gnu.org>,
"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
"markus.t.metzger@gmail.com" <markus.t.metzger@gmail.com>
Subject: RE: [PATCH 08/16] linux, btrace: perf_event based branch tracing
Date: Thu, 31 May 2012 15:34:00 -0000 [thread overview]
Message-ID: <A78C989F6D9628469189715575E55B2307A9F08C@IRSMSX102.ger.corp.intel.com> (raw)
In-Reply-To: <20120530204305.GG20633@host2.jankratochvil.net>
[-- Attachment #1.1: Type: text/plain, Size: 7054 bytes --]
> -----Original Message-----
> From: Jan Kratochvil [mailto:jan.kratochvil@redhat.com]
> Sent: Wednesday, May 30, 2012 10:43 PM
> To: Metzger, Markus T
Thanks for your review!
[...]
> > +typedef unsigned char byte;
>
> Two spaces. There already exists gdb_byte.
Gdb_byte is not available in gdb/common/.
Is it OK to put the typedef into gdb/common/common-utils.h?
> > +
> > +/* A branch trace record in perf_event. */ struct perf_event_bts {
> > + unsigned long long from;
> > + unsigned long long to;
>
> 'long long' is forbidden in GDB, it will produce ARI script warnings.
> uint64_t is OK.
Fixed.
Could we put this ARI script and maybe some style checker scripts into the
gdb source tree?
> > +};
> > +
> > +/* A perf_event branch trace sample. */ struct perf_event_sample {
> > + struct perf_event_header header;
> > + struct perf_event_bts bts;
>
> GNU Coding Style forbids such alignment, just use:
> struct perf_event_header header;
> struct perf_event_bts bts;
Fixed.
> > +};
> > +
> > +static inline volatile struct perf_event_mmap_page *
> > +perf_event_header (struct btrace_target_info* tinfo) {
> > + return tinfo->buffer;
> > +}
> > +
> > +static inline size_t
> > +perf_event_mmap_size (const struct btrace_target_info *tinfo) {
> > + /* The branch trace buffer is preceded by a configuration page. */
> > + return ((tinfo->size + 1) * PAGE_SIZE);
>
> Excessive out parentheses. Multiple times.
Fixed.
> > +}
> > +
> > +static inline size_t
> > +perf_event_buffer_size (struct btrace_target_info* tinfo) {
> > + return (tinfo->size * PAGE_SIZE);
> > +}
> > +
> > +static inline const byte *
> > +perf_event_buffer_begin (struct btrace_target_info* tinfo) {
> > + return ((const byte *) tinfo->buffer) + PAGE_SIZE; }
> > +
> > +static inline const byte *
> > +perf_event_buffer_end (struct btrace_target_info* tinfo) {
> > + return perf_event_buffer_begin (tinfo) + perf_event_buffer_size
> > +(tinfo); }
> > +
> > +static inline int
> > +perf_event_skip_record (struct btrace_target_info* tinfo,
>
> Formatting:
> struct btrace_target_info *tinfo,
Fixed.
> > + const struct perf_event_bts *bts) {
> > + if (tinfo->ptr_bits)
> > + {
> > + int shift = tinfo->ptr_bits - 1;
> > +
> > + /* Branch trace records branches from kernel space to user space.
> > */
> > + if (bts->from & (1ull << shift))
>
> long long again.
Replaced with explicit type cast.
> > + return 1;
> > +
> > + /* Branch trace records branches from user space to kernel space.
> > */
> > + if (bts->to & (1ull << shift))
> > + return 1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static inline int
> > +perf_event_check_sample (const struct perf_event_sample *sample) {
> > + if (sample->header.type != PERF_RECORD_SAMPLE)
> > + return EINVAL;
>
> Here everywhere some error with description would be easier than the error
> codes passing in the callers.
I'll fix this once it is clear whether this will also work with gdbserver.
> > +
> > + if (sample->header.size != sizeof (*sample))
> > + return EINVAL;
> > +
> > + return 0;
> > +}
> > +
> > +/* Branch trace is collected in a circular buffer [begin; end) as pairs
> > of from
> > + and to addresses (plus some header).
> > +
> > + Start points into that buffer at the next sample position.
> > + We read the collected samples backwards from start.
> > +
> > + While reading the samples, we convert the information into a list of
> blocks.
> > + For two adjacent samples s1 and s2, we form a block b such that
> > b.begin
> =
> > + s1.to and b.end = s2.from.
> > +
> > + In case the buffer overflows during sampling, samples may be
> > + split. */
>
> Empty line.
Fixed.
> > +static int
> > +perf_event_read_bts (struct btrace_target_info* tinfo,
> > + const byte *begin, const byte *end, const byte
> > *start,
> > + int (*fun) (struct linux_btrace_block *, void *),
> > + void *arg)
> > +{
> > + struct perf_event_sample sample;
> > + int read = 0, size = (end - begin), errcode = 0;
> > + struct linux_btrace_block block = { 0, 0 };
> > +
> > + if (start < begin)
> > + return EINVAL;
> > +
> > + if (end < start)
> > + return EINVAL;
> > +
> > + /* The buffer may contain a partial record as its last entry (i.e. when
> > the
> > + buffer size is not a mulitple of the sample size). */ read =
> > + sizeof (sample) - 1;
> > +
> > + for (; read < size; read += sizeof (sample))
> > + {
> > + const struct perf_event_sample *psample;
> > +
> > + /* Find the next perf_event sample. */
> > + start -= sizeof (sample);
> > + if (begin <= start)
> > + psample = (const struct perf_event_sample *) start;
> > + else
> > + {
> > + int missing = (begin - start);
> Empty line.
Fixed.
[...]
> > +int
> > +linux_btrace_has_changed (struct btrace_target_info *tinfo) {
> > + volatile struct perf_event_mmap_page *header = perf_event_header
> > +(tinfo);
> Empty line.
Fixed.
> > + if (!header)
> > + return 0;
> > +
> > + return (header->data_head != tinfo->data_head); }
> > +
> > +struct btrace_target_info *
> > +linux_enable_btrace (ptid_t ptid)
> > +{
> > + struct btrace_target_info *tinfo;
> > + int pid;
> > +
> > + tinfo = xzalloc (sizeof (*tinfo));
> > + if (!tinfo)
>
> Remove, xzalloc can never return NULL.
Fixed.
[...]
> > +#else /* HAVE_LINUX_PERF_EVENT_H */
>
> GNU Coding Standards say here should be:
> #else /* !HAVE_LINUX_PERF_EVENT_H */
> (they say "not" but GDB uses !)
Fixed.
[...]
> > +#endif /* HAVE_LINUX_PERF_EVENT_H */
>
> And !HAVE_LINUX_PERF_EVENT_H again.
Fixed.
[...]
> > + /* The mmap configuration mapping the branch trace perf_event buffer.
> > +
> > + file .. the file descriptor
> > + buffer .. the mmapped memory buffer
> > + size .. the buffer's size in pages without the configuration
> > page
> > + data_head .. the data head from the last read */
> > + int file;
> > + void *buffer;
> > + size_t size;
>
> GNU Coding Style - no indentation of the names.
Fixed.
> > + unsigned long data_head;
> > +#endif /* HAVE_LINUX_PERF_EVENT_H */
> > +
> > + /* The size of a pointer in bits for this thread.
> > + The information is used to identify kernel addresses in order to
> > skip
> > + records from/to kernel space. */
> > + int ptr_bits;
> > +};
> > +
> > +extern int linux_supports_btrace (void); extern struct
> > +btrace_target_info *linux_enable_btrace (ptid_t); extern int
> > +linux_disable_btrace (struct btrace_target_info *); extern int
> > +linux_btrace_has_changed (struct btrace_target_info *); extern int
> > +linux_read_btrace (struct btrace_target_info *,
> > + int (*) (struct linux_btrace_block *, void
> > *),
> > + void *);
>
> Tabs, not spaces, everywhere.
Fixed.
Regards,
Markus.
[-- Attachment #1.2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 7228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 417 bytes --]
--------------------------------------------------------------------------------------
Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Douglas Lusk, Peter Gleissner, Hannes Schwaderer
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052
next prev parent reply other threads:[~2012-05-31 15:34 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-23 11:23 [PATCH 00/16] branch tracing support (resend) markus.t.metzger
2012-05-23 11:24 ` [PATCH 10/16] btrace, config: enable btrace for 32bit and 64bit linux native markus.t.metzger
2012-05-23 11:24 ` [PATCH 06/16] configure: add check for perf_event header markus.t.metzger
2012-05-30 20:43 ` Jan Kratochvil
2012-05-31 15:34 ` Metzger, Markus T
2012-06-22 20:40 ` Tom Tromey
2012-06-25 8:50 ` Metzger, Markus T
2012-05-23 11:24 ` [PATCH 02/16] source: add flags to print_source_lines () markus.t.metzger
2012-05-30 20:41 ` Jan Kratochvil
2012-05-31 15:34 ` Metzger, Markus T
2012-06-22 20:08 ` Tom Tromey
2012-06-25 8:50 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 15/16] gdbserver, btrace: add generic btrace support markus.t.metzger
2012-05-23 11:25 ` [PATCH 16/16] gdbserver, linux, btrace: add btrace support for linux-low markus.t.metzger
2012-05-23 11:25 ` [PATCH 13/16] xml, btrace: define btrace xml document style markus.t.metzger
2012-05-30 20:44 ` Jan Kratochvil
2012-06-01 8:39 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 03/16] source, disasm: optionally prefix source lines with filename markus.t.metzger
2012-05-30 20:41 ` Jan Kratochvil
2012-05-23 11:25 ` [PATCH 01/16] disas: add precise instructions flag markus.t.metzger
2012-05-23 11:25 ` [PATCH 14/16] remote, btrace: add branch trace remote ops markus.t.metzger
2012-05-30 20:44 ` Jan Kratochvil
2012-06-01 8:49 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 08/16] linux, btrace: perf_event based branch tracing markus.t.metzger
2012-05-30 20:43 ` Jan Kratochvil
2012-05-31 15:34 ` Metzger, Markus T [this message]
2012-05-23 11:25 ` [PATCH 04/16] thread, btrace: add generic branch trace support markus.t.metzger
2012-05-30 20:42 ` Jan Kratochvil
2012-05-31 15:33 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 05/16] cli, btrace: add btrace cli markus.t.metzger
2012-05-30 20:42 ` Jan Kratochvil
2012-05-31 15:33 ` Metzger, Markus T
2012-06-01 18:42 ` Jan Kratochvil
2012-06-05 9:56 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 11/16] test, btrace: add branch trace tests markus.t.metzger
2012-05-30 20:44 ` Jan Kratochvil
2012-06-01 11:37 ` Metzger, Markus T
2012-05-23 11:25 ` [PATCH 09/16] btrace, linux: add linux native btrace target ops markus.t.metzger
2012-05-30 20:43 ` Jan Kratochvil
2012-05-31 15:34 ` Metzger, Markus T
2012-05-23 11:26 ` [PATCH 12/16] test, btrace: more branch tracing tests markus.t.metzger
2012-05-23 11:26 ` [PATCH 07/16] configure: autoreconf markus.t.metzger
2012-06-22 20:44 ` Tom Tromey
2012-06-25 8:50 ` Metzger, Markus T
2012-05-25 19:18 ` [PATCH 00/16] branch tracing support (resend) Pedro Alves
2012-05-29 14:31 ` Metzger, Markus T
2012-05-30 14:49 ` Pedro Alves
2012-05-30 15:51 ` Metzger, Markus T
2012-05-30 17:56 ` Pedro Alves
2012-05-31 17:11 ` Metzger, Markus T
2012-06-04 6:46 ` Metzger, Markus T
2012-06-12 11:32 ` Metzger, Markus T
2012-06-12 12:09 ` Jan Kratochvil
2012-06-12 12:23 ` Pedro Alves
2012-06-12 12:25 ` Jan Kratochvil
2012-06-12 13:38 ` Metzger, Markus T
2012-05-30 20:41 ` Jan Kratochvil
2012-05-31 15:33 ` Metzger, Markus T
2012-06-22 20:31 ` Tom Tromey
2012-06-25 8:50 ` Metzger, Markus T
2012-07-02 8:29 ` Metzger, Markus T
-- strict thread matches above, loose matches on Subject: below --
2012-05-10 15:15 [PATCH 00/16] branch tracing support markus.t.metzger
2012-05-10 15:17 ` [PATCH 08/16] linux, btrace: perf_event based branch tracing markus.t.metzger
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=A78C989F6D9628469189715575E55B2307A9F08C@IRSMSX102.ger.corp.intel.com \
--to=markus.t.metzger@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=jan.kratochvil@redhat.com \
--cc=kettenis@gnu.org \
--cc=markus.t.metzger@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox