mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-28 00:19:36 +00:00

The housekeeping cpumasks are only set by two boot commandline parameters: "nohz_full" and "isolcpus". When there is more than one of "nohz_full" or "isolcpus", the extra ones must have the same CPU list or the setup will fail partially. The HK_TYPE_DOMAIN and HK_TYPE_MANAGED_IRQ types are settable by "isolcpus" only and their settings can be independent of the other types. The other housekeeping types are all set by "nohz_full" or "isolcpus=nohz" without a way to set them individually. So they all have identical cpumasks. There is actually no point in having different cpumasks for these "nohz_full" only housekeeping types. Consolidate these types to use the same cpumask by aliasing them to the same value. If there is a need to set any of them independently in the future, we can break them out to their own cpumasks again. With this change, the number of cpumasks in the housekeeping structure drops from 9 to 3. Other than that, there should be no other functional change. Signed-off-by: Waiman Long <longman@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Frederic Weisbecker <frederic@kernel.org> Link: https://lore.kernel.org/r/20241030175253.125248-4-longman@redhat.com
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
#ifndef _LINUX_SCHED_ISOLATION_H
|
|
#define _LINUX_SCHED_ISOLATION_H
|
|
|
|
#include <linux/cpumask.h>
|
|
#include <linux/cpuset.h>
|
|
#include <linux/init.h>
|
|
#include <linux/tick.h>
|
|
|
|
enum hk_type {
|
|
HK_TYPE_DOMAIN,
|
|
HK_TYPE_MANAGED_IRQ,
|
|
HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_MAX,
|
|
|
|
/*
|
|
* The following housekeeping types are only set by the nohz_full
|
|
* boot commandline option. So they can share the same value.
|
|
*/
|
|
HK_TYPE_TICK = HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_TIMER = HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_RCU = HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_MISC = HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_WQ = HK_TYPE_KERNEL_NOISE,
|
|
HK_TYPE_KTHREAD = HK_TYPE_KERNEL_NOISE
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_ISOLATION
|
|
DECLARE_STATIC_KEY_FALSE(housekeeping_overridden);
|
|
extern int housekeeping_any_cpu(enum hk_type type);
|
|
extern const struct cpumask *housekeeping_cpumask(enum hk_type type);
|
|
extern bool housekeeping_enabled(enum hk_type type);
|
|
extern void housekeeping_affine(struct task_struct *t, enum hk_type type);
|
|
extern bool housekeeping_test_cpu(int cpu, enum hk_type type);
|
|
extern void __init housekeeping_init(void);
|
|
|
|
#else
|
|
|
|
static inline int housekeeping_any_cpu(enum hk_type type)
|
|
{
|
|
return smp_processor_id();
|
|
}
|
|
|
|
static inline const struct cpumask *housekeeping_cpumask(enum hk_type type)
|
|
{
|
|
return cpu_possible_mask;
|
|
}
|
|
|
|
static inline bool housekeeping_enabled(enum hk_type type)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline void housekeeping_affine(struct task_struct *t,
|
|
enum hk_type type) { }
|
|
|
|
static inline bool housekeeping_test_cpu(int cpu, enum hk_type type)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
static inline void housekeeping_init(void) { }
|
|
#endif /* CONFIG_CPU_ISOLATION */
|
|
|
|
static inline bool housekeeping_cpu(int cpu, enum hk_type type)
|
|
{
|
|
#ifdef CONFIG_CPU_ISOLATION
|
|
if (static_branch_unlikely(&housekeeping_overridden))
|
|
return housekeeping_test_cpu(cpu, type);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
static inline bool cpu_is_isolated(int cpu)
|
|
{
|
|
return !housekeeping_test_cpu(cpu, HK_TYPE_DOMAIN) ||
|
|
!housekeeping_test_cpu(cpu, HK_TYPE_TICK) ||
|
|
cpuset_cpu_is_isolated(cpu);
|
|
}
|
|
|
|
#endif /* _LINUX_SCHED_ISOLATION_H */
|