Loading arch/s390/kernel/smp.c +21 −42 Original line number Diff line number Diff line Loading @@ -410,58 +410,40 @@ EXPORT_SYMBOL(smp_ctl_clear_bit); unsigned int zfcpdump_prefix_array[NR_CPUS + 1] \ __attribute__((__section__(".data"))); static void __init smp_get_save_areas(void) static void __init smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { unsigned int cpu, cpu_num, rc; __u16 boot_cpu_addr; if (ipl_info.type != IPL_TYPE_FCP_DUMP) return; boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; cpu_num = 1; for (cpu = 0; cpu <= 65535; cpu++) { if ((u16) cpu == boot_cpu_addr) continue; __cpu_logical_map[1] = (__u16) cpu; if (signal_processor(1, sigp_sense) == sigp_not_operational) continue; if (cpu_num >= NR_CPUS) { printk("WARNING: Registers for cpu %i are not " "saved, since dump kernel was compiled with" "NR_CPUS=%i!\n", cpu_num, NR_CPUS); continue; if (cpu >= NR_CPUS) { printk(KERN_WARNING "Registers for cpu %i not saved since dump " "kernel was compiled with NR_CPUS=%i\n", cpu, NR_CPUS); return; } zfcpdump_save_areas[cpu_num] = alloc_bootmem(sizeof(union save_area)); while (1) { rc = signal_processor(1, sigp_stop_and_store_status); if (rc != sigp_busy) break; zfcpdump_save_areas[cpu] = alloc_bootmem(sizeof(union save_area)); __cpu_logical_map[1] = (__u16) phy_cpu; while (signal_processor(1, sigp_stop_and_store_status) == sigp_busy) cpu_relax(); } memcpy(zfcpdump_save_areas[cpu_num], (void *)(unsigned long) store_prefix() + SAVE_AREA_BASE, SAVE_AREA_SIZE); #ifdef __s390x__ memcpy(zfcpdump_save_areas[cpu], (void *)(unsigned long) store_prefix() + SAVE_AREA_BASE, SAVE_AREA_SIZE); #ifdef CONFIG_64BIT /* copy original prefix register */ zfcpdump_save_areas[cpu_num]->s390x.pref_reg = zfcpdump_prefix_array[cpu_num]; zfcpdump_save_areas[cpu]->s390x.pref_reg = zfcpdump_prefix_array[cpu]; #endif cpu_num++; } } union save_area *zfcpdump_save_areas[NR_CPUS + 1]; EXPORT_SYMBOL_GPL(zfcpdump_save_areas); #else #define smp_get_save_areas() do { } while (0) #endif static inline void smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { } #endif /* CONFIG_ZFCPDUMP || CONFIG_ZFCPDUMP_MODULE */ /* * Lets check how many CPUs we have. */ static unsigned int __init smp_count_cpus(void) { unsigned int cpu, num_cpus; Loading @@ -470,7 +452,6 @@ static unsigned int __init smp_count_cpus(void) /* * cpu 0 is the boot cpu. See smp_prepare_boot_cpu. */ boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; current_thread_info()->cpu = 0; num_cpus = 1; Loading @@ -480,12 +461,11 @@ static unsigned int __init smp_count_cpus(void) __cpu_logical_map[1] = (__u16) cpu; if (signal_processor(1, sigp_sense) == sigp_not_operational) continue; smp_get_save_area(num_cpus, cpu); num_cpus++; } printk("Detected %d CPU's\n", (int) num_cpus); printk("Boot cpu address %2X\n", boot_cpu_addr); return num_cpus; } Loading Loading @@ -606,7 +586,6 @@ void __init smp_setup_cpu_possible_map(void) { unsigned int phy_cpus, pos_cpus, cpu; smp_get_save_areas(); phy_cpus = smp_count_cpus(); pos_cpus = min(phy_cpus + additional_cpus, (unsigned int) NR_CPUS); Loading Loading
arch/s390/kernel/smp.c +21 −42 Original line number Diff line number Diff line Loading @@ -410,58 +410,40 @@ EXPORT_SYMBOL(smp_ctl_clear_bit); unsigned int zfcpdump_prefix_array[NR_CPUS + 1] \ __attribute__((__section__(".data"))); static void __init smp_get_save_areas(void) static void __init smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { unsigned int cpu, cpu_num, rc; __u16 boot_cpu_addr; if (ipl_info.type != IPL_TYPE_FCP_DUMP) return; boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; cpu_num = 1; for (cpu = 0; cpu <= 65535; cpu++) { if ((u16) cpu == boot_cpu_addr) continue; __cpu_logical_map[1] = (__u16) cpu; if (signal_processor(1, sigp_sense) == sigp_not_operational) continue; if (cpu_num >= NR_CPUS) { printk("WARNING: Registers for cpu %i are not " "saved, since dump kernel was compiled with" "NR_CPUS=%i!\n", cpu_num, NR_CPUS); continue; if (cpu >= NR_CPUS) { printk(KERN_WARNING "Registers for cpu %i not saved since dump " "kernel was compiled with NR_CPUS=%i\n", cpu, NR_CPUS); return; } zfcpdump_save_areas[cpu_num] = alloc_bootmem(sizeof(union save_area)); while (1) { rc = signal_processor(1, sigp_stop_and_store_status); if (rc != sigp_busy) break; zfcpdump_save_areas[cpu] = alloc_bootmem(sizeof(union save_area)); __cpu_logical_map[1] = (__u16) phy_cpu; while (signal_processor(1, sigp_stop_and_store_status) == sigp_busy) cpu_relax(); } memcpy(zfcpdump_save_areas[cpu_num], (void *)(unsigned long) store_prefix() + SAVE_AREA_BASE, SAVE_AREA_SIZE); #ifdef __s390x__ memcpy(zfcpdump_save_areas[cpu], (void *)(unsigned long) store_prefix() + SAVE_AREA_BASE, SAVE_AREA_SIZE); #ifdef CONFIG_64BIT /* copy original prefix register */ zfcpdump_save_areas[cpu_num]->s390x.pref_reg = zfcpdump_prefix_array[cpu_num]; zfcpdump_save_areas[cpu]->s390x.pref_reg = zfcpdump_prefix_array[cpu]; #endif cpu_num++; } } union save_area *zfcpdump_save_areas[NR_CPUS + 1]; EXPORT_SYMBOL_GPL(zfcpdump_save_areas); #else #define smp_get_save_areas() do { } while (0) #endif static inline void smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { } #endif /* CONFIG_ZFCPDUMP || CONFIG_ZFCPDUMP_MODULE */ /* * Lets check how many CPUs we have. */ static unsigned int __init smp_count_cpus(void) { unsigned int cpu, num_cpus; Loading @@ -470,7 +452,6 @@ static unsigned int __init smp_count_cpus(void) /* * cpu 0 is the boot cpu. See smp_prepare_boot_cpu. */ boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; current_thread_info()->cpu = 0; num_cpus = 1; Loading @@ -480,12 +461,11 @@ static unsigned int __init smp_count_cpus(void) __cpu_logical_map[1] = (__u16) cpu; if (signal_processor(1, sigp_sense) == sigp_not_operational) continue; smp_get_save_area(num_cpus, cpu); num_cpus++; } printk("Detected %d CPU's\n", (int) num_cpus); printk("Boot cpu address %2X\n", boot_cpu_addr); return num_cpus; } Loading Loading @@ -606,7 +586,6 @@ void __init smp_setup_cpu_possible_map(void) { unsigned int phy_cpus, pos_cpus, cpu; smp_get_save_areas(); phy_cpus = smp_count_cpus(); pos_cpus = min(phy_cpus + additional_cpus, (unsigned int) NR_CPUS); Loading