Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bcc
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
Kirill Smelkov
bcc
Commits
d0e48edb
Commit
d0e48edb
authored
Feb 27, 2018
by
Teng Qin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Clean-up TRACEPOINT logic from perf reader
parent
fafbf3ca
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
13 additions
and
91 deletions
+13
-91
src/cc/libbpf.c
src/cc/libbpf.c
+2
-2
src/cc/libbpf.h
src/cc/libbpf.h
+0
-2
src/cc/perf_reader.c
src/cc/perf_reader.c
+8
-83
src/cc/perf_reader.h
src/cc/perf_reader.h
+2
-3
src/lua/bcc/libbcc.lua
src/lua/bcc/libbcc.lua
+1
-1
No files found.
src/cc/libbpf.c
View file @
d0e48edb
...
...
@@ -1057,7 +1057,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb,
struct
perf_event_attr
attr
=
{};
struct
perf_reader
*
reader
=
NULL
;
reader
=
perf_reader_new
(
NULL
,
raw_cb
,
lost_cb
,
cb_cookie
,
page_cnt
);
reader
=
perf_reader_new
(
raw_cb
,
lost_cb
,
cb_cookie
,
page_cnt
);
if
(
!
reader
)
goto
error
;
...
...
@@ -1074,7 +1074,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb,
}
perf_reader_set_fd
(
reader
,
pfd
);
if
(
perf_reader_mmap
(
reader
,
attr
.
type
,
attr
.
sample_type
)
<
0
)
if
(
perf_reader_mmap
(
reader
)
<
0
)
goto
error
;
if
(
ioctl
(
pfd
,
PERF_EVENT_IOC_ENABLE
,
0
)
<
0
)
{
...
...
src/cc/libbpf.h
View file @
d0e48edb
...
...
@@ -65,8 +65,6 @@ int bpf_attach_socket(int sockfd, int progfd);
* bind the raw socket to the interface 'name' */
int
bpf_open_raw_sock
(
const
char
*
name
);
typedef
void
(
*
perf_reader_cb
)(
void
*
cb_cookie
,
int
pid
,
uint64_t
callchain_num
,
void
*
callchain
);
typedef
void
(
*
perf_reader_raw_cb
)(
void
*
cb_cookie
,
void
*
raw
,
int
raw_size
);
typedef
void
(
*
perf_reader_lost_cb
)(
void
*
cb_cookie
,
uint64_t
lost
);
...
...
src/cc/perf_reader.c
View file @
d0e48edb
...
...
@@ -37,7 +37,6 @@ enum {
};
struct
perf_reader
{
perf_reader_cb
cb
;
perf_reader_raw_cb
raw_cb
;
perf_reader_lost_cb
lost_cb
;
void
*
cb_cookie
;
// to be returned in the cb
...
...
@@ -49,18 +48,14 @@ struct perf_reader {
int
page_size
;
int
page_cnt
;
int
fd
;
uint32_t
type
;
uint64_t
sample_type
;
};
struct
perf_reader
*
perf_reader_new
(
perf_reader_cb
cb
,
perf_reader_raw_cb
raw_cb
,
struct
perf_reader
*
perf_reader_new
(
perf_reader_raw_cb
raw_cb
,
perf_reader_lost_cb
lost_cb
,
void
*
cb_cookie
,
int
page_cnt
)
{
struct
perf_reader
*
reader
=
calloc
(
1
,
sizeof
(
struct
perf_reader
));
if
(
!
reader
)
return
NULL
;
reader
->
cb
=
cb
;
reader
->
raw_cb
=
raw_cb
;
reader
->
lost_cb
=
lost_cb
;
reader
->
cb_cookie
=
cb_cookie
;
...
...
@@ -89,7 +84,7 @@ void perf_reader_free(void *ptr) {
}
}
int
perf_reader_mmap
(
struct
perf_reader
*
reader
,
unsigned
type
,
unsigned
long
sample_type
)
{
int
perf_reader_mmap
(
struct
perf_reader
*
reader
)
{
int
mmap_size
=
reader
->
page_size
*
(
reader
->
page_cnt
+
1
);
if
(
reader
->
fd
<
0
)
{
...
...
@@ -102,8 +97,6 @@ int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sa
perror
(
"mmap"
);
return
-
1
;
}
reader
->
type
=
type
;
reader
->
sample_type
=
sample_type
;
return
0
;
}
...
...
@@ -120,69 +113,6 @@ struct perf_sample_trace_kprobe {
uint64_t
ip
;
};
static
void
parse_tracepoint
(
struct
perf_reader
*
reader
,
void
*
data
,
int
size
)
{
uint8_t
*
ptr
=
data
;
struct
perf_event_header
*
header
=
(
void
*
)
data
;
struct
perf_sample_trace_kprobe
*
tk
=
NULL
;
uint64_t
*
callchain
=
NULL
;
uint64_t
num_callchain
=
0
;
ptr
+=
sizeof
(
*
header
);
if
(
ptr
>
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: corrupt sample header
\n
"
,
__FUNCTION__
);
return
;
}
if
(
reader
->
sample_type
&
PERF_SAMPLE_CALLCHAIN
)
{
struct
{
uint64_t
nr
;
uint64_t
ips
[
0
];
}
*
cc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
cc
->
nr
)
+
sizeof
(
*
cc
->
ips
)
*
cc
->
nr
;
// size sanity check
if
(
ptr
>
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: corrupt callchain sample
\n
"
,
__FUNCTION__
);
return
;
}
int
i
;
// don't include magic numbers in the call chain
for
(
i
=
0
;
i
<
cc
->
nr
;
++
i
)
{
if
(
cc
->
ips
[
i
]
==
PERF_CONTEXT_USER
)
break
;
if
(
cc
->
ips
[
i
]
>=
PERF_CONTEXT_MAX
)
continue
;
if
(
!
callchain
)
callchain
=
&
cc
->
ips
[
i
];
++
num_callchain
;
}
}
// for kprobes, raw samples just include the common data structure and the
// instruction pointer
if
(
reader
->
sample_type
&
PERF_SAMPLE_RAW
)
{
struct
{
uint32_t
size
;
char
data
[
0
];
}
*
raw
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
raw
->
size
)
+
raw
->
size
;
if
(
ptr
>
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: corrupt raw sample
\n
"
,
__FUNCTION__
);
return
;
}
tk
=
(
void
*
)
raw
->
data
;
}
// sanity check
if
(
ptr
!=
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: extra data at end of sample
\n
"
,
__FUNCTION__
);
return
;
}
// call out to the user with the parsed data
if
(
reader
->
cb
)
reader
->
cb
(
reader
->
cb_cookie
,
tk
?
tk
->
common
.
pid
:
-
1
,
num_callchain
,
callchain
);
}
static
void
parse_sw
(
struct
perf_reader
*
reader
,
void
*
data
,
int
size
)
{
uint8_t
*
ptr
=
data
;
struct
perf_event_header
*
header
=
(
void
*
)
data
;
...
...
@@ -198,13 +128,11 @@ static void parse_sw(struct perf_reader *reader, void *data, int size) {
return
;
}
if
(
reader
->
sample_type
&
PERF_SAMPLE_RAW
)
{
raw
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
raw
->
size
)
+
raw
->
size
;
if
(
ptr
>
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: corrupt raw sample
\n
"
,
__FUNCTION__
);
return
;
}
raw
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
raw
->
size
)
+
raw
->
size
;
if
(
ptr
>
(
uint8_t
*
)
data
+
size
)
{
fprintf
(
stderr
,
"%s: corrupt raw sample
\n
"
,
__FUNCTION__
);
return
;
}
// sanity check
...
...
@@ -278,10 +206,7 @@ void perf_reader_event_read(struct perf_reader *reader) {
fprintf
(
stderr
,
"Possibly lost %"
PRIu64
" samples
\n
"
,
lost
);
}
}
else
if
(
e
->
type
==
PERF_RECORD_SAMPLE
)
{
if
(
reader
->
type
==
PERF_TYPE_TRACEPOINT
)
parse_tracepoint
(
reader
,
ptr
,
e
->
size
);
else
if
(
reader
->
type
==
PERF_TYPE_SOFTWARE
)
parse_sw
(
reader
,
ptr
,
e
->
size
);
parse_sw
(
reader
,
ptr
,
e
->
size
);
}
else
{
fprintf
(
stderr
,
"%s: unknown sample type %d
\n
"
,
__FUNCTION__
,
e
->
type
);
}
...
...
src/cc/perf_reader.h
View file @
d0e48edb
...
...
@@ -25,12 +25,11 @@ extern "C" {
struct
perf_reader
;
struct
perf_reader
*
perf_reader_new
(
perf_reader_cb
cb
,
perf_reader_raw_cb
raw_cb
,
struct
perf_reader
*
perf_reader_new
(
perf_reader_raw_cb
raw_cb
,
perf_reader_lost_cb
lost_cb
,
void
*
cb_cookie
,
int
page_cnt
);
void
perf_reader_free
(
void
*
ptr
);
int
perf_reader_mmap
(
struct
perf_reader
*
reader
,
unsigned
type
,
unsigned
long
sample_type
);
int
perf_reader_mmap
(
struct
perf_reader
*
reader
);
void
perf_reader_event_read
(
struct
perf_reader
*
reader
);
int
perf_reader_poll
(
int
num_readers
,
struct
perf_reader
**
readers
,
int
timeout
);
int
perf_reader_fd
(
struct
perf_reader
*
reader
);
...
...
src/lua/bcc/libbcc.lua
View file @
d0e48edb
...
...
@@ -99,7 +99,7 @@ ffi.cdef[[
struct perf_reader;
void perf_reader_free(void *ptr);
int perf_reader_mmap(struct perf_reader *reader
, unsigned type, unsigned long sample_type
);
int perf_reader_mmap(struct perf_reader *reader);
int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout);
int perf_reader_fd(struct perf_reader *reader);
void perf_reader_set_fd(struct perf_reader *reader, int fd);
...
...
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