178634061SFrederic Weisbecker #ifndef _LINUX_SCHED_ISOLATION_H
278634061SFrederic Weisbecker #define _LINUX_SCHED_ISOLATION_H
378634061SFrederic Weisbecker
478634061SFrederic Weisbecker #include <linux/cpumask.h>
53232e7aaSWaiman Long #include <linux/cpuset.h>
678634061SFrederic Weisbecker #include <linux/init.h>
778634061SFrederic Weisbecker #include <linux/tick.h>
878634061SFrederic Weisbecker
904d4e665SFrederic Weisbecker enum hk_type {
1004d4e665SFrederic Weisbecker HK_TYPE_DOMAIN,
1104d4e665SFrederic Weisbecker HK_TYPE_MANAGED_IRQ,
12*6010d245SWaiman Long HK_TYPE_KERNEL_NOISE,
13*6010d245SWaiman Long HK_TYPE_MAX,
14*6010d245SWaiman Long
15*6010d245SWaiman Long /*
16*6010d245SWaiman Long * The following housekeeping types are only set by the nohz_full
17*6010d245SWaiman Long * boot commandline option. So they can share the same value.
18*6010d245SWaiman Long */
19*6010d245SWaiman Long HK_TYPE_TICK = HK_TYPE_KERNEL_NOISE,
20*6010d245SWaiman Long HK_TYPE_TIMER = HK_TYPE_KERNEL_NOISE,
21*6010d245SWaiman Long HK_TYPE_RCU = HK_TYPE_KERNEL_NOISE,
22*6010d245SWaiman Long HK_TYPE_MISC = HK_TYPE_KERNEL_NOISE,
23*6010d245SWaiman Long HK_TYPE_WQ = HK_TYPE_KERNEL_NOISE,
24*6010d245SWaiman Long HK_TYPE_KTHREAD = HK_TYPE_KERNEL_NOISE
25de201559SFrederic Weisbecker };
26de201559SFrederic Weisbecker
275c4991e2SFrederic Weisbecker #ifdef CONFIG_CPU_ISOLATION
28dfcb245eSIngo Molnar DECLARE_STATIC_KEY_FALSE(housekeeping_overridden);
2904d4e665SFrederic Weisbecker extern int housekeeping_any_cpu(enum hk_type type);
3004d4e665SFrederic Weisbecker extern const struct cpumask *housekeeping_cpumask(enum hk_type type);
3104d4e665SFrederic Weisbecker extern bool housekeeping_enabled(enum hk_type type);
3204d4e665SFrederic Weisbecker extern void housekeeping_affine(struct task_struct *t, enum hk_type type);
3304d4e665SFrederic Weisbecker extern bool housekeeping_test_cpu(int cpu, enum hk_type type);
3478634061SFrederic Weisbecker extern void __init housekeeping_init(void);
357e56a1cfSFrederic Weisbecker
3678634061SFrederic Weisbecker #else
3778634061SFrederic Weisbecker
housekeeping_any_cpu(enum hk_type type)3804d4e665SFrederic Weisbecker static inline int housekeeping_any_cpu(enum hk_type type)
399f0ca2d9SFrederic Weisbecker {
409f0ca2d9SFrederic Weisbecker return smp_processor_id();
419f0ca2d9SFrederic Weisbecker }
4278634061SFrederic Weisbecker
housekeeping_cpumask(enum hk_type type)4304d4e665SFrederic Weisbecker static inline const struct cpumask *housekeeping_cpumask(enum hk_type type)
4478634061SFrederic Weisbecker {
4578634061SFrederic Weisbecker return cpu_possible_mask;
4678634061SFrederic Weisbecker }
4778634061SFrederic Weisbecker
housekeeping_enabled(enum hk_type type)4804d4e665SFrederic Weisbecker static inline bool housekeeping_enabled(enum hk_type type)
490c5f81daSWanpeng Li {
500c5f81daSWanpeng Li return false;
510c5f81daSWanpeng Li }
520c5f81daSWanpeng Li
housekeeping_affine(struct task_struct * t,enum hk_type type)53de201559SFrederic Weisbecker static inline void housekeeping_affine(struct task_struct *t,
5404d4e665SFrederic Weisbecker enum hk_type type) { }
55a85c2257SFrederic Weisbecker
housekeeping_test_cpu(int cpu,enum hk_type type)56a85c2257SFrederic Weisbecker static inline bool housekeeping_test_cpu(int cpu, enum hk_type type)
57a85c2257SFrederic Weisbecker {
58a85c2257SFrederic Weisbecker return true;
59a85c2257SFrederic Weisbecker }
60a85c2257SFrederic Weisbecker
housekeeping_init(void)617e56a1cfSFrederic Weisbecker static inline void housekeeping_init(void) { }
625c4991e2SFrederic Weisbecker #endif /* CONFIG_CPU_ISOLATION */
637e56a1cfSFrederic Weisbecker
housekeeping_cpu(int cpu,enum hk_type type)6404d4e665SFrederic Weisbecker static inline bool housekeeping_cpu(int cpu, enum hk_type type)
6578634061SFrederic Weisbecker {
665c4991e2SFrederic Weisbecker #ifdef CONFIG_CPU_ISOLATION
67dfcb245eSIngo Molnar if (static_branch_unlikely(&housekeeping_overridden))
6804d4e665SFrederic Weisbecker return housekeeping_test_cpu(cpu, type);
6978634061SFrederic Weisbecker #endif
7078634061SFrederic Weisbecker return true;
7178634061SFrederic Weisbecker }
7278634061SFrederic Weisbecker
cpu_is_isolated(int cpu)73a85c2257SFrederic Weisbecker static inline bool cpu_is_isolated(int cpu)
74a85c2257SFrederic Weisbecker {
75a85c2257SFrederic Weisbecker return !housekeeping_test_cpu(cpu, HK_TYPE_DOMAIN) ||
763232e7aaSWaiman Long !housekeeping_test_cpu(cpu, HK_TYPE_TICK) ||
773232e7aaSWaiman Long cpuset_cpu_is_isolated(cpu);
78a85c2257SFrederic Weisbecker }
79a85c2257SFrederic Weisbecker
8078634061SFrederic Weisbecker #endif /* _LINUX_SCHED_ISOLATION_H */
81