static void __init smp_detect_cpus(void) { unsigned int cpu, c_cpus, s_cpus; struct sclp_cpu_info *info; u16 boot_cpu_addr, cpu_addr; c_cpus = 1; s_cpus = 0; boot_cpu_addr = __cpu_logical_map[0]; info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) panic("smp_detect_cpus failed to allocate memory\n"); /* Use sigp detection algorithm if sclp doesn't work. */ if (sclp_get_cpu_info(info)) { smp_use_sigp_detection = 1; for (cpu = 0; cpu <= MAX_CPU_ADDRESS; cpu++) { if (cpu == boot_cpu_addr) continue; if (!raw_cpu_stopped(cpu)) continue; smp_get_save_area(c_cpus, cpu); c_cpus++; } goto out; } if (info->has_cpu_type) { for (cpu = 0; cpu < info->combined; cpu++) { if (info->cpu[cpu].address == boot_cpu_addr) { smp_cpu_type = info->cpu[cpu].type; break; } } } for (cpu = 0; cpu < info->combined; cpu++) { if (info->has_cpu_type && info->cpu[cpu].type != smp_cpu_type) continue; cpu_addr = info->cpu[cpu].address; if (cpu_addr == boot_cpu_addr) continue; if (!raw_cpu_stopped(cpu_addr)) { s_cpus++; continue; } smp_get_save_area(c_cpus, cpu_addr); c_cpus++; } out: kfree(info); pr_info("%d configured CPUs, %d standby CPUs\n", c_cpus, s_cpus); get_online_cpus(); __smp_rescan_cpus(); put_online_cpus(); }
static void __init smp_detect_cpus(void) { unsigned int cpu, c_cpus, s_cpus; struct sclp_cpu_info *info; u16 boot_cpu_addr, cpu_addr; c_cpus = 1; s_cpus = 0; boot_cpu_addr = __cpu_logical_map[0]; info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) panic("smp_detect_cpus failed to allocate memory\n"); #ifdef CONFIG_CRASH_DUMP if (OLDMEM_BASE && !is_kdump_kernel()) { struct save_area *save_area; save_area = kmalloc(sizeof(*save_area), GFP_KERNEL); if (!save_area) panic("could not allocate memory for save area\n"); copy_oldmem_page(1, (void *) save_area, sizeof(*save_area), 0x200, 0); zfcpdump_save_areas[0] = save_area; } #endif /* Use sigp detection algorithm if sclp doesn't work. */ if (sclp_get_cpu_info(info)) { smp_use_sigp_detection = 1; for (cpu = 0; cpu <= MAX_CPU_ADDRESS; cpu++) { if (cpu == boot_cpu_addr) continue; if (!raw_cpu_stopped(cpu)) continue; smp_get_save_area(c_cpus, cpu); c_cpus++; } goto out; } if (info->has_cpu_type) { for (cpu = 0; cpu < info->combined; cpu++) { if (info->cpu[cpu].address == boot_cpu_addr) { smp_cpu_type = info->cpu[cpu].type; break; } } } for (cpu = 0; cpu < info->combined; cpu++) { if (info->has_cpu_type && info->cpu[cpu].type != smp_cpu_type) continue; cpu_addr = info->cpu[cpu].address; if (cpu_addr == boot_cpu_addr) continue; if (!raw_cpu_stopped(cpu_addr)) { s_cpus++; continue; } smp_get_save_area(c_cpus, cpu_addr); c_cpus++; } out: kfree(info); pr_info("%d configured CPUs, %d standby CPUs\n", c_cpus, s_cpus); get_online_cpus(); __smp_rescan_cpus(); put_online_cpus(); }