Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 285f6722 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

[S390] smp: Merge smp_count_cpus() and smp_get_save_areas().



Merge smp_count_cpus() and smp_get_save_areas() so we save a loop over
all potentially present cpus.

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent d9f774d4
Loading
Loading
Loading
Loading
+21 −42
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
}

@@ -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);