diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-03 17:00:15 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-03 17:00:15 -0400 |
| commit | c84a1e32ee58fc1cc9d3fd42619b917cce67e30a (patch) | |
| tree | d3e5bed273f747e7c9e399864219bea76f4c30ea /include/linux | |
| parent | 3d521f9151dacab566904d1f57dcb3e7080cdd8f (diff) | |
| parent | 096aa33863a5e48de52d2ff30e0801b7487944f4 (diff) | |
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next
Pull scheduler updates from Ingo Molnar:
"The main scheduling related changes in this cycle were:
- various sched/numa updates, for better performance
- tree wide cleanup of open coded nice levels
- nohz fix related to rq->nr_running use
- cpuidle changes and continued consolidation to improve the
kernel/sched/idle.c high level idle scheduling logic. As part of
this effort I pulled cpuidle driver changes from Rafael as well.
- standardized idle polling amongst architectures
- continued work on preparing better power/energy aware scheduling
- sched/rt updates
- misc fixlets and cleanups"
* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (49 commits)
sched/numa: Decay ->wakee_flips instead of zeroing
sched/numa: Update migrate_improves/degrades_locality()
sched/numa: Allow task switch if load imbalance improves
sched/rt: Fix 'struct sched_dl_entity' and dl_task_time() comments, to match the current upstream code
sched: Consolidate open coded implementations of nice level frobbing into nice_to_rlimit() and rlimit_to_nice()
sched: Initialize rq->age_stamp on processor start
sched, nohz: Change rq->nr_running to always use wrappers
sched: Fix the rq->next_balance logic in rebalance_domains() and idle_balance()
sched: Use clamp() and clamp_val() to make sys_nice() more readable
sched: Do not zero sg->cpumask and sg->sgp->power in build_sched_groups()
sched/numa: Fix initialization of sched_domain_topology for NUMA
sched: Call select_idle_sibling() when not affine_sd
sched: Simplify return logic in sched_read_attr()
sched: Simplify return logic in sched_copy_attr()
sched: Fix exec_start/task_hot on migrated tasks
arm64: Remove TIF_POLLING_NRFLAG
metag: Remove TIF_POLLING_NRFLAG
sched/idle: Make cpuidle_idle_call() void
sched/idle: Reflow cpuidle_idle_call()
sched/idle: Delay clearing the polling bit
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cpuidle.h | 7 | ||||
| -rw-r--r-- | include/linux/sched.h | 104 | ||||
| -rw-r--r-- | include/linux/sched/prio.h | 16 | ||||
| -rw-r--r-- | include/linux/thread_info.h | 14 | ||||
| -rw-r--r-- | include/linux/topology.h | 128 |
5 files changed, 88 insertions, 181 deletions
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index b0238cba440b..c51a436135c4 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
| @@ -120,8 +120,6 @@ struct cpuidle_driver { | |||
| 120 | #ifdef CONFIG_CPU_IDLE | 120 | #ifdef CONFIG_CPU_IDLE |
| 121 | extern void disable_cpuidle(void); | 121 | extern void disable_cpuidle(void); |
| 122 | 122 | ||
| 123 | extern int cpuidle_enabled(struct cpuidle_driver *drv, | ||
| 124 | struct cpuidle_device *dev); | ||
| 125 | extern int cpuidle_select(struct cpuidle_driver *drv, | 123 | extern int cpuidle_select(struct cpuidle_driver *drv, |
| 126 | struct cpuidle_device *dev); | 124 | struct cpuidle_device *dev); |
| 127 | extern int cpuidle_enter(struct cpuidle_driver *drv, | 125 | extern int cpuidle_enter(struct cpuidle_driver *drv, |
| @@ -145,13 +143,11 @@ extern void cpuidle_resume(void); | |||
| 145 | extern int cpuidle_enable_device(struct cpuidle_device *dev); | 143 | extern int cpuidle_enable_device(struct cpuidle_device *dev); |
| 146 | extern void cpuidle_disable_device(struct cpuidle_device *dev); | 144 | extern void cpuidle_disable_device(struct cpuidle_device *dev); |
| 147 | extern int cpuidle_play_dead(void); | 145 | extern int cpuidle_play_dead(void); |
| 146 | extern void cpuidle_use_deepest_state(bool enable); | ||
| 148 | 147 | ||
| 149 | extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev); | 148 | extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev); |
| 150 | #else | 149 | #else |
| 151 | static inline void disable_cpuidle(void) { } | 150 | static inline void disable_cpuidle(void) { } |
| 152 | static inline int cpuidle_enabled(struct cpuidle_driver *drv, | ||
| 153 | struct cpuidle_device *dev) | ||
| 154 | {return -ENODEV; } | ||
| 155 | static inline int cpuidle_select(struct cpuidle_driver *drv, | 151 | static inline int cpuidle_select(struct cpuidle_driver *drv, |
| 156 | struct cpuidle_device *dev) | 152 | struct cpuidle_device *dev) |
| 157 | {return -ENODEV; } | 153 | {return -ENODEV; } |
| @@ -180,6 +176,7 @@ static inline int cpuidle_enable_device(struct cpuidle_device *dev) | |||
| 180 | {return -ENODEV; } | 176 | {return -ENODEV; } |
| 181 | static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } | 177 | static inline void cpuidle_disable_device(struct cpuidle_device *dev) { } |
| 182 | static inline int cpuidle_play_dead(void) {return -ENODEV; } | 178 | static inline int cpuidle_play_dead(void) {return -ENODEV; } |
| 179 | static inline void cpuidle_use_deepest_state(bool enable) {} | ||
| 183 | static inline struct cpuidle_driver *cpuidle_get_cpu_driver( | 180 | static inline struct cpuidle_driver *cpuidle_get_cpu_driver( |
| 184 | struct cpuidle_device *dev) {return NULL; } | 181 | struct cpuidle_device *dev) {return NULL; } |
| 185 | #endif | 182 | #endif |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4dce5d844b74..70f67e4e6156 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -870,6 +870,7 @@ enum cpu_idle_type { | |||
| 870 | #define SD_BALANCE_WAKE 0x0010 /* Balance on wakeup */ | 870 | #define SD_BALANCE_WAKE 0x0010 /* Balance on wakeup */ |
| 871 | #define SD_WAKE_AFFINE 0x0020 /* Wake task to waking CPU */ | 871 | #define SD_WAKE_AFFINE 0x0020 /* Wake task to waking CPU */ |
| 872 | #define SD_SHARE_CPUPOWER 0x0080 /* Domain members share cpu power */ | 872 | #define SD_SHARE_CPUPOWER 0x0080 /* Domain members share cpu power */ |
| 873 | #define SD_SHARE_POWERDOMAIN 0x0100 /* Domain members share power domain */ | ||
| 873 | #define SD_SHARE_PKG_RESOURCES 0x0200 /* Domain members share cpu pkg resources */ | 874 | #define SD_SHARE_PKG_RESOURCES 0x0200 /* Domain members share cpu pkg resources */ |
| 874 | #define SD_SERIALIZE 0x0400 /* Only a single load balancing instance */ | 875 | #define SD_SERIALIZE 0x0400 /* Only a single load balancing instance */ |
| 875 | #define SD_ASYM_PACKING 0x0800 /* Place busy groups earlier in the domain */ | 876 | #define SD_ASYM_PACKING 0x0800 /* Place busy groups earlier in the domain */ |
| @@ -877,7 +878,26 @@ enum cpu_idle_type { | |||
| 877 | #define SD_OVERLAP 0x2000 /* sched_domains of this level overlap */ | 878 | #define SD_OVERLAP 0x2000 /* sched_domains of this level overlap */ |
| 878 | #define SD_NUMA 0x4000 /* cross-node balancing */ | 879 | #define SD_NUMA 0x4000 /* cross-node balancing */ |
| 879 | 880 | ||
| 880 | extern int __weak arch_sd_sibiling_asym_packing(void); | 881 | #ifdef CONFIG_SCHED_SMT |
| 882 | static inline const int cpu_smt_flags(void) | ||
| 883 | { | ||
| 884 | return SD_SHARE_CPUPOWER | SD_SHARE_PKG_RESOURCES; | ||
| 885 | } | ||
| 886 | #endif | ||
| 887 | |||
| 888 | #ifdef CONFIG_SCHED_MC | ||
| 889 | static inline const int cpu_core_flags(void) | ||
| 890 | { | ||
| 891 | return SD_SHARE_PKG_RESOURCES; | ||
| 892 | } | ||
| 893 | #endif | ||
| 894 | |||
| 895 | #ifdef CONFIG_NUMA | ||
| 896 | static inline const int cpu_numa_flags(void) | ||
| 897 | { | ||
| 898 | return SD_NUMA; | ||
| 899 | } | ||
| 900 | #endif | ||
| 881 | 901 | ||
| 882 | struct sched_domain_attr { | 902 | struct sched_domain_attr { |
| 883 | int relax_domain_level; | 903 | int relax_domain_level; |
| @@ -985,6 +1005,38 @@ void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms); | |||
| 985 | 1005 | ||
| 986 | bool cpus_share_cache(int this_cpu, int that_cpu); | 1006 | bool cpus_share_cache(int this_cpu, int that_cpu); |
| 987 | 1007 | ||
| 1008 | typedef const struct cpumask *(*sched_domain_mask_f)(int cpu); | ||
| 1009 | typedef const int (*sched_domain_flags_f)(void); | ||
| 1010 | |||
| 1011 | #define SDTL_OVERLAP 0x01 | ||
| 1012 | |||
| 1013 | struct sd_data { | ||
| 1014 | struct sched_domain **__percpu sd; | ||
| 1015 | struct sched_group **__percpu sg; | ||
| 1016 | struct sched_group_power **__percpu sgp; | ||
| 1017 | }; | ||
| 1018 | |||
| 1019 | struct sched_domain_topology_level { | ||
| 1020 | sched_domain_mask_f mask; | ||
| 1021 | sched_domain_flags_f sd_flags; | ||
| 1022 | int flags; | ||
| 1023 | int numa_level; | ||
| 1024 | struct sd_data data; | ||
| 1025 | #ifdef CONFIG_SCHED_DEBUG | ||
| 1026 | char *name; | ||
| 1027 | #endif | ||
| 1028 | }; | ||
| 1029 | |||
| 1030 | extern struct sched_domain_topology_level *sched_domain_topology; | ||
| 1031 | |||
| 1032 | extern void set_sched_topology(struct sched_domain_topology_level *tl); | ||
| 1033 | |||
| 1034 | #ifdef CONFIG_SCHED_DEBUG | ||
| 1035 | # define SD_INIT_NAME(type) .name = #type | ||
| 1036 | #else | ||
| 1037 | # define SD_INIT_NAME(type) | ||
| 1038 | #endif | ||
| 1039 | |||
| 988 | #else /* CONFIG_SMP */ | 1040 | #else /* CONFIG_SMP */ |
| 989 | 1041 | ||
| 990 | struct sched_domain_attr; | 1042 | struct sched_domain_attr; |
| @@ -1123,8 +1175,8 @@ struct sched_dl_entity { | |||
| 1123 | 1175 | ||
| 1124 | /* | 1176 | /* |
| 1125 | * Original scheduling parameters. Copied here from sched_attr | 1177 | * Original scheduling parameters. Copied here from sched_attr |
| 1126 | * during sched_setscheduler2(), they will remain the same until | 1178 | * during sched_setattr(), they will remain the same until |
| 1127 | * the next sched_setscheduler2(). | 1179 | * the next sched_setattr(). |
| 1128 | */ | 1180 | */ |
| 1129 | u64 dl_runtime; /* maximum runtime for each instance */ | 1181 | u64 dl_runtime; /* maximum runtime for each instance */ |
| 1130 | u64 dl_deadline; /* relative deadline of each instance */ | 1182 | u64 dl_deadline; /* relative deadline of each instance */ |
| @@ -2723,51 +2775,9 @@ static inline int spin_needbreak(spinlock_t *lock) | |||
| 2723 | 2775 | ||
| 2724 | /* | 2776 | /* |
| 2725 | * Idle thread specific functions to determine the need_resched | 2777 | * Idle thread specific functions to determine the need_resched |
| 2726 | * polling state. We have two versions, one based on TS_POLLING in | 2778 | * polling state. |
| 2727 | * thread_info.status and one based on TIF_POLLING_NRFLAG in | ||
| 2728 | * thread_info.flags | ||
| 2729 | */ | 2779 | */ |
| 2730 | #ifdef TS_POLLING | 2780 | #ifdef TIF_POLLING_NRFLAG |
| 2731 | static inline int tsk_is_polling(struct task_struct *p) | ||
| 2732 | { | ||
| 2733 | return task_thread_info(p)->status & TS_POLLING; | ||
| 2734 | } | ||
| 2735 | static inline void __current_set_polling(void) | ||
| 2736 | { | ||
| 2737 | current_thread_info()->status |= TS_POLLING; | ||
| 2738 | } | ||
| 2739 | |||
| 2740 | static inline bool __must_check current_set_polling_and_test(void) | ||
| 2741 | { | ||
| 2742 | __current_set_polling(); | ||
| 2743 | |||
| 2744 | /* | ||
| 2745 | * Polling state must be visible before we test NEED_RESCHED, | ||
| 2746 | * paired by resched_task() | ||
| 2747 | */ | ||
| 2748 | smp_mb(); | ||
| 2749 | |||
| 2750 | return unlikely(tif_need_resched()); | ||
| 2751 | } | ||
| 2752 | |||
| 2753 | static inline void __current_clr_polling(void) | ||
| 2754 | { | ||
| 2755 | current_thread_info()->status &= ~TS_POLLING; | ||
| 2756 | } | ||
| 2757 | |||
| 2758 | static inline bool __must_check current_clr_polling_and_test(void) | ||
| 2759 | { | ||
| 2760 | __current_clr_polling(); | ||
| 2761 | |||
| 2762 | /* | ||
| 2763 | * Polling state must be visible before we test NEED_RESCHED, | ||
| 2764 | * paired by resched_task() | ||
| 2765 | */ | ||
| 2766 | smp_mb(); | ||
| 2767 | |||
| 2768 | return unlikely(tif_need_resched()); | ||
| 2769 | } | ||
| 2770 | #elif defined(TIF_POLLING_NRFLAG) | ||
| 2771 | static inline int tsk_is_polling(struct task_struct *p) | 2781 | static inline int tsk_is_polling(struct task_struct *p) |
| 2772 | { | 2782 | { |
| 2773 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); | 2783 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); |
diff --git a/include/linux/sched/prio.h b/include/linux/sched/prio.h index ac322583c820..d9cf5a5762d9 100644 --- a/include/linux/sched/prio.h +++ b/include/linux/sched/prio.h | |||
| @@ -41,4 +41,20 @@ | |||
| 41 | #define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio) | 41 | #define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio) |
| 42 | #define MAX_USER_PRIO (USER_PRIO(MAX_PRIO)) | 42 | #define MAX_USER_PRIO (USER_PRIO(MAX_PRIO)) |
| 43 | 43 | ||
| 44 | /* | ||
| 45 | * Convert nice value [19,-20] to rlimit style value [1,40]. | ||
| 46 | */ | ||
| 47 | static inline long nice_to_rlimit(long nice) | ||
| 48 | { | ||
| 49 | return (MAX_NICE - nice + 1); | ||
| 50 | } | ||
| 51 | |||
| 52 | /* | ||
| 53 | * Convert rlimit style value [1,40] to nice value [-20, 19]. | ||
| 54 | */ | ||
| 55 | static inline long rlimit_to_nice(long prio) | ||
| 56 | { | ||
| 57 | return (MAX_NICE - prio + 1); | ||
| 58 | } | ||
| 59 | |||
| 44 | #endif /* _SCHED_PRIO_H */ | 60 | #endif /* _SCHED_PRIO_H */ |
diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index fddbe2023a5d..cb0cec94fda3 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h | |||
| @@ -104,20 +104,6 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) | |||
| 104 | #define test_thread_flag(flag) \ | 104 | #define test_thread_flag(flag) \ |
| 105 | test_ti_thread_flag(current_thread_info(), flag) | 105 | test_ti_thread_flag(current_thread_info(), flag) |
| 106 | 106 | ||
| 107 | static inline __deprecated void set_need_resched(void) | ||
| 108 | { | ||
| 109 | /* | ||
| 110 | * Use of this function in deprecated. | ||
| 111 | * | ||
| 112 | * As of this writing there are only a few users in the DRM tree left | ||
| 113 | * all of which are wrong and can be removed without causing too much | ||
| 114 | * grief. | ||
| 115 | * | ||
| 116 | * The DRM people are aware and are working on removing the last few | ||
| 117 | * instances. | ||
| 118 | */ | ||
| 119 | } | ||
| 120 | |||
| 121 | #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) | 107 | #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) |
| 122 | 108 | ||
| 123 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK | 109 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK |
diff --git a/include/linux/topology.h b/include/linux/topology.h index 7062330a1329..973671ff9e7d 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
| @@ -66,121 +66,6 @@ int arch_update_cpu_topology(void); | |||
| 66 | #define PENALTY_FOR_NODE_WITH_CPUS (1) | 66 | #define PENALTY_FOR_NODE_WITH_CPUS (1) |
| 67 | #endif | 67 | #endif |
| 68 | 68 | ||
| 69 | /* | ||
| 70 | * Below are the 3 major initializers used in building sched_domains: | ||
| 71 | * SD_SIBLING_INIT, for SMT domains | ||
| 72 | * SD_CPU_INIT, for SMP domains | ||
| 73 | * | ||
| 74 | * Any architecture that cares to do any tuning to these values should do so | ||
| 75 | * by defining their own arch-specific initializer in include/asm/topology.h. | ||
| 76 | * A definition there will automagically override these default initializers | ||
| 77 | * and allow arch-specific performance tuning of sched_domains. | ||
| 78 | * (Only non-zero and non-null fields need be specified.) | ||
| 79 | */ | ||
| 80 | |||
| 81 | #ifdef CONFIG_SCHED_SMT | ||
| 82 | /* MCD - Do we really need this? It is always on if CONFIG_SCHED_SMT is, | ||
| 83 | * so can't we drop this in favor of CONFIG_SCHED_SMT? | ||
| 84 | */ | ||
| 85 | #define ARCH_HAS_SCHED_WAKE_IDLE | ||
| 86 | /* Common values for SMT siblings */ | ||
| 87 | #ifndef SD_SIBLING_INIT | ||
| 88 | #define SD_SIBLING_INIT (struct sched_domain) { \ | ||
| 89 | .min_interval = 1, \ | ||
| 90 | .max_interval = 2, \ | ||
| 91 | .busy_factor = 64, \ | ||
| 92 | .imbalance_pct = 110, \ | ||
| 93 | \ | ||
| 94 | .flags = 1*SD_LOAD_BALANCE \ | ||
| 95 | | 1*SD_BALANCE_NEWIDLE \ | ||
| 96 | | 1*SD_BALANCE_EXEC \ | ||
| 97 | | 1*SD_BALANCE_FORK \ | ||
| 98 | | 0*SD_BALANCE_WAKE \ | ||
| 99 | | 1*SD_WAKE_AFFINE \ | ||
| 100 | | 1*SD_SHARE_CPUPOWER \ | ||
| 101 | | 1*SD_SHARE_PKG_RESOURCES \ | ||
| 102 | | 0*SD_SERIALIZE \ | ||
| 103 | | 0*SD_PREFER_SIBLING \ | ||
| 104 | | arch_sd_sibling_asym_packing() \ | ||
| 105 | , \ | ||
| 106 | .last_balance = jiffies, \ | ||
| 107 | .balance_interval = 1, \ | ||
| 108 | .smt_gain = 1178, /* 15% */ \ | ||
| 109 | .max_newidle_lb_cost = 0, \ | ||
| 110 | .next_decay_max_lb_cost = jiffies, \ | ||
| 111 | } | ||
| 112 | #endif | ||
| 113 | #endif /* CONFIG_SCHED_SMT */ | ||
| 114 | |||
| 115 | #ifdef CONFIG_SCHED_MC | ||
| 116 | /* Common values for MC siblings. for now mostly derived from SD_CPU_INIT */ | ||
| 117 | #ifndef SD_MC_INIT | ||
| 118 | #define SD_MC_INIT (struct sched_domain) { \ | ||
| 119 | .min_interval = 1, \ | ||
| 120 | .max_interval = 4, \ | ||
| 121 | .busy_factor = 64, \ | ||
| 122 | .imbalance_pct = 125, \ | ||
| 123 | .cache_nice_tries = 1, \ | ||
| 124 | .busy_idx = 2, \ | ||
| 125 | .wake_idx = 0, \ | ||
| 126 | .forkexec_idx = 0, \ | ||
| 127 | \ | ||
| 128 | .flags = 1*SD_LOAD_BALANCE \ | ||
| 129 | | 1*SD_BALANCE_NEWIDLE \ | ||
| 130 | | 1*SD_BALANCE_EXEC \ | ||
| 131 | | 1*SD_BALANCE_FORK \ | ||
| 132 | | 0*SD_BALANCE_WAKE \ | ||
| 133 | | 1*SD_WAKE_AFFINE \ | ||
| 134 | | 0*SD_SHARE_CPUPOWER \ | ||
| 135 | | 1*SD_SHARE_PKG_RESOURCES \ | ||
| 136 | | 0*SD_SERIALIZE \ | ||
| 137 | , \ | ||
| 138 | .last_balance = jiffies, \ | ||
| 139 | .balance_interval = 1, \ | ||
| 140 | .max_newidle_lb_cost = 0, \ | ||
| 141 | .next_decay_max_lb_cost = jiffies, \ | ||
| 142 | } | ||
| 143 | #endif | ||
| 144 | #endif /* CONFIG_SCHED_MC */ | ||
| 145 | |||
| 146 | /* Common values for CPUs */ | ||
| 147 | #ifndef SD_CPU_INIT | ||
| 148 | #define SD_CPU_INIT (struct sched_domain) { \ | ||
| 149 | .min_interval = 1, \ | ||
| 150 | .max_interval = 4, \ | ||
| 151 | .busy_factor = 64, \ | ||
| 152 | .imbalance_pct = 125, \ | ||
| 153 | .cache_nice_tries = 1, \ | ||
| 154 | .busy_idx = 2, \ | ||
| 155 | .idle_idx = 1, \ | ||
| 156 | .newidle_idx = 0, \ | ||
| 157 | .wake_idx = 0, \ | ||
| 158 | .forkexec_idx = 0, \ | ||
| 159 | \ | ||
| 160 | .flags = 1*SD_LOAD_BALANCE \ | ||
| 161 | | 1*SD_BALANCE_NEWIDLE \ | ||
| 162 | | 1*SD_BALANCE_EXEC \ | ||
| 163 | | 1*SD_BALANCE_FORK \ | ||
| 164 | | 0*SD_BALANCE_WAKE \ | ||
| 165 | | 1*SD_WAKE_AFFINE \ | ||
| 166 | | 0*SD_SHARE_CPUPOWER \ | ||
| 167 | | 0*SD_SHARE_PKG_RESOURCES \ | ||
| 168 | | 0*SD_SERIALIZE \ | ||
| 169 | | 1*SD_PREFER_SIBLING \ | ||
| 170 | , \ | ||
| 171 | .last_balance = jiffies, \ | ||
| 172 | .balance_interval = 1, \ | ||
| 173 | .max_newidle_lb_cost = 0, \ | ||
| 174 | .next_decay_max_lb_cost = jiffies, \ | ||
| 175 | } | ||
| 176 | #endif | ||
| 177 | |||
| 178 | #ifdef CONFIG_SCHED_BOOK | ||
| 179 | #ifndef SD_BOOK_INIT | ||
| 180 | #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!! | ||
| 181 | #endif | ||
| 182 | #endif /* CONFIG_SCHED_BOOK */ | ||
| 183 | |||
| 184 | #ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID | 69 | #ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID |
| 185 | DECLARE_PER_CPU(int, numa_node); | 70 | DECLARE_PER_CPU(int, numa_node); |
| 186 | 71 | ||
| @@ -295,4 +180,17 @@ static inline int cpu_to_mem(int cpu) | |||
| 295 | #define topology_core_cpumask(cpu) cpumask_of(cpu) | 180 | #define topology_core_cpumask(cpu) cpumask_of(cpu) |
| 296 | #endif | 181 | #endif |
| 297 | 182 | ||
| 183 | #ifdef CONFIG_SCHED_SMT | ||
| 184 | static inline const struct cpumask *cpu_smt_mask(int cpu) | ||
| 185 | { | ||
| 186 | return topology_thread_cpumask(cpu); | ||
| 187 | } | ||
| 188 | #endif | ||
| 189 | |||
| 190 | static inline const struct cpumask *cpu_cpu_mask(int cpu) | ||
| 191 | { | ||
| 192 | return cpumask_of_node(cpu_to_node(cpu)); | ||
| 193 | } | ||
| 194 | |||
| 195 | |||
| 298 | #endif /* _LINUX_TOPOLOGY_H */ | 196 | #endif /* _LINUX_TOPOLOGY_H */ |
