mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 15:32:04 +02:00
cpumask: Introduce cpu_preferred_mask
Provide the preferred CPU infrastructure. Define get/set macros which could be used to get/set CPU state as preferred. CONFIG_PREFERRED_CPU will be selected by the driver which handles steal time values. It is going to set/clear preferred CPU state. This driver will be called steal_governor and it is introduced in subsequent patches. It periodically computes the steal ratio and decides on preferred CPU state. A CPU is set to preferred when it becomes active. Later it may be marked as non-preferred depending on steal ratio by the steal_governor. Always maintain design construct of preferred is subset of active. i.e. preferred ⊆ active ⊆ online ⊆ present ⊆ possible With CONFIG_PREFERRED_CPU=n, ensure set_cpu_preferred is a nop and get method returns the active state in that case. Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://patch.msgid.link/20260928053728.797539-5-sshegde@linux.ibm.com
This commit is contained in:
parent
06a49ef784
commit
518b32bd5b
|
|
@ -121,12 +121,20 @@ extern struct cpumask __cpu_enabled_mask;
|
|||
extern struct cpumask __cpu_present_mask;
|
||||
extern struct cpumask __cpu_active_mask;
|
||||
extern struct cpumask __cpu_dying_mask;
|
||||
|
||||
#ifdef CONFIG_PREFERRED_CPU
|
||||
extern struct cpumask __cpu_preferred_mask;
|
||||
#else
|
||||
#define __cpu_preferred_mask __cpu_active_mask
|
||||
#endif
|
||||
|
||||
#define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask)
|
||||
#define cpu_online_mask ((const struct cpumask *)&__cpu_online_mask)
|
||||
#define cpu_enabled_mask ((const struct cpumask *)&__cpu_enabled_mask)
|
||||
#define cpu_present_mask ((const struct cpumask *)&__cpu_present_mask)
|
||||
#define cpu_active_mask ((const struct cpumask *)&__cpu_active_mask)
|
||||
#define cpu_dying_mask ((const struct cpumask *)&__cpu_dying_mask)
|
||||
#define cpu_preferred_mask ((const struct cpumask *)&__cpu_preferred_mask)
|
||||
|
||||
extern atomic_t __num_online_cpus;
|
||||
extern unsigned int __num_possible_cpus;
|
||||
|
|
@ -1181,6 +1189,12 @@ void init_cpu_possible(const struct cpumask *src);
|
|||
#define set_cpu_active(cpu, active) assign_cpu((cpu), &__cpu_active_mask, (active))
|
||||
#define set_cpu_dying(cpu, dying) assign_cpu((cpu), &__cpu_dying_mask, (dying))
|
||||
|
||||
#ifdef CONFIG_PREFERRED_CPU
|
||||
#define set_cpu_preferred(cpu, preferred) assign_cpu((cpu), &__cpu_preferred_mask, (preferred))
|
||||
#else
|
||||
#define set_cpu_preferred(cpu, preferred) do { } while (0)
|
||||
#endif
|
||||
|
||||
void set_cpu_online(unsigned int cpu, bool online);
|
||||
void set_cpu_possible(unsigned int cpu, bool possible);
|
||||
|
||||
|
|
@ -1275,6 +1289,11 @@ static __always_inline bool cpu_dying(unsigned int cpu)
|
|||
return cpumask_test_cpu(cpu, cpu_dying_mask);
|
||||
}
|
||||
|
||||
static __always_inline bool cpu_preferred(unsigned int cpu)
|
||||
{
|
||||
return cpumask_test_cpu(cpu, cpu_preferred_mask);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define num_online_cpus() 1U
|
||||
|
|
@ -1313,6 +1332,11 @@ static __always_inline bool cpu_dying(unsigned int cpu)
|
|||
return false;
|
||||
}
|
||||
|
||||
static __always_inline bool cpu_preferred(unsigned int cpu)
|
||||
{
|
||||
return cpu == 0;
|
||||
}
|
||||
|
||||
#endif /* NR_CPUS > 1 */
|
||||
|
||||
#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
|
||||
|
|
|
|||
|
|
@ -194,3 +194,7 @@ config SCHED_CLASS_EXT
|
|||
For more information:
|
||||
Documentation/scheduler/sched-ext.rst
|
||||
https://github.com/sched-ext/scx
|
||||
|
||||
config PREFERRED_CPU
|
||||
bool
|
||||
depends on SMP && PARAVIRT
|
||||
|
|
|
|||
|
|
@ -3103,6 +3103,11 @@ EXPORT_SYMBOL(__cpu_dying_mask);
|
|||
atomic_t __num_online_cpus __read_mostly;
|
||||
EXPORT_SYMBOL(__num_online_cpus);
|
||||
|
||||
#ifdef CONFIG_PREFERRED_CPU
|
||||
struct cpumask __cpu_preferred_mask __read_mostly;
|
||||
EXPORT_SYMBOL_GPL(__cpu_preferred_mask);
|
||||
#endif
|
||||
|
||||
void init_cpu_present(const struct cpumask *src)
|
||||
{
|
||||
cpumask_copy(&__cpu_present_mask, src);
|
||||
|
|
@ -3160,6 +3165,7 @@ void __init boot_cpu_init(void)
|
|||
/* Mark the boot cpu "present", "online" etc for SMP and UP case */
|
||||
set_cpu_online(cpu, true);
|
||||
set_cpu_active(cpu, true);
|
||||
set_cpu_preferred(cpu, true);
|
||||
set_cpu_present(cpu, true);
|
||||
set_cpu_possible(cpu, true);
|
||||
|
||||
|
|
|
|||
|
|
@ -8632,6 +8632,9 @@ int sched_cpu_activate(unsigned int cpu)
|
|||
*/
|
||||
sched_set_rq_online(rq, cpu);
|
||||
|
||||
/* preferred is subset of active and follows its state */
|
||||
set_cpu_preferred(cpu, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -8645,6 +8648,8 @@ int sched_cpu_deactivate(unsigned int cpu)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
set_cpu_preferred(cpu, false);
|
||||
|
||||
/*
|
||||
* Remove CPU from nohz.idle_cpus_mask to prevent participating in
|
||||
* load balancing when not active
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user