// SPDX-License-Identifier: GPL-2.0-only
/*
* itmt . c : Support Intel Turbo Boost Max Technology 3 . 0
*
* ( C ) Copyright 2016 Intel Corporation
* Author : Tim Chen < tim . c . chen @ linux . intel . com >
*
* On platforms supporting Intel Turbo Boost Max Technology 3 . 0 , ( ITMT ) ,
* the maximum turbo frequencies of some cores in a CPU package may be
* higher than for the other cores in the same package . In that case ,
* better performance can be achieved by making the scheduler prefer
* to run tasks on the CPUs with higher max turbo frequencies .
*
* This file provides functions and data structures for enabling the
* scheduler to favor scheduling on cores can be boosted to a higher
* frequency under ITMT .
*/
#include <linux/sched.h>
#include <linux/cpumask.h>
#include <linux/cpuset.h>
#include <linux/debugfs.h>
#include <linux/mutex.h>
#include <linux/sysctl.h>
#include <linux/nodemask.h>
static DEFINE_MUTEX(itmt_update_mutex);
DEFINE_PER_CPU_READ_MOSTLY(int , sched_core_priority);
/* Boolean to track if system has ITMT capabilities */
static bool __read_mostly sched_itmt_capable;
/*
* Boolean to control whether we want to move processes to cpu capable
* of higher turbo frequency for cpus supporting Intel Turbo Boost Max
* Technology 3 . 0 .
*
* It can be set via / sys / kernel / debug / x86 / sched_itmt_enabled
*/
bool __read_mostly sysctl_sched_itmt_enabled;
static ssize_t sched_itmt_enabled_write(struct file *filp,
const char __user *ubuf,
size_t cnt, loff_t *ppos)
{
ssize_t result;
bool orig;
guard(mutex)(&itmt_update_mutex);
orig = sysctl_sched_itmt_enabled;
result = debugfs_write_file_bool(filp, ubuf, cnt, ppos);
if (sysctl_sched_itmt_enabled != orig) {
x86_topology_update = true ;
rebuild_sched_domains();
}
return result;
}
static int sched_core_priority_show(struct seq_file *s, void *unused)
{
int cpu;
seq_puts(s, "CPU #\tPriority\n" );
for_each_possible_cpu(cpu)
seq_printf(s, "%d\t%d\n" , cpu, arch_asym_cpu_priority(cpu));
return 0 ;
}
DEFINE_SHOW_ATTRIBUTE(sched_core_priority);
static const struct file_operations dfs_sched_itmt_fops = {
.read = debugfs_read_file_bool,
.write = sched_itmt_enabled_write,
.open = simple_open,
.llseek = default_llseek,
};
static struct dentry *dfs_sched_itmt;
static struct dentry *dfs_sched_core_prio;
/**
* sched_set_itmt_support ( ) - Indicate platform supports ITMT
*
* This function is used by the OS to indicate to scheduler that the platform
* is capable of supporting the ITMT feature .
*
* The current scheme has the pstate driver detects if the system
* is ITMT capable and call sched_set_itmt_support .
*
* This must be done only after sched_set_itmt_core_prio
* has been called to set the cpus ' priorities .
* It must not be called with cpu hot plug lock
* held as we need to acquire the lock to rebuild sched domains
* later .
*
* Return : 0 on success
*/
int sched_set_itmt_support(void )
{
guard(mutex)(&itmt_update_mutex);
if (sched_itmt_capable)
return 0 ;
dfs_sched_itmt = debugfs_create_file_unsafe("sched_itmt_enabled" ,
0644 ,
arch_debugfs_dir,
&sysctl_sched_itmt_enabled,
&dfs_sched_itmt_fops);
if (IS_ERR_OR_NULL(dfs_sched_itmt)) {
dfs_sched_itmt = NULL;
return -ENOMEM;
}
dfs_sched_core_prio = debugfs_create_file("sched_core_priority" , 0644 ,
arch_debugfs_dir, NULL,
&sched_core_priority_fops);
if (IS_ERR_OR_NULL(dfs_sched_core_prio)) {
dfs_sched_core_prio = NULL;
return -ENOMEM;
}
sched_itmt_capable = true ;
sysctl_sched_itmt_enabled = 1 ;
x86_topology_update = true ;
rebuild_sched_domains();
return 0 ;
}
/**
* sched_clear_itmt_support ( ) - Revoke platform ' s support of ITMT
*
* This function is used by the OS to indicate that it has
* revoked the platform ' s support of ITMT feature .
*
* It must not be called with cpu hot plug lock
* held as we need to acquire the lock to rebuild sched domains
* later .
*/
void sched_clear_itmt_support(void )
{
guard(mutex)(&itmt_update_mutex);
if (!sched_itmt_capable)
return ;
sched_itmt_capable = false ;
debugfs_remove(dfs_sched_itmt);
dfs_sched_itmt = NULL;
debugfs_remove(dfs_sched_core_prio);
dfs_sched_core_prio = NULL;
if (sysctl_sched_itmt_enabled) {
/* disable sched_itmt if we are no longer ITMT capable */
sysctl_sched_itmt_enabled = 0 ;
x86_topology_update = true ;
rebuild_sched_domains();
}
}
int arch_asym_cpu_priority(int cpu)
{
return per_cpu(sched_core_priority, cpu);
}
/**
* sched_set_itmt_core_prio ( ) - Set CPU priority based on ITMT
* @ prio : Priority of @ cpu
* @ cpu : The CPU number
*
* The pstate driver will find out the max boost frequency
* and call this function to set a priority proportional
* to the max boost frequency . CPUs with higher boost
* frequency will receive higher priority .
*
* No need to rebuild sched domain after updating
* the CPU priorities . The sched domains have no
* dependency on CPU priorities .
*/
void sched_set_itmt_core_prio(int prio, int cpu)
{
per_cpu(sched_core_priority, cpu) = prio;
}
Messung V0.5 in Prozent C=96 H=100 G=97
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-10-01)
¤
*© Formatika GbR, Deutschland