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
Kirill Smelkov
linux
Commits
5e645f31
Commit
5e645f31
authored
Sep 10, 2024
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'perf/urgent' into perf/core, to pick up fixes
Signed-off-by:
Ingo Molnar
<
mingo@kernel.org
>
parents
bbdd4df3
8d72eba1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
42 additions
and
5 deletions
+42
-5
arch/x86/events/rapl.c
arch/x86/events/rapl.c
+42
-5
No files found.
arch/x86/events/rapl.c
View file @
5e645f31
...
...
@@ -103,6 +103,19 @@ static struct perf_pmu_events_attr event_attr_##v = { \
.event_str = str, \
};
/*
* RAPL Package energy counter scope:
* 1. AMD/HYGON platforms have a per-PKG package energy counter
* 2. For Intel platforms
* 2.1. CLX-AP is multi-die and its RAPL MSRs are die-scope
* 2.2. Other Intel platforms are single die systems so the scope can be
* considered as either pkg-scope or die-scope, and we are considering
* them as die-scope.
*/
#define rapl_pmu_is_pkg_scope() \
(boot_cpu_data.x86_vendor == X86_VENDOR_AMD || \
boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
struct
rapl_pmu
{
raw_spinlock_t
lock
;
int
n_active
;
...
...
@@ -140,9 +153,25 @@ static unsigned int rapl_cntr_mask;
static
u64
rapl_timer_ms
;
static
struct
perf_msr
*
rapl_msrs
;
/*
* Helper functions to get the correct topology macros according to the
* RAPL PMU scope.
*/
static
inline
unsigned
int
get_rapl_pmu_idx
(
int
cpu
)
{
return
rapl_pmu_is_pkg_scope
()
?
topology_logical_package_id
(
cpu
)
:
topology_logical_die_id
(
cpu
);
}
static
inline
const
struct
cpumask
*
get_rapl_pmu_cpumask
(
int
cpu
)
{
return
rapl_pmu_is_pkg_scope
()
?
topology_core_cpumask
(
cpu
)
:
topology_die_cpumask
(
cpu
);
}
static
inline
struct
rapl_pmu
*
cpu_to_rapl_pmu
(
unsigned
int
cpu
)
{
unsigned
int
rapl_pmu_idx
=
topology_logical_die_id
(
cpu
);
unsigned
int
rapl_pmu_idx
=
get_rapl_pmu_idx
(
cpu
);
/*
* The unsigned check also catches the '-1' return value for non
...
...
@@ -552,7 +581,7 @@ static int rapl_cpu_offline(unsigned int cpu)
pmu
->
cpu
=
-
1
;
/* Find a new cpu to collect rapl events */
target
=
cpumask_any_but
(
topology_die
_cpumask
(
cpu
),
cpu
);
target
=
cpumask_any_but
(
get_rapl_pmu
_cpumask
(
cpu
),
cpu
);
/* Migrate rapl events to the new target */
if
(
target
<
nr_cpu_ids
)
{
...
...
@@ -565,6 +594,11 @@ static int rapl_cpu_offline(unsigned int cpu)
static
int
rapl_cpu_online
(
unsigned
int
cpu
)
{
s32
rapl_pmu_idx
=
get_rapl_pmu_idx
(
cpu
);
if
(
rapl_pmu_idx
<
0
)
{
pr_err
(
"topology_logical_(package/die)_id() returned a negative value"
);
return
-
EINVAL
;
}
struct
rapl_pmu
*
pmu
=
cpu_to_rapl_pmu
(
cpu
);
int
target
;
...
...
@@ -579,14 +613,14 @@ static int rapl_cpu_online(unsigned int cpu)
pmu
->
timer_interval
=
ms_to_ktime
(
rapl_timer_ms
);
rapl_hrtimer_init
(
pmu
);
rapl_pmus
->
pmus
[
topology_logical_die_id
(
cpu
)
]
=
pmu
;
rapl_pmus
->
pmus
[
rapl_pmu_idx
]
=
pmu
;
}
/*
* Check if there is an online cpu in the package which collects rapl
* events already.
*/
target
=
cpumask_any_and
(
&
rapl_cpu_mask
,
topology_die
_cpumask
(
cpu
));
target
=
cpumask_any_and
(
&
rapl_cpu_mask
,
get_rapl_pmu
_cpumask
(
cpu
));
if
(
target
<
nr_cpu_ids
)
return
0
;
...
...
@@ -675,7 +709,10 @@ static const struct attribute_group *rapl_attr_update[] = {
static
int
__init
init_rapl_pmus
(
void
)
{
int
nr_rapl_pmu
=
topology_max_packages
()
*
topology_max_dies_per_package
();
int
nr_rapl_pmu
=
topology_max_packages
();
if
(
!
rapl_pmu_is_pkg_scope
())
nr_rapl_pmu
*=
topology_max_dies_per_package
();
rapl_pmus
=
kzalloc
(
struct_size
(
rapl_pmus
,
pmus
,
nr_rapl_pmu
),
GFP_KERNEL
);
if
(
!
rapl_pmus
)
...
...
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