mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-18 23:29:57 +02:00

Currently, the cpu_is_isolated() function checks only the statically isolated CPUs specified via the "isolcpus" and "nohz_full" kernel command line options. This function is used by vmstat and memcg to reduce interference with isolated CPUs by not doing stat flushing or scheduling works on those CPUs. Workloads running on isolated CPUs within isolated cpuset partitions should receive the same treatment to reduce unnecessary interference. This patch introduces a new cpuset_cpu_is_isolated() function to be called by cpu_is_isolated() so that the set of dynamically created cpuset isolated CPUs will be included in the check. Assuming that testing a bit in a cpumask is atomic, no synchronization primitive is currently used to synchronize access to the cpuset's isolated_cpus mask. Signed-off-by: Waiman Long <longman@redhat.com> Signed-off-by: Tejun Heo <tj@kernel.org>
76 lines
1.7 KiB
C
76 lines
1.7 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_TIMER,
|
|
HK_TYPE_RCU,
|
|
HK_TYPE_MISC,
|
|
HK_TYPE_SCHED,
|
|
HK_TYPE_TICK,
|
|
HK_TYPE_DOMAIN,
|
|
HK_TYPE_WQ,
|
|
HK_TYPE_MANAGED_IRQ,
|
|
HK_TYPE_KTHREAD,
|
|
HK_TYPE_MAX
|
|
};
|
|
|
|
#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 */
|