1 /* 2 * Copyright IBM Corp. 2007, 2011 3 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> 4 */ 5 6 #define KMSG_COMPONENT "cpu" 7 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 8 9 #include <linux/workqueue.h> 10 #include <linux/bootmem.h> 11 #include <linux/cpuset.h> 12 #include <linux/device.h> 13 #include <linux/export.h> 14 #include <linux/kernel.h> 15 #include <linux/sched.h> 16 #include <linux/sched/topology.h> 17 #include <linux/delay.h> 18 #include <linux/init.h> 19 #include <linux/slab.h> 20 #include <linux/cpu.h> 21 #include <linux/smp.h> 22 #include <linux/mm.h> 23 #include <linux/nodemask.h> 24 #include <linux/node.h> 25 #include <asm/sysinfo.h> 26 #include <asm/numa.h> 27 28 #define PTF_HORIZONTAL (0UL) 29 #define PTF_VERTICAL (1UL) 30 #define PTF_CHECK (2UL) 31 32 struct mask_info { 33 struct mask_info *next; 34 unsigned char id; 35 cpumask_t mask; 36 }; 37 38 static void set_topology_timer(void); 39 static void topology_work_fn(struct work_struct *work); 40 static struct sysinfo_15_1_x *tl_info; 41 42 static DECLARE_WORK(topology_work, topology_work_fn); 43 44 /* 45 * Socket/Book linked lists and cpu_topology updates are 46 * protected by "sched_domains_mutex". 47 */ 48 static struct mask_info socket_info; 49 static struct mask_info book_info; 50 static struct mask_info drawer_info; 51 52 struct cpu_topology_s390 cpu_topology[NR_CPUS]; 53 EXPORT_SYMBOL_GPL(cpu_topology); 54 55 cpumask_t cpus_with_topology; 56 57 static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu) 58 { 59 cpumask_t mask; 60 61 cpumask_copy(&mask, cpumask_of(cpu)); 62 if (!MACHINE_HAS_TOPOLOGY) 63 return mask; 64 for (; info; info = info->next) { 65 if (cpumask_test_cpu(cpu, &info->mask)) 66 return info->mask; 67 } 68 return mask; 69 } 70 71 static cpumask_t cpu_thread_map(unsigned int cpu) 72 { 73 cpumask_t mask; 74 int i; 75 76 cpumask_copy(&mask, cpumask_of(cpu)); 77 if (!MACHINE_HAS_TOPOLOGY) 78 return mask; 79 cpu -= cpu % (smp_cpu_mtid + 1); 80 for (i = 0; i <= smp_cpu_mtid; i++) 81 if (cpu_present(cpu + i)) 82 cpumask_set_cpu(cpu + i, &mask); 83 return mask; 84 } 85 86 static void add_cpus_to_mask(struct topology_core *tl_core, 87 struct mask_info *drawer, 88 struct mask_info *book, 89 struct mask_info *socket) 90 { 91 struct cpu_topology_s390 *topo; 92 unsigned int core; 93 94 for_each_set_bit(core, &tl_core->mask[0], TOPOLOGY_CORE_BITS) { 95 unsigned int rcore; 96 int lcpu, i; 97 98 rcore = TOPOLOGY_CORE_BITS - 1 - core + tl_core->origin; 99 lcpu = smp_find_processor_id(rcore << smp_cpu_mt_shift); 100 if (lcpu < 0) 101 continue; 102 for (i = 0; i <= smp_cpu_mtid; i++) { 103 topo = &cpu_topology[lcpu + i]; 104 topo->drawer_id = drawer->id; 105 topo->book_id = book->id; 106 topo->socket_id = socket->id; 107 topo->core_id = rcore; 108 topo->thread_id = lcpu + i; 109 cpumask_set_cpu(lcpu + i, &drawer->mask); 110 cpumask_set_cpu(lcpu + i, &book->mask); 111 cpumask_set_cpu(lcpu + i, &socket->mask); 112 cpumask_set_cpu(lcpu + i, &cpus_with_topology); 113 smp_cpu_set_polarization(lcpu + i, tl_core->pp); 114 } 115 } 116 } 117 118 static void clear_masks(void) 119 { 120 struct mask_info *info; 121 122 info = &socket_info; 123 while (info) { 124 cpumask_clear(&info->mask); 125 info = info->next; 126 } 127 info = &book_info; 128 while (info) { 129 cpumask_clear(&info->mask); 130 info = info->next; 131 } 132 info = &drawer_info; 133 while (info) { 134 cpumask_clear(&info->mask); 135 info = info->next; 136 } 137 } 138 139 static union topology_entry *next_tle(union topology_entry *tle) 140 { 141 if (!tle->nl) 142 return (union topology_entry *)((struct topology_core *)tle + 1); 143 return (union topology_entry *)((struct topology_container *)tle + 1); 144 } 145 146 static void tl_to_masks(struct sysinfo_15_1_x *info) 147 { 148 struct mask_info *socket = &socket_info; 149 struct mask_info *book = &book_info; 150 struct mask_info *drawer = &drawer_info; 151 union topology_entry *tle, *end; 152 153 clear_masks(); 154 tle = info->tle; 155 end = (union topology_entry *)((unsigned long)info + info->length); 156 while (tle < end) { 157 switch (tle->nl) { 158 case 3: 159 drawer = drawer->next; 160 drawer->id = tle->container.id; 161 break; 162 case 2: 163 book = book->next; 164 book->id = tle->container.id; 165 break; 166 case 1: 167 socket = socket->next; 168 socket->id = tle->container.id; 169 break; 170 case 0: 171 add_cpus_to_mask(&tle->cpu, drawer, book, socket); 172 break; 173 default: 174 clear_masks(); 175 return; 176 } 177 tle = next_tle(tle); 178 } 179 } 180 181 static void topology_update_polarization_simple(void) 182 { 183 int cpu; 184 185 mutex_lock(&smp_cpu_state_mutex); 186 for_each_possible_cpu(cpu) 187 smp_cpu_set_polarization(cpu, POLARIZATION_HRZ); 188 mutex_unlock(&smp_cpu_state_mutex); 189 } 190 191 static int ptf(unsigned long fc) 192 { 193 int rc; 194 195 asm volatile( 196 " .insn rre,0xb9a20000,%1,%1\n" 197 " ipm %0\n" 198 " srl %0,28\n" 199 : "=d" (rc) 200 : "d" (fc) : "cc"); 201 return rc; 202 } 203 204 int topology_set_cpu_management(int fc) 205 { 206 int cpu, rc; 207 208 if (!MACHINE_HAS_TOPOLOGY) 209 return -EOPNOTSUPP; 210 if (fc) 211 rc = ptf(PTF_VERTICAL); 212 else 213 rc = ptf(PTF_HORIZONTAL); 214 if (rc) 215 return -EBUSY; 216 for_each_possible_cpu(cpu) 217 smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN); 218 return rc; 219 } 220 221 static void update_cpu_masks(void) 222 { 223 struct cpu_topology_s390 *topo; 224 int cpu; 225 226 for_each_possible_cpu(cpu) { 227 topo = &cpu_topology[cpu]; 228 topo->thread_mask = cpu_thread_map(cpu); 229 topo->core_mask = cpu_group_map(&socket_info, cpu); 230 topo->book_mask = cpu_group_map(&book_info, cpu); 231 topo->drawer_mask = cpu_group_map(&drawer_info, cpu); 232 if (!MACHINE_HAS_TOPOLOGY) { 233 topo->thread_id = cpu; 234 topo->core_id = cpu; 235 topo->socket_id = cpu; 236 topo->book_id = cpu; 237 topo->drawer_id = cpu; 238 if (cpu_present(cpu)) 239 cpumask_set_cpu(cpu, &cpus_with_topology); 240 } 241 } 242 numa_update_cpu_topology(); 243 } 244 245 void store_topology(struct sysinfo_15_1_x *info) 246 { 247 stsi(info, 15, 1, min(topology_max_mnest, 4)); 248 } 249 250 static int __arch_update_cpu_topology(void) 251 { 252 struct sysinfo_15_1_x *info = tl_info; 253 int rc = 0; 254 255 cpumask_clear(&cpus_with_topology); 256 if (MACHINE_HAS_TOPOLOGY) { 257 rc = 1; 258 store_topology(info); 259 tl_to_masks(info); 260 } 261 update_cpu_masks(); 262 if (!MACHINE_HAS_TOPOLOGY) 263 topology_update_polarization_simple(); 264 return rc; 265 } 266 267 int arch_update_cpu_topology(void) 268 { 269 struct device *dev; 270 int cpu, rc; 271 272 rc = __arch_update_cpu_topology(); 273 for_each_online_cpu(cpu) { 274 dev = get_cpu_device(cpu); 275 kobject_uevent(&dev->kobj, KOBJ_CHANGE); 276 } 277 return rc; 278 } 279 280 static void topology_work_fn(struct work_struct *work) 281 { 282 rebuild_sched_domains(); 283 } 284 285 void topology_schedule_update(void) 286 { 287 schedule_work(&topology_work); 288 } 289 290 static void topology_timer_fn(unsigned long ignored) 291 { 292 if (ptf(PTF_CHECK)) 293 topology_schedule_update(); 294 set_topology_timer(); 295 } 296 297 static struct timer_list topology_timer = 298 TIMER_DEFERRED_INITIALIZER(topology_timer_fn, 0, 0); 299 300 static atomic_t topology_poll = ATOMIC_INIT(0); 301 302 static void set_topology_timer(void) 303 { 304 if (atomic_add_unless(&topology_poll, -1, 0)) 305 mod_timer(&topology_timer, jiffies + HZ / 10); 306 else 307 mod_timer(&topology_timer, jiffies + HZ * 60); 308 } 309 310 void topology_expect_change(void) 311 { 312 if (!MACHINE_HAS_TOPOLOGY) 313 return; 314 /* This is racy, but it doesn't matter since it is just a heuristic. 315 * Worst case is that we poll in a higher frequency for a bit longer. 316 */ 317 if (atomic_read(&topology_poll) > 60) 318 return; 319 atomic_add(60, &topology_poll); 320 set_topology_timer(); 321 } 322 323 static int cpu_management; 324 325 static ssize_t dispatching_show(struct device *dev, 326 struct device_attribute *attr, 327 char *buf) 328 { 329 ssize_t count; 330 331 mutex_lock(&smp_cpu_state_mutex); 332 count = sprintf(buf, "%d\n", cpu_management); 333 mutex_unlock(&smp_cpu_state_mutex); 334 return count; 335 } 336 337 static ssize_t dispatching_store(struct device *dev, 338 struct device_attribute *attr, 339 const char *buf, 340 size_t count) 341 { 342 int val, rc; 343 char delim; 344 345 if (sscanf(buf, "%d %c", &val, &delim) != 1) 346 return -EINVAL; 347 if (val != 0 && val != 1) 348 return -EINVAL; 349 rc = 0; 350 get_online_cpus(); 351 mutex_lock(&smp_cpu_state_mutex); 352 if (cpu_management == val) 353 goto out; 354 rc = topology_set_cpu_management(val); 355 if (rc) 356 goto out; 357 cpu_management = val; 358 topology_expect_change(); 359 out: 360 mutex_unlock(&smp_cpu_state_mutex); 361 put_online_cpus(); 362 return rc ? rc : count; 363 } 364 static DEVICE_ATTR(dispatching, 0644, dispatching_show, 365 dispatching_store); 366 367 static ssize_t cpu_polarization_show(struct device *dev, 368 struct device_attribute *attr, char *buf) 369 { 370 int cpu = dev->id; 371 ssize_t count; 372 373 mutex_lock(&smp_cpu_state_mutex); 374 switch (smp_cpu_get_polarization(cpu)) { 375 case POLARIZATION_HRZ: 376 count = sprintf(buf, "horizontal\n"); 377 break; 378 case POLARIZATION_VL: 379 count = sprintf(buf, "vertical:low\n"); 380 break; 381 case POLARIZATION_VM: 382 count = sprintf(buf, "vertical:medium\n"); 383 break; 384 case POLARIZATION_VH: 385 count = sprintf(buf, "vertical:high\n"); 386 break; 387 default: 388 count = sprintf(buf, "unknown\n"); 389 break; 390 } 391 mutex_unlock(&smp_cpu_state_mutex); 392 return count; 393 } 394 static DEVICE_ATTR(polarization, 0444, cpu_polarization_show, NULL); 395 396 static struct attribute *topology_cpu_attrs[] = { 397 &dev_attr_polarization.attr, 398 NULL, 399 }; 400 401 static struct attribute_group topology_cpu_attr_group = { 402 .attrs = topology_cpu_attrs, 403 }; 404 405 int topology_cpu_init(struct cpu *cpu) 406 { 407 return sysfs_create_group(&cpu->dev.kobj, &topology_cpu_attr_group); 408 } 409 410 static const struct cpumask *cpu_thread_mask(int cpu) 411 { 412 return &cpu_topology[cpu].thread_mask; 413 } 414 415 416 const struct cpumask *cpu_coregroup_mask(int cpu) 417 { 418 return &cpu_topology[cpu].core_mask; 419 } 420 421 static const struct cpumask *cpu_book_mask(int cpu) 422 { 423 return &cpu_topology[cpu].book_mask; 424 } 425 426 static const struct cpumask *cpu_drawer_mask(int cpu) 427 { 428 return &cpu_topology[cpu].drawer_mask; 429 } 430 431 static struct sched_domain_topology_level s390_topology[] = { 432 { cpu_thread_mask, cpu_smt_flags, SD_INIT_NAME(SMT) }, 433 { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, 434 { cpu_book_mask, SD_INIT_NAME(BOOK) }, 435 { cpu_drawer_mask, SD_INIT_NAME(DRAWER) }, 436 { cpu_cpu_mask, SD_INIT_NAME(DIE) }, 437 { NULL, }, 438 }; 439 440 static void __init alloc_masks(struct sysinfo_15_1_x *info, 441 struct mask_info *mask, int offset) 442 { 443 int i, nr_masks; 444 445 nr_masks = info->mag[TOPOLOGY_NR_MAG - offset]; 446 for (i = 0; i < info->mnest - offset; i++) 447 nr_masks *= info->mag[TOPOLOGY_NR_MAG - offset - 1 - i]; 448 nr_masks = max(nr_masks, 1); 449 for (i = 0; i < nr_masks; i++) { 450 mask->next = memblock_virt_alloc(sizeof(*mask->next), 8); 451 mask = mask->next; 452 } 453 } 454 455 void __init topology_init_early(void) 456 { 457 struct sysinfo_15_1_x *info; 458 459 set_sched_topology(s390_topology); 460 if (!MACHINE_HAS_TOPOLOGY) 461 goto out; 462 tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE); 463 info = tl_info; 464 store_topology(info); 465 pr_info("The CPU configuration topology of the machine is: %d %d %d %d %d %d / %d\n", 466 info->mag[0], info->mag[1], info->mag[2], info->mag[3], 467 info->mag[4], info->mag[5], info->mnest); 468 alloc_masks(info, &socket_info, 1); 469 alloc_masks(info, &book_info, 2); 470 alloc_masks(info, &drawer_info, 3); 471 out: 472 __arch_update_cpu_topology(); 473 } 474 475 static int __init topology_init(void) 476 { 477 if (MACHINE_HAS_TOPOLOGY) 478 set_topology_timer(); 479 else 480 topology_update_polarization_simple(); 481 return device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching); 482 } 483 device_initcall(topology_init); 484