Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
igt-gpu-tools
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
56
Issues
56
List
Boards
Labels
Service Desk
Milestones
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
drm
igt-gpu-tools
Commits
d58aed18
Commit
d58aed18
authored
Aug 27, 2013
by
Chris Wilson
🤔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
overlay: Read interrupts from perf
Signed-off-by:
Chris Wilson
<
chris@chris-wilson.co.uk
>
parent
14614060
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
23 deletions
+56
-23
overlay/gem-interrupts.c
overlay/gem-interrupts.c
+55
-23
overlay/gem-interrupts.h
overlay/gem-interrupts.h
+1
-0
No files found.
overlay/gem-interrupts.c
View file @
d58aed18
...
...
@@ -32,50 +32,82 @@
#include "gem-interrupts.h"
#include "debugfs.h"
#include "perf.h"
int
gem_interrupts_init
(
struct
gem_interrupts
*
irqs
)
static
int
perf_open
(
void
)
{
char
buf
[
1024
];
struct
stat
st
;
struct
perf_event_attr
attr
;
memset
(
&
attr
,
0
,
sizeof
(
attr
));
memset
(
irqs
,
0
,
sizeof
(
*
irqs
));
attr
.
type
=
i915_type_id
();
if
(
attr
.
type
==
0
)
return
-
ENOENT
;
attr
.
config
=
I915_PERF_INTERRUPTS
;
return
perf_event_open
(
&
attr
,
-
1
,
0
,
-
1
,
0
);
}
static
int
debugfs_open
(
void
)
{
char
buf
[
1024
];
struct
stat
st
;
sprintf
(
buf
,
"%s/i915_gem_interrupt"
,
debugfs_dri_path
);
if
(
stat
(
buf
,
&
st
))
return
irqs
->
error
=
errno
;
return
errno
;
return
0
;
}
int
gem_interrupts_init
(
struct
gem_interrupts
*
irqs
)
{
memset
(
irqs
,
0
,
sizeof
(
*
irqs
));
irqs
->
fd
=
perf_open
();
if
(
irqs
->
fd
<
0
)
irqs
->
error
=
debugfs_open
();
return
irqs
->
error
;
}
int
gem_interrupts_update
(
struct
gem_interrupts
*
irqs
)
{
char
buf
[
8192
],
*
b
;
int
fd
,
len
;
uint64_t
val
;
int
update
;
if
(
irqs
->
error
)
return
irqs
->
error
;
sprintf
(
buf
,
"%s/i915_gem_interrupt"
,
debugfs_dri_path
);
fd
=
open
(
buf
,
0
);
if
(
fd
<
0
)
return
irqs
->
error
=
errno
;
len
=
read
(
fd
,
buf
,
sizeof
(
buf
)
-
1
);
close
(
fd
);
if
(
irqs
->
fd
<
0
)
{
char
buf
[
8192
],
*
b
;
int
fd
,
len
;
sprintf
(
buf
,
"%s/i915_gem_interrupt"
,
debugfs_dri_path
);
fd
=
open
(
buf
,
0
);
if
(
fd
<
0
)
return
irqs
->
error
=
errno
;
len
=
read
(
fd
,
buf
,
sizeof
(
buf
)
-
1
);
close
(
fd
);
if
(
len
<
0
)
return
irqs
->
error
=
errno
;
if
(
len
<
0
)
return
irqs
->
error
=
errno
;
buf
[
len
]
=
'\0'
;
buf
[
len
]
=
'\0'
;
b
=
strstr
(
buf
,
"Interrupts received:"
);
if
(
b
==
NULL
)
return
irqs
->
error
=
ENOENT
;
b
=
strstr
(
buf
,
"Interrupts received:"
);
if
(
b
==
NULL
)
return
irqs
->
error
=
ENOENT
;
fd
=
irqs
->
last_count
==
0
;
val
=
strtoull
(
b
+
sizeof
(
"Interrupts received:"
),
0
,
0
);
}
else
{
if
(
read
(
irqs
->
fd
,
&
val
,
sizeof
(
val
))
<
0
)
return
irqs
->
error
=
errno
;
}
update
=
irqs
->
last_count
==
0
;
irqs
->
last_count
=
irqs
->
count
;
irqs
->
count
=
strtoull
(
b
+
sizeof
(
"Interrupts received:"
),
0
,
0
)
;
irqs
->
count
=
val
;
irqs
->
delta
=
irqs
->
count
-
irqs
->
last_count
;
return
fd
?
EAGAIN
:
0
;
return
update
?
EAGAIN
:
0
;
}
overlay/gem-interrupts.h
View file @
d58aed18
...
...
@@ -30,6 +30,7 @@
struct
gem_interrupts
{
long
unsigned
last_count
,
count
,
delta
;
int
error
;
int
fd
;
};
int
gem_interrupts_init
(
struct
gem_interrupts
*
irqs
);
...
...
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