Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
b9f616bb
Commit
b9f616bb
authored
Jan 08, 2012
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'perf/core' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux
into perf/core
parents
636f0c70
cc5a91e9
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
93 additions
and
60 deletions
+93
-60
tools/perf/Documentation/perf-list.txt
tools/perf/Documentation/perf-list.txt
+2
-0
tools/perf/MANIFEST
tools/perf/MANIFEST
+1
-0
tools/perf/builtin-kvm.c
tools/perf/builtin-kvm.c
+2
-4
tools/perf/builtin-top.c
tools/perf/builtin-top.c
+0
-1
tools/perf/util/evlist.c
tools/perf/util/evlist.c
+4
-1
tools/perf/util/hist.c
tools/perf/util/hist.c
+50
-47
tools/perf/util/hist.h
tools/perf/util/hist.h
+2
-5
tools/perf/util/parse-events.c
tools/perf/util/parse-events.c
+13
-2
tools/perf/util/util.c
tools/perf/util/util.c
+15
-0
tools/perf/util/util.h
tools/perf/util/util.h
+4
-0
No files found.
tools/perf/Documentation/perf-list.txt
View file @
b9f616bb
...
...
@@ -21,6 +21,8 @@ EVENT MODIFIERS
Events can optionally have a modifer by appending a colon and one or
more modifiers. Modifiers allow the user to restrict when events are
counted with 'u' for user-space, 'k' for kernel, 'h' for hypervisor.
Additional modifiers are 'G' for guest counting (in KVM guests) and 'H'
for host counting (not in KVM guests).
The 'p' modifier can be used for specifying how precise the instruction
address should be. The 'p' modifier is currently only implemented for
...
...
tools/perf/MANIFEST
View file @
b9f616bb
tools/perf
include/linux/const.h
include/linux/perf_event.h
include/linux/rbtree.h
include/linux/list.h
...
...
tools/perf/builtin-kvm.c
View file @
b9f616bb
...
...
@@ -22,9 +22,6 @@
static
const
char
*
file_name
;
static
char
name_buffer
[
256
];
bool
perf_host
=
1
;
bool
perf_guest
;
static
const
char
*
const
kvm_usage
[]
=
{
"perf kvm [<options>] {top|record|report|diff|buildid-list}"
,
NULL
...
...
@@ -107,7 +104,8 @@ static int __cmd_buildid_list(int argc, const char **argv)
int
cmd_kvm
(
int
argc
,
const
char
**
argv
,
const
char
*
prefix
__used
)
{
perf_host
=
perf_guest
=
0
;
perf_host
=
0
;
perf_guest
=
1
;
argc
=
parse_options
(
argc
,
argv
,
kvm_options
,
kvm_usage
,
PARSE_OPT_STOP_AT_NON_OPTION
);
...
...
tools/perf/builtin-top.c
View file @
b9f616bb
...
...
@@ -235,7 +235,6 @@ static struct hist_entry *perf_evsel__add_hist_entry(struct perf_evsel *evsel,
if
(
he
==
NULL
)
return
NULL
;
evsel
->
hists
.
stats
.
total_period
+=
sample
->
period
;
hists__inc_nr_events
(
&
evsel
->
hists
,
PERF_RECORD_SAMPLE
);
return
he
;
}
...
...
tools/perf/util/evlist.c
View file @
b9f616bb
...
...
@@ -111,8 +111,11 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
.
type
=
PERF_TYPE_HARDWARE
,
.
config
=
PERF_COUNT_HW_CPU_CYCLES
,
};
struct
perf_evsel
*
evsel
=
perf_evsel__new
(
&
attr
,
0
);
struct
perf_evsel
*
evsel
;
event_attr_init
(
&
attr
);
evsel
=
perf_evsel__new
(
&
attr
,
0
);
if
(
evsel
==
NULL
)
goto
error
;
...
...
tools/perf/util/hist.c
View file @
b9f616bb
...
...
@@ -76,21 +76,21 @@ static void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
}
}
static
void
hist_entry__add_cpumode_period
(
struct
hist_entry
*
self
,
static
void
hist_entry__add_cpumode_period
(
struct
hist_entry
*
he
,
unsigned
int
cpumode
,
u64
period
)
{
switch
(
cpumode
)
{
case
PERF_RECORD_MISC_KERNEL
:
self
->
period_sys
+=
period
;
he
->
period_sys
+=
period
;
break
;
case
PERF_RECORD_MISC_USER
:
self
->
period_us
+=
period
;
he
->
period_us
+=
period
;
break
;
case
PERF_RECORD_MISC_GUEST_KERNEL
:
self
->
period_guest_sys
+=
period
;
he
->
period_guest_sys
+=
period
;
break
;
case
PERF_RECORD_MISC_GUEST_USER
:
self
->
period_guest_us
+=
period
;
he
->
period_guest_us
+=
period
;
break
;
default:
break
;
...
...
@@ -165,18 +165,18 @@ void hists__decay_entries_threaded(struct hists *hists,
static
struct
hist_entry
*
hist_entry__new
(
struct
hist_entry
*
template
)
{
size_t
callchain_size
=
symbol_conf
.
use_callchain
?
sizeof
(
struct
callchain_root
)
:
0
;
struct
hist_entry
*
self
=
malloc
(
sizeof
(
*
self
)
+
callchain_size
);
struct
hist_entry
*
he
=
malloc
(
sizeof
(
*
he
)
+
callchain_size
);
if
(
self
!=
NULL
)
{
*
self
=
*
template
;
self
->
nr_events
=
1
;
if
(
self
->
ms
.
map
)
self
->
ms
.
map
->
referenced
=
true
;
if
(
he
!=
NULL
)
{
*
he
=
*
template
;
he
->
nr_events
=
1
;
if
(
he
->
ms
.
map
)
he
->
ms
.
map
->
referenced
=
true
;
if
(
symbol_conf
.
use_callchain
)
callchain_init
(
self
->
callchain
);
callchain_init
(
he
->
callchain
);
}
return
self
;
return
he
;
}
static
void
hists__inc_nr_entries
(
struct
hists
*
hists
,
struct
hist_entry
*
h
)
...
...
@@ -677,15 +677,16 @@ static size_t callchain__fprintf_flat(FILE *fp, struct callchain_node *self,
return
ret
;
}
static
size_t
hist_entry_callchain__fprintf
(
FILE
*
fp
,
struct
hist_entry
*
self
,
u64
total_samples
,
int
left_margin
)
static
size_t
hist_entry_callchain__fprintf
(
struct
hist_entry
*
he
,
u64
total_samples
,
int
left_margin
,
FILE
*
fp
)
{
struct
rb_node
*
rb_node
;
struct
callchain_node
*
chain
;
size_t
ret
=
0
;
u32
entries_printed
=
0
;
rb_node
=
rb_first
(
&
self
->
sorted_chain
);
rb_node
=
rb_first
(
&
he
->
sorted_chain
);
while
(
rb_node
)
{
double
percent
;
...
...
@@ -730,35 +731,35 @@ void hists__output_recalc_col_len(struct hists *hists, int max_rows)
}
}
static
int
hist_entry__pcnt_snprintf
(
struct
hist_entry
*
self
,
char
*
s
,
static
int
hist_entry__pcnt_snprintf
(
struct
hist_entry
*
he
,
char
*
s
,
size_t
size
,
struct
hists
*
pair_hists
,
bool
show_displacement
,
long
displacement
,
bool
color
,
u64
session_total
)
bool
color
,
u64
total_period
)
{
u64
period
,
total
,
period_sys
,
period_us
,
period_guest_sys
,
period_guest_us
;
u64
nr_events
;
const
char
*
sep
=
symbol_conf
.
field_sep
;
int
ret
;
if
(
symbol_conf
.
exclude_other
&&
!
self
->
parent
)
if
(
symbol_conf
.
exclude_other
&&
!
he
->
parent
)
return
0
;
if
(
pair_hists
)
{
period
=
self
->
pair
?
self
->
pair
->
period
:
0
;
nr_events
=
self
->
pair
?
self
->
pair
->
nr_events
:
0
;
period
=
he
->
pair
?
he
->
pair
->
period
:
0
;
nr_events
=
he
->
pair
?
he
->
pair
->
nr_events
:
0
;
total
=
pair_hists
->
stats
.
total_period
;
period_sys
=
self
->
pair
?
self
->
pair
->
period_sys
:
0
;
period_us
=
self
->
pair
?
self
->
pair
->
period_us
:
0
;
period_guest_sys
=
self
->
pair
?
self
->
pair
->
period_guest_sys
:
0
;
period_guest_us
=
self
->
pair
?
self
->
pair
->
period_guest_us
:
0
;
period_sys
=
he
->
pair
?
he
->
pair
->
period_sys
:
0
;
period_us
=
he
->
pair
?
he
->
pair
->
period_us
:
0
;
period_guest_sys
=
he
->
pair
?
he
->
pair
->
period_guest_sys
:
0
;
period_guest_us
=
he
->
pair
?
he
->
pair
->
period_guest_us
:
0
;
}
else
{
period
=
self
->
period
;
nr_events
=
self
->
nr_events
;
total
=
session_total
;
period_sys
=
self
->
period_sys
;
period_us
=
self
->
period_us
;
period_guest_sys
=
self
->
period_guest_sys
;
period_guest_us
=
self
->
period_guest_us
;
period
=
he
->
period
;
nr_events
=
he
->
nr_events
;
total
=
total_period
;
period_sys
=
he
->
period_sys
;
period_us
=
he
->
period_us
;
period_guest_sys
=
he
->
period_guest_sys
;
period_guest_us
=
he
->
period_guest_us
;
}
if
(
total
)
{
...
...
@@ -812,8 +813,8 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *self, char *s,
if
(
total
>
0
)
old_percent
=
(
period
*
100
.
0
)
/
total
;
if
(
session_total
>
0
)
new_percent
=
(
self
->
period
*
100
.
0
)
/
session_total
;
if
(
total_period
>
0
)
new_percent
=
(
he
->
period
*
100
.
0
)
/
total_period
;
diff
=
new_percent
-
old_percent
;
...
...
@@ -862,9 +863,10 @@ int hist_entry__snprintf(struct hist_entry *he, char *s, size_t size,
return
ret
;
}
int
hist_entry__fprintf
(
struct
hist_entry
*
he
,
size_t
size
,
struct
hists
*
hists
,
struct
hists
*
pair_hists
,
bool
show_displacement
,
long
displacement
,
FILE
*
fp
,
u64
session_total
)
static
int
hist_entry__fprintf
(
struct
hist_entry
*
he
,
size_t
size
,
struct
hists
*
hists
,
struct
hists
*
pair_hists
,
bool
show_displacement
,
long
displacement
,
u64
total_period
,
FILE
*
fp
)
{
char
bf
[
512
];
int
ret
;
...
...
@@ -874,14 +876,14 @@ int hist_entry__fprintf(struct hist_entry *he, size_t size, struct hists *hists,
ret
=
hist_entry__pcnt_snprintf
(
he
,
bf
,
size
,
pair_hists
,
show_displacement
,
displacement
,
true
,
session_total
);
true
,
total_period
);
hist_entry__snprintf
(
he
,
bf
+
ret
,
size
-
ret
,
hists
);
return
fprintf
(
fp
,
"%s
\n
"
,
bf
);
}
static
size_t
hist_entry__fprintf_callchain
(
struct
hist_entry
*
self
,
struct
hists
*
hists
,
FILE
*
fp
,
u64
session_total
)
static
size_t
hist_entry__fprintf_callchain
(
struct
hist_entry
*
he
,
struct
hists
*
hists
,
u64
total_period
,
FILE
*
fp
)
{
int
left_margin
=
0
;
...
...
@@ -889,11 +891,10 @@ static size_t hist_entry__fprintf_callchain(struct hist_entry *self,
struct
sort_entry
*
se
=
list_first_entry
(
&
hist_entry__sort_list
,
typeof
(
*
se
),
list
);
left_margin
=
hists__col_len
(
hists
,
se
->
se_width_idx
);
left_margin
-=
thread__comm_len
(
self
->
thread
);
left_margin
-=
thread__comm_len
(
he
->
thread
);
}
return
hist_entry_callchain__fprintf
(
fp
,
self
,
session_total
,
left_margin
);
return
hist_entry_callchain__fprintf
(
he
,
total_period
,
left_margin
,
fp
);
}
size_t
hists__fprintf
(
struct
hists
*
hists
,
struct
hists
*
pair
,
...
...
@@ -903,6 +904,7 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair,
struct
sort_entry
*
se
;
struct
rb_node
*
nd
;
size_t
ret
=
0
;
u64
total_period
;
unsigned
long
position
=
1
;
long
displacement
=
0
;
unsigned
int
width
;
...
...
@@ -1025,6 +1027,8 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair,
goto
out
;
print_entries:
total_period
=
hists
->
stats
.
total_period
;
for
(
nd
=
rb_first
(
&
hists
->
entries
);
nd
;
nd
=
rb_next
(
nd
))
{
struct
hist_entry
*
h
=
rb_entry
(
nd
,
struct
hist_entry
,
rb_node
);
...
...
@@ -1040,11 +1044,10 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair,
++
position
;
}
ret
+=
hist_entry__fprintf
(
h
,
max_cols
,
hists
,
pair
,
show_displacement
,
displacement
,
fp
,
hists
->
stats
.
total_period
);
displacement
,
total_period
,
fp
);
if
(
symbol_conf
.
use_callchain
)
ret
+=
hist_entry__fprintf_callchain
(
h
,
hists
,
fp
,
hists
->
stats
.
total_period
);
ret
+=
hist_entry__fprintf_callchain
(
h
,
hists
,
total_period
,
fp
);
if
(
max_rows
&&
++
nr_rows
>=
max_rows
)
goto
out
;
...
...
tools/perf/util/hist.h
View file @
b9f616bb
...
...
@@ -66,11 +66,8 @@ struct hists {
struct
hist_entry
*
__hists__add_entry
(
struct
hists
*
self
,
struct
addr_location
*
al
,
struct
symbol
*
parent
,
u64
period
);
extern
int64_t
hist_entry__cmp
(
struct
hist_entry
*
,
struct
hist_entry
*
);
extern
int64_t
hist_entry__collapse
(
struct
hist_entry
*
,
struct
hist_entry
*
);
int
hist_entry__fprintf
(
struct
hist_entry
*
he
,
size_t
size
,
struct
hists
*
hists
,
struct
hists
*
pair_hists
,
bool
show_displacement
,
long
displacement
,
FILE
*
fp
,
u64
session_total
);
int64_t
hist_entry__cmp
(
struct
hist_entry
*
left
,
struct
hist_entry
*
right
);
int64_t
hist_entry__collapse
(
struct
hist_entry
*
left
,
struct
hist_entry
*
right
);
int
hist_entry__snprintf
(
struct
hist_entry
*
self
,
char
*
bf
,
size_t
size
,
struct
hists
*
hists
);
void
hist_entry__free
(
struct
hist_entry
*
);
...
...
tools/perf/util/parse-events.c
View file @
b9f616bb
...
...
@@ -735,8 +735,8 @@ static int
parse_event_modifier
(
const
char
**
strp
,
struct
perf_event_attr
*
attr
)
{
const
char
*
str
=
*
strp
;
int
exclude
=
0
;
int
eu
=
0
,
ek
=
0
,
eh
=
0
,
precise
=
0
;
int
exclude
=
0
,
exclude_GH
=
0
;
int
eu
=
0
,
ek
=
0
,
eh
=
0
,
eH
=
0
,
eG
=
0
,
precise
=
0
;
if
(
!*
str
)
return
0
;
...
...
@@ -760,6 +760,14 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr)
if
(
!
exclude
)
exclude
=
eu
=
ek
=
eh
=
1
;
eh
=
0
;
}
else
if
(
*
str
==
'G'
)
{
if
(
!
exclude_GH
)
exclude_GH
=
eG
=
eH
=
1
;
eG
=
0
;
}
else
if
(
*
str
==
'H'
)
{
if
(
!
exclude_GH
)
exclude_GH
=
eG
=
eH
=
1
;
eH
=
0
;
}
else
if
(
*
str
==
'p'
)
{
precise
++
;
}
else
...
...
@@ -776,6 +784,8 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr)
attr
->
exclude_kernel
=
ek
;
attr
->
exclude_hv
=
eh
;
attr
->
precise_ip
=
precise
;
attr
->
exclude_host
=
eH
;
attr
->
exclude_guest
=
eG
;
return
0
;
}
...
...
@@ -838,6 +848,7 @@ int parse_events(struct perf_evlist *evlist , const char *str, int unset __used)
for
(;;)
{
ostr
=
str
;
memset
(
&
attr
,
0
,
sizeof
(
attr
));
event_attr_init
(
&
attr
);
ret
=
parse_event_symbols
(
evlist
,
&
str
,
&
attr
);
if
(
ret
==
EVT_FAILED
)
return
-
1
;
...
...
tools/perf/util/util.c
View file @
b9f616bb
#include "../perf.h"
#include "util.h"
#include <sys/mman.h>
/*
* XXX We need to find a better place for these things...
*/
bool
perf_host
=
true
;
bool
perf_guest
=
true
;
void
event_attr_init
(
struct
perf_event_attr
*
attr
)
{
if
(
!
perf_host
)
attr
->
exclude_host
=
1
;
if
(
!
perf_guest
)
attr
->
exclude_guest
=
1
;
}
int
mkdir_p
(
char
*
path
,
mode_t
mode
)
{
struct
stat
st
;
...
...
tools/perf/util/util.h
View file @
b9f616bb
...
...
@@ -242,6 +242,10 @@ int strtailcmp(const char *s1, const char *s2);
unsigned
long
convert_unit
(
unsigned
long
value
,
char
*
unit
);
int
readn
(
int
fd
,
void
*
buf
,
size_t
size
);
struct
perf_event_attr
;
void
event_attr_init
(
struct
perf_event_attr
*
attr
);
#define _STR(x) #x
#define STR(x) _STR(x)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment