1 #ifndef _LINUX_CPUSET_H 2 #define _LINUX_CPUSET_H 3 /* 4 * cpuset interface 5 * 6 * Copyright (C) 2003 BULL SA 7 * Copyright (C) 2004-2006 Silicon Graphics, Inc. 8 * 9 */ 10 11 #include <linux/sched.h> 12 #include <linux/cpumask.h> 13 #include <linux/nodemask.h> 14 #include <linux/cgroup.h> 15 #include <linux/mm.h> 16 17 #ifdef CONFIG_CPUSETS 18 19 extern int number_of_cpusets; /* How many cpusets are defined in system? */ 20 21 extern int cpuset_init(void); 22 extern void cpuset_init_smp(void); 23 extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); 24 extern int cpuset_cpus_allowed_fallback(struct task_struct *p); 25 extern nodemask_t cpuset_mems_allowed(struct task_struct *p); 26 #define cpuset_current_mems_allowed (current->mems_allowed) 27 void cpuset_init_current_mems_allowed(void); 28 int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask); 29 30 extern int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask); 31 extern int __cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask); 32 33 static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask) 34 { 35 return number_of_cpusets <= 1 || 36 __cpuset_node_allowed_softwall(node, gfp_mask); 37 } 38 39 static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask) 40 { 41 return number_of_cpusets <= 1 || 42 __cpuset_node_allowed_hardwall(node, gfp_mask); 43 } 44 45 static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask) 46 { 47 return cpuset_node_allowed_softwall(zone_to_nid(z), gfp_mask); 48 } 49 50 static inline int cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask) 51 { 52 return cpuset_node_allowed_hardwall(zone_to_nid(z), gfp_mask); 53 } 54 55 extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1, 56 const struct task_struct *tsk2); 57 58 #define cpuset_memory_pressure_bump() \ 59 do { \ 60 if (cpuset_memory_pressure_enabled) \ 61 __cpuset_memory_pressure_bump(); \ 62 } while (0) 63 extern int cpuset_memory_pressure_enabled; 64 extern void __cpuset_memory_pressure_bump(void); 65 66 extern const struct file_operations proc_cpuset_operations; 67 struct seq_file; 68 extern void cpuset_task_status_allowed(struct seq_file *m, 69 struct task_struct *task); 70 71 extern int cpuset_mem_spread_node(void); 72 73 static inline int cpuset_do_page_mem_spread(void) 74 { 75 return current->flags & PF_SPREAD_PAGE; 76 } 77 78 static inline int cpuset_do_slab_mem_spread(void) 79 { 80 return current->flags & PF_SPREAD_SLAB; 81 } 82 83 extern int current_cpuset_is_being_rebound(void); 84 85 extern void rebuild_sched_domains(void); 86 87 extern void cpuset_print_task_mems_allowed(struct task_struct *p); 88 89 static inline void set_mems_allowed(nodemask_t nodemask) 90 { 91 current->mems_allowed = nodemask; 92 } 93 94 #else /* !CONFIG_CPUSETS */ 95 96 static inline int cpuset_init(void) { return 0; } 97 static inline void cpuset_init_smp(void) {} 98 99 static inline void cpuset_cpus_allowed(struct task_struct *p, 100 struct cpumask *mask) 101 { 102 cpumask_copy(mask, cpu_possible_mask); 103 } 104 105 static inline int cpuset_cpus_allowed_fallback(struct task_struct *p) 106 { 107 cpumask_copy(&p->cpus_allowed, cpu_possible_mask); 108 return cpumask_any(cpu_active_mask); 109 } 110 111 static inline nodemask_t cpuset_mems_allowed(struct task_struct *p) 112 { 113 return node_possible_map; 114 } 115 116 #define cpuset_current_mems_allowed (node_states[N_HIGH_MEMORY]) 117 static inline void cpuset_init_current_mems_allowed(void) {} 118 119 static inline int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask) 120 { 121 return 1; 122 } 123 124 static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask) 125 { 126 return 1; 127 } 128 129 static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask) 130 { 131 return 1; 132 } 133 134 static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask) 135 { 136 return 1; 137 } 138 139 static inline int cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask) 140 { 141 return 1; 142 } 143 144 static inline int cpuset_mems_allowed_intersects(const struct task_struct *tsk1, 145 const struct task_struct *tsk2) 146 { 147 return 1; 148 } 149 150 static inline void cpuset_memory_pressure_bump(void) {} 151 152 static inline void cpuset_task_status_allowed(struct seq_file *m, 153 struct task_struct *task) 154 { 155 } 156 157 static inline int cpuset_mem_spread_node(void) 158 { 159 return 0; 160 } 161 162 static inline int cpuset_do_page_mem_spread(void) 163 { 164 return 0; 165 } 166 167 static inline int cpuset_do_slab_mem_spread(void) 168 { 169 return 0; 170 } 171 172 static inline int current_cpuset_is_being_rebound(void) 173 { 174 return 0; 175 } 176 177 static inline void rebuild_sched_domains(void) 178 { 179 partition_sched_domains(1, NULL, NULL); 180 } 181 182 static inline void cpuset_print_task_mems_allowed(struct task_struct *p) 183 { 184 } 185 186 static inline void set_mems_allowed(nodemask_t nodemask) 187 { 188 } 189 190 #endif /* !CONFIG_CPUSETS */ 191 192 #endif /* _LINUX_CPUSET_H */ 193